Я пытаюсь сопоставить слегка неправильную форму с базой данных фигур. Например, вот контур, который я пытаюсь сопоставить:
Для получения дополнительной информации это контур разъема HDMI, представленного в виде контура. Это немного грубо, так как это было сделано с телефоном, удерживая HDMI.
Это моя база данных разъемов:
HDMI:
DVI:
5PinDIN:
DB25:
Это намного понятнее, так как это контуры, собранные из изображений разъемов из Интернета.
За то, что я пробовал:
cv2.matchShapes ()
Поскольку все это просто контуры, я попытался напрямую сравнить их с помощью метода matchShapes (), и он не дал хороших результатов. Сходство между нерегулярным контуром и моей базой данных было:
HDMI: 0,90
DB25: 0,84
5-контактный DIN: 0,5
DVI: 0,21
Поскольку контуры более похожи, чем ближе к 0 результат совпадения, алгоритм полностью провалился Я попробовал другие методы сопоставления, изменив третий параметр, но все равно не получилось.
ORB:
Будучи похожим на SIFT, я попытался сопоставить ключевые точки. Усреднение расстояния между различными совпадениями в моей базе данных (после нахождения 15% лучших совпадений):
mean([m.distance for m in matches])
Расстояния составили:
5-контактный DIN: 7,6
DB25: 11,7
DVI: 12,1
HDMI: 19,6
Поскольку это классифицировало круг как форму, наиболее похожую на мой контур, это тоже не удалось.
Вот соответствующие ключевые точки из ORB реального слота HDMI против моего слота HDMI примера для получения дополнительной информации:
Есть какие-нибудь идеи / другие алгоритмы, которые я должен попробовать? Или CNN - мой единственный выбор (которого я бы предпочел избежать, поскольку у меня нет соответствующего количества данных).