Обнаружение объектов с помощью обычной веб-камеры - PullRequest
0 голосов
/ 10 марта 2011

Вот моя задача, которую я хочу решить с минимальными усилиями (желательно с QT & C ++ или Java): я хочу использовать видеовход с веб-камеры, чтобы определить, есть ли (или более) ящик (и)объектив камеры или нет.Сцена может измениться с «чистого» на «перед объективом есть ящик» и обратно, пока камера передает свой видеосигнал в мое приложение.Для тестирования / изучения прототипа у меня есть 2-3 изображения «пустой» сцены и 2-3 изображения с одним или несколькими ящиками.

Вы знаете простую идею, как решить эту задачу?Я обнаружил OpenCV, но разве этот фреймворк не слишком громоздкий для этой простой задачи?Я новичок в области компьютерного зрения.Как правило, это сложная задача или просто и надежно определить, есть ли препятствие перед камерой в прямом эфире?Ваше мнение эксперта высоко ценится!

Ответы [ 5 ]

2 голосов
/ 10 марта 2011

Вот подход, о котором я слышал, который может принести некоторый успех:

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

Вы также можете рассмотреть вторую гистограмму дляизмерять пиксели в каждой строке изображения.

Очевидно, что это довольно простой подход и сильно зависит от «простого» ввода;т. е. простые прямоугольники с «жесткими» краями на пустом фоне (предпочтительно фон, сильно контрастирующий с прямоугольником).

0 голосов
/ 15 марта 2011

В обнаружении объекта участвуют 2 части. Один - это извлечение признаков, другой - расчет сходства. Некоторые очевидные особенности ящика - это геометрия, ребро, текстура и т. Д. *

Таким образом, вы можете найти некоторые алгоритмы для извлечения этих функций из вашего ящика изображения. Затем сравните эти функции с образцами тренировочных образцов.

0 голосов
/ 10 марта 2011

Это не то, что вы должны начать в Java.Когда у меня возникали проблемы такого рода, я начинал с Matlab (библиотека OpenCV) или чего-то подобного, проверял, будет ли решение работать там, а затем переносил его на Java.

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

Я хочу сказать, что мне потребовалось 2 часа, чтобы установить Scilab и наборы инструментов и написать подтверждение концепции.Это заняло бы у меня два дня в Java, и если бы первое решение не работало с каждым дополнительным алгоритмом (уже сделанным в Mat- / Scilab), еще несколько часов.ИМХО, вы подходите к проблеме с неправильной точки зрения.

Если на самом деле Java / C ++ - это просто простые инструменты, которые не имеют значения, отбросьте их и используйте Scilab или какой-нибудь другой клон Matlab - прототипирование и точная настройка будутнамного быстрее.

0 голосов
/ 10 марта 2011

Здесь много переменных, включая любые возможные изменения окружающего освещения и любые другие действия в поле зрения. Посмотрите на реализацию детектора краев Canny (который есть и в OpenCV, и на Intel Performance Primitives), чтобы найти схему интересующей вас формы. Если вы знаете, где будет поле, вы можете суммировать пиксели в интересующей области. Если поле может появиться где-нибудь в поле зрения, это более сложно.

0 голосов
/ 10 марта 2011

Вам не нужна полноценная библиотека компьютерного зрения, чтобы определить, есть ли ящик перед камерой или нет.Вы можете просто сделать снимок и сделать цветовую гистограмму (простой).Чтобы сделать снимок, посмотрите здесь:

http://msdn.microsoft.com/en-us/library/dd742882%28VS.85%29.aspx

...