Jump to content
Compvision.ru

Search the Community

Showing results for tags 'преобразование хафа'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Пакет OpenCV
    • OpenCV
    • Новости
    • Вопросы взаимодействия OpenCV + GDI, GDI+
  • Дополненная реальность (ARToolkit и др.)
    • ARToolkit
  • Нейросети
    • Вопросы по нейросетям и ИИ
  • Общие вопросы
    • Обсуждение общих вопросов
  • Другое

Jabber


Skype


Расположение


Интересы

Found 2 results

  1. Доброе время суток! Необходимо распознать автомобильный номер на изображении, для увеличения точности решил трансформировать номер так, будто камера смотрит прямо на него. Для выполнения задачи решил найти верхнюю и левую линии, и из них рассчитать углы, но столкнулся с проблемой. Метод CvInv oke.HoughLines находит большое количество линий, но даже при увеличении порога правильная линия попадается редко. Написал аналог данного метода C# но для поиска только самой явной линии, однако он страдает той же проблемой. Разница где то в 15 градусов, если "докинуть" их вручную выходит почти правильно. За основу алгоритма был взят CvInv oke.HoughLines, сам метод: public static unsafe LineSegment2D FindBestLineD(Mat input, double minTheta, double maxTheta, double theta, int rho) { int width = input.Width; int height = input.Height; int max_rho = (int)Math.Sqrt(width * width + height * height); int min_rho = -max_rho; int thetaCount = (int)((maxTheta - minTheta) / theta); int rhoCount = (int)(((max_rho - min_rho) + 1) / rho); double[] thetaArr = new double[thetaCount]; double tmp = minTheta; double[] sinTheta = new double[thetaCount]; double[] cosTheta = new double[thetaCount]; for (int i = 0; i < thetaCount; i++) { thetaArr = tmp; sinTheta = Math.Sin(tmp); cosTheta = Math.Cos(tmp); tmp += theta; } int[,] accum = new int[rhoCount, thetaCount]; Bitmap bitmap = input.Bitmap; BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat); byte* Pixels = (byte*)bitmapData.Scan0.ToPointer(); int stride = bitmapData.Stride; int shift = 0; for (int h = 0; h < height; h++) { shift = stride * h; for (int w = 0; w < width; w++) { if (Pixels[shift + w] != 0) { for (int i = 0; i < thetaCount; i++) { int r = (int)(h * sinTheta + w * cosTheta); r += rhoCount / 2; accum[r, i]++; } } } } bitmap.UnlockBits(bitmapData); int MaxValue = 0; int BestRho = 0; double BestTheta = 0; for (int t = 0; t < thetaArr.Length; t++) { for (int r = 0; r < rhoCount; r++) { if (accum[r, t] > MaxValue) { MaxValue = accum[r, t]; BestTheta = thetaArr[t]; BestRho = r - rhoCount / 2; } } } //BestTheta += theta * 15; var pt1 = new Point(); var pt2 = new Point(); var a = Math.Cos(BestTheta); var b = Math.Sin(BestTheta); var x0 = a * BestRho; var y0 = b * BestRho; pt1.X = (int)Math.Round(x0 + input.Width * (-b)); pt1.Y = (int)Math.Round(y0 + input.Height * (a)); pt2.X = (int)Math.Round(x0 - input.Width * (-b)); pt2.Y = (int)Math.Round(y0 - input.Height * (a)); return new LineSegment2D(pt1, pt2); } Если бы проблема была только с ним, продолжал бы сам искать ошибку, но предложенный в библиотеке вариант тоже "недокручивает" градусы. Есть ли у кого предположение с чем может быть связан данный феномен, может ли быть тому причиной малый размер изображения (ширина до 200 px )? Или может существуют более удобные решения данной проблемы, при условии что быстродействие является критичным?
  2. Здравствуйте, форумчане! Прошу помочь с такой задачей- из данного изображения выделить только номер, т.е только эту самую белую область с буквами Вот что у меня получилось: сделал программку на C#, она ищет на изображении номер автомобиля через каскад Хаара и выдаёт его в окне. Далее нужно оставить на изображении только номер, без каких либо областей вокруг, причем номер может быть повёрнут на некоторый угол. Поискав по интернету я понял что для этого используется преобразование Хафа. Взяв из примеров EmguCV(ShapeDetection) код для линий Хафа и прямоугольников я подставил его в свою программу, но столкнулся с такими проблемами: 1) в случае линий - их слишком много, а прямоугольники оно находит только идеально прямые; 2) на некоторых, казалось бы, хороших изображениях даже линии определяются неверно. Перед передачей изображения для нахождения линий Хафа его можно подвергнуть операции бинаризации. Некоторая проблема для меня в том, что после бинаризации линий находит куда больше(изображение 2, с ВАЗ 2112) чем без бинаризации(изображение 1, Лада Гранта), с параметрами cvAdaptiveThreshold игрался, но результата так и не получил. Т.е линий все равно много и я не пойму как оставить такие, по которым можно было бы обрезать изображение. Подскажите, пожалуйста, что можно сделать для выделения главных горизонтальных и вертикальных линий и обрезки по ним изображения. В прикреплениях есть код формы. Выглядит, думаю, плохо, но пока только такой есть upd1. Добавочка. Hайти в конченом счете нужно буквы и цифры номера. Нашел в литературе употребление функции findContours для таких целей, скоро попробую. Form1csTXT.zip
×