Обнаружение объектов на основе ребер OpenCV C ++ - PullRequest
0 голосов
/ 10 января 2020

У меня есть приложение, в котором я должен обнаружить наличие некоторых предметов в сцене. Элементы можно вращать и немного масштабировать (больше или меньше). Я пытался использовать ключевые детекторы, но они не достаточно быстрые и точные. Поэтому я решил сначала обнаружить ребра в шаблоне и области поиска, используя Canny (или более быстрое обнаружение ребер al go), а затем сопоставить ребра, чтобы найти положение, ориентацию и размер найденного соответствия.

Все это нужно сделать менее чем за секунду.

Я пытался использовать matchTemplate() и matchShape(), но первый НЕ масштабируется и не зависит от вращения, а второй плохо работает с реальными изображениями. Поворот изображения шаблона для соответствия также занимает много времени.

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

Я уже прошел через следующее, но не смог заставить их работать (они либо используют старую версию OpenCV, либо просто не работают с другими изображениями, кроме тех, что в демоверсии):

https://www.codeproject.com/Articles/99457/Edge-Based-Template-Matching

Сопоставление инварианта углов и масштабов с использованием OpenCV

https://answers.opencv.org/question/69738/object-detection-kinect-depth-images/

Может кто-нибудь предложить мне подход для этого? Или, если возможно, код для того же самого кода?

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

Sample input image

Вот некоторые программы, которые делают это, а также то, как я хочу, чтобы это было:

enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

У вас довольно плохое качество изображения, очень плохие условия освещения, поэтому у вас есть только два способа: 1. Использовать фильтры -> двоичный порог -> find_contours -> matchShape. Но это очень нестабильный алгоритм для вашего типа объекта и качества изображения. Вы получите много неправильных контуров и их сложно отфильтровать. 2. Haarcascades -> вырезать ограничивающий прямоугольник -> проверить фигуру внутри

Все алгоритмы «особых точек / сопоставление краев» не будут работать в таких плохих условиях.

0 голосов
/ 10 января 2020

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

Примечание. В моем подходе я собираю данные из контуров на эталонном изображении, которое является моим желаемым объектом. Тогда я сравниваю эти данные с другими контурами на большом изображении. Обнаружение края

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

  2. После получения контуров по ссылке вы можете найти длину каждого контура, используя outputArray для findContours (). Вы можете сравнить эти значения на своем большом изображении и исключить такие разные контуры.

  3. minAreaRect точно dr aws подходящий прямоугольник для каждого контура , В моем случае эта функция очень полезна. С помощью этой функции я получаю 2 параметра:

    a) Рассчитать короткий и длинный край подогнанного прямоугольника и сравнить значения с другими контурами на большом изображении.

    b) Рассчитать процент черноты или белизны (если ваше изображение в градациях серого, получите процентное значение, сколько пикселей близко к белому или черному) и сравните в конце.

  4. matchShape может быть применяется в конце к остальным контурам или вы также можете применить ко всем контурам (я предлагаю первый подход). Каждый контур - это просто массив, так что вы можете хранить опорные контуры в массиве и сравнивать их с другими в конце. После 3 шагов, а затем применение matchShape очень хорошо на моей стороне.

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

  6. В OpenCV есть несколько хороших алгоритмов поиска кругов, выпуклости и т. Д. c. Если ваши ситуации связаны с ними, вы также можете использовать их в качестве шага.

  7. В конце вы просто получаете все данные, значения и можете создать таблицу в своем разум. Остальное - вид статистического анализа.

Примечание: я думаю, что самая важная часть - это часть препроцессора. Поэтому убедитесь, что у вас есть чистое, почти бесшумное изображение и справка.

Примечание. Обучение может быть хорошим решением для вашего случая, если вы просто хотите знать, существуют ли объекты или нет. Но если вы пытаетесь что-то сделать для промышленного применения, это совершенно неверный путь. Я несколько раз пробовал алгоритмы обучения YOLO и haarcascade, а также обучал их некоторым предметам. Я получаю следующий опыт: они могут находить объекты почти правильно, но координаты центра, результаты вращения и т. Д. c. не будет полностью правильным, даже если ваша калибровка верна. С другой стороны, время обучения и сбора данных является болезненным.

...