Подтвердить что ты не робот

Обнаружение объекта OpenCV - центральная точка

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

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

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

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

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

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

4b9b3361

Ответ 1

Уже существует пример того, как делать обнаружение прямоугольников в 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}

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

Ответ 2

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

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;
}

Ответ 3

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

Некоторые методы получения того, что вы хотите:

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

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

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

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

Ответ 4

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