Обнаружение различной формы динамически, как (круг, квадрат и прямоугольник) с камеры?

Я хочу создать приложение для определения формы объектов, таких как (только круглые, квадратные и прямоугольные геометрические фигуры), которые не должны использоваться Маркер меньше или Основанный на краях способ обнаружения формы в дополнении.

Я использовал следующие вещи для этого, например, прошел процедуры учебника, которые уже существуют там в metaio sdk

1) Metaio: http://dev.metaio.com/sdk/tutorials/hello-world/

2) OpenCV: http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html#canny-detector

это то, что я пытался реализовать.

Геометрия: 1) Кругом в реальном времени может быть любой круглый объект → enter image description here

2) Квадрат в реальном времени может быть любым квадратным объектом → enter image description here

3) Прямоугольник в реальном времени может быть любым объектом прямоугольника → enter image description here

Как я могу достичь этого сценария увеличения.

Заранее спасибо

Ответ 1

Обновление: Этот пост StackOverflow (с некоторыми хорошими образцовыми изображениями включен), похоже, решил обнаружение кругов - часть вашей проблемы на наименее. Ссылка на отличную рецензию, на которую он указывает, можно найти на этой странице wiki page (только к сожалению, к сожалению, кэш-машина).

В случае, если новая ссылка также не сохраняется, вот соответствующий раздел:

Обнаружение изображений:

Есть несколько фрагментов, которые нужно позаботиться, чтобы обнаружить круги в изображении. Прежде чем обрабатывать изображение с помощью cvHoughCircles - функции для обнаружения круга, вы можете сначала преобразовать его в серое изображение и сгладить его. Ниже приведена общая процедура функций, которые вам нужно использовать с примерами их использования.

Создать изображение

Предположим, что у вас есть начальное изображение для обработки с именем "img", сначала вы хотите создать переменную изображения с именем "серый" с теми же размерами, что и img, используя cvCreateImage.

IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 ); 
                 // allocate a 1 channel byte image

CvMemStorage* storage = cvCreateMemStorage(0);


IplImage* cvCreateImage(CvSize size, int depth, int channels);

  size:  cvSize(width,height);

  depth: pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
    IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F

  channels: Number of channels per pixel. Can be 1, 2, 3 or 4. The channels 
    are interleaved. The usual data layout of a color image is
    b0 g0 r0 b1 g1 r1 ...

Преобразовать в серый

Теперь вам нужно преобразовать его в серый, используя cvCvtColor, который преобразует цветовые пространства.

cvCvtColor( img, gray, CV_BGR2GRAY );

cvCvtColor(src,dst,code); // src -> dst

  code    = CV_<X>2<Y>
  <X>/<Y> = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS

e.g.: CV_BGR2GRAY, CV_BGR2HSV, CV_BGR2Lab

Гладкое изображение

Это делается для предотвращения обнаружения множества ложных кругов. Возможно, вам придется поиграть с двумя последними параметрами, отметив, что им нужно умножить на нечетное число.

cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 ); 
// smooth it, otherwise a lot of false circles may be detected

void cvSmooth( const CvArr* src, CvArr* dst,
               int smoothtype=CV_GAUSSIAN,
               int param1, int param2);

ЦСИ

  • Исходное изображение.

Dst

  • Изображение назначения.

smoothtype

Тип сглаживания:

  • CV_BLUR_NO_SCALE (простое размытие без масштабирования) - суммирование по пикселю param1 × param2. Если размер окрестности не фиксирован, можно использовать функцию cvIntegral.
  • CV_BLUR (простое размытие) - суммирование по пиксельной param1 × param2 с последующим масштабированием на 1/(param1 • param2).
  • CV_GAUSSIAN (гауссовское размытие) - свертка изображения с параметром param2 × param2 гауссова.
  • CV_MEDIAN (медианное размытие) - поиск медианы окрестности param1 × param1 (т.е. окрестность является квадратной).
  • CV_BILATERAL (двусторонний фильтр) - применение двусторонней фильтрации 3x3 с color sigma=param1 и space sigma=param2

param1

  • Первый параметр сглаживания.

param2

  • Второй параметр операции сглаживания.

В случае простого масштабированного/немасштабированного и гауссовского размытия, если param2 равно нулю, оно устанавливается на param1

Обнаружение с использованием Hough Circle

Функция cvHoughCircles используется для обнаружения кругов на сером изображении. Опять же, последние два параметра, возможно, придется прокручивать с помощью.

CvSeq* circles = 
 cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100 );


CvSeq* cvHoughCircles( CvArr* image, void* circle_storage,
                       int method, double dp, double min_dist,
                       double param1=100, double param2=100,
                       int min_radius=0, int max_radius=0 );

======= Конец соответствующего раздела =========

Остальная часть этой вики-страницы на самом деле очень хорошая (хотя, я не собираюсь ее переписывать, так как остальная часть не относится к исходному вопросу, а StackOverflow имеет ограничение по размеру ответов). Надеемся, что ссылка к кешированной копии на машине Wayback будет продолжать работать бесконечно.

Предыдущий ответ перед моим обновлением:

Отлично! Теперь, когда вы разместили несколько примеров, я вижу, что вы не только после прямоугольников, прямоугольников и кругов, вы также хотите найти эти фигуры в 3D-среде, тем самым потенциально охотясь за специальными случаями параллелограммов и овалов, которые из видео кадр к кадру видео может в конечном итоге проявить себя как прямоугольники, квадраты и/или круги (в зависимости от того, как вы снимаете камеру).

Лично мне легче работать с проблемой самостоятельно, чем пытаться понять, как использовать существующую (часто очень зрелую) библиотеку. Это не значит, что моя собственная работа будет лучше, чем зрелая библиотека, этого, безусловно, не будет. Просто после того, как я смогу справиться с проблемой, мне становится легче понять и использовать библиотеку (сама библиотека, которая будет работать быстрее и умнее моего собственного решения).

Итак, следующим шагом я бы хотел изменить цветовое пространство растрового изображения в оттенки серого. Цветное растровое изображение, у меня проблемы с пониманием, и у меня проблемы с манипулированием, тем более, что существует так много разных способов его отображения, но гранатовое изображение в градациях серого, которое гораздо легче понять и манипулировать. Для растрового изображения в градациях серого просто представьте себе сетку значений, каждое значение представляющее различную интенсивность света.

И теперь ограничьте область проблемы поиском параллелограммов и овалов внутри статической 2D-среды (мы будем беспокоиться о том, как обрабатывать 3D-среды и перемещать видеофрагменты позже, или, если можно так выразиться, вы будете беспокоиться об этом часть сама, так как эта проблема уже слишком усложняется для меня).

И теперь также не беспокойтесь о том, какой инструмент или язык вы используете. Просто используйте все самое легкое и самое быстрое. Например, практически все может быть написано для автоматического преобразования изображения в оттенки серого, предполагая, что время не является проблемой. ImageMagick, Gimp, Marvin, Processing, Python, Ruby, Java и т.д.

И с помощью любого из этих инструментов должно быть легко группировать пиксели с одинаковой достаточной интенсивностью (чтобы сделать вычисления более управляемыми) и сортировать каждую координату пикселя в другом массиве для каждого ведра интенсивности света. Другими словами, не должно быть слишком сложно организовать какую-то грубую гистограмму массивов, отсортированных по интенсивности, которые содержат каждую позицию x и y пикселя.

После этого проблема становится проблемой, более похожей на на эту (которая может быть найдена на StackOverflow) и, таким образом, может быть обработана с помощью предлагаемого решения.

И как только вы сможете решить проблему таким образом, преобразование решения, которое вы придумали для лучшего языка, подходящего для задачи, не должно быть слишком сложным. И это должно быть намного проще также понять и использовать основную функцию любой существующей библиотеки, которую вы окончательно выбираете для задачи. По крайней мере, это то, на что я надеюсь, поскольку я недостаточно осведомлен, и я не могу помочь вам в самих библиотеках OpenCV.