Обнаружение объектов OpenCV - Центральная точка - PullRequest
33 голосов
/ 11 ноября 2008

Учитывая объект на простом белом фоне, кто-нибудь знает, предоставляет ли OpenCV функциональность для легкого обнаружения объекта из захваченного кадра?

Я пытаюсь найти угловые / центральные точки объекта (прямоугольник). То, как я в настоящее время делаю это, грубой силой (сканируя изображение на предмет) и не точным. Мне интересно, есть ли под капотом функциональность, о которой я не знаю.

Изменить сведения : Размер примерно такой же, как у маленькой банки с газировкой. Камера расположена над объектом, чтобы дать ему ощущение 2D / прямоугольника. Ориентация / угол от камеры является случайной, которая рассчитывается из угловых точек.

Это просто белый фон с объектом (черный). Качество снимка примерно соответствует тому, что вы ожидаете увидеть от веб-камеры Logitech.

Как только я получу угловые точки, я вычисляю центр. Центральная точка затем преобразуется в сантиметры.

Это то, на чем я пытаюсь сосредоточиться, это уточнение того, «как» я получаю эти 4 угла. Вы можете увидеть мой метод грубой силы с этим изображением: Изображение

Ответы [ 4 ]

26 голосов
/ 26 ноября 2008

Уже есть пример того, как сделать обнаружение прямоугольника в OpenCV (см. Samples / squares.c), и на самом деле это довольно просто.

Вот примерный алгоритм, который они используют:

0. rectangles <- {}
1. image <- load image
2. for every channel:
2.1  image_canny <- apply canny edge detector to this channel
2.2  for threshold in bunch_of_increasing_thresholds:
2.2.1   image_thresholds[threshold] <- apply threshold to this channel
2.3  for each contour found in {image_canny} U image_thresholds:
2.3.1   Approximate contour with polygons
2.3.2   if the approximation has four corners and the angles are close to 90 degrees.
2.3.2.1    rectangles <- rectangles U {contour}

Не точная транслитерация того, что они делают, но это должно вам помочь.

7 голосов
/ 26 сентября 2012

Надеюсь, это поможет, используя метод момента, чтобы получить центроид черно-белого изображения.

cv::Point getCentroid(cv::Mat img)
{
    cv::Point Coord;
    cv::Moments mm = cv::moments(img,false);
    double moment10 = mm.m10;
    double moment01 = mm.m01;
    double moment00 = mm.m00;
    Coord.x = int(moment10 / moment00);
    Coord.y = int(moment01 / moment00);
    return Coord;
}
4 голосов
/ 11 ноября 2008

OpenCV имеет множество функций, которые могут помочь вам достичь этого. Загрузите Emgu.CV для C # .NET, обернутого в библиотеку, если вы программируете на этом языке.

Некоторые способы получить то, что вы хотите:

  1. Найдите углы, как раньше - например, Функция "CornerHarris" OpenCV

  2. Пороговое изображение и вычисление центра тяжести - см. http://www.roborealm.com/help/Center%20of%20Gravity.php ... это метод, который я бы использовал. Вы даже можете выполнить пороговое значение в рутине COG. то есть cog_x + = * imagePtr <128? 255: 0; </p>

  3. Найдите моменты изображения, чтобы дать вращение, центр тяжести и т. Д. - например, Функция «Моменты» OpenCV. (Я этим не пользовался)

  4. (редактировать) Библиотека AForge.NET имеет функции обнаружения углов, а также пример проекта (MotionDetector) и библиотеки для подключения к веб-камерам. Я думаю, что это будет самый простой способ, если вы используете Windows и .NET.

0 голосов
/ 11 ноября 2008

Обычно это называется анализом BLOB-объектов в других библиотеках машинного зрения. Я еще не использовал opencv.

...