Цель
В этой главе мы узнаем
- Дефекты выпуклости и способы их обнаружения
- Найдите кратчайшее расстояние от точки до многоугольника
- сочетать разные формы
теория и код
1. Дефекты выпуклости
Мы видели выпуклую оболочку в главе 2, посвященной контурам. Любое отклонение от этой выпуклой оболочки можно считать дефектом выпуклости. OpenCV имеет функцию, чтобы найти это,cv.convexityDefects( ). Базовый вызов функции выглядит следующим образом:
hull = cv.convexHull(cnt,returnPoints = False)
defects = cv.convexityDefects(cnt,hull)
Уведомление
Помните, что мы должны пройти при нахождении выпуклой оболочкиreturnPoints= False
, найти дефекты выпуклости.
Он возвращает массив с каждой строкой, содержащей эти значения —[Начало, Конец, Самая дальняя точка, Приблизительное расстояние до самой дальней точки]. Мы можем визуализировать это с помощью изображений. Проводим линию, соединяющую начальную и конечную точки, а затем рисуем круг в самой дальней точке. Помните, что первые три возвращаемых значения — это индексы cnt. Итак, мы должны получить эти значения от cnt.
import cv2 as cv
import numpy as np
img = cv.imread('star.jpg')
img_gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,thresh = cv.threshold(img_gray, 127, 255,0)
contours,hierarchy = cv.findContours(thresh,2,1)
cnt = contours[0]
hull = cv.convexHull(cnt,returnPoints = False)
defects = cv.convexityDefects(cnt,hull)
for i in range(defects.shape[0]):
s,e,f,d = defects[i,0]
start = tuple(cnt[s][0])
end = tuple(cnt[e][0])
far = tuple(cnt[f][0])
cv.line(img,start,end,[0,255,0],2)
cv.circle(img,far,5,[0,0,255],-1)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
Посмотреть Результаты:
2. Точечный полигональный тест
Эта функция находит кратчайшее расстояние от точки на изображении до контура. Он возвращает расстояние, которое является отрицательным, когда точка находится вне контура, положительным, когда точка находится внутри контура, и нулевым, когда точка находится на контуре.
Например, мы можем сделать контрольную точку(50,50)
следующее:
dist = cv.pointPolygonTest(cnt,(50,50),True)
В функции третий параметр — MeasureDist. Если это правда, он найдет расстояние со знаком. Если false, определяет, находится ли точка внутри или снаружи контурной линии (возвращает +1, -1 и 0 соответственно).
Уведомление
Если вы не хотите находить расстояние, убедитесь, что третий параметр равен False, так как это трудоемкий процесс. Таким образом, установка значения False ускоряет работу в 2-3 раза.
3. Соответствие формы
OpenCV поставляется с функциейcv.matchShapes(), функция, которая позволяет нам сравнивать две фигуры или два контура и возвращает меру, показывающую сходство. Чем ниже результат, тем лучше совпадение. Он рассчитывается из моментных значений. Различные методы измерения объясняются в документации.
import cv2 as cv
import numpy as np
img1 = cv.imread('star.jpg',0)
img2 = cv.imread('star2.jpg',0)
ret, thresh = cv.threshold(img1, 127, 255,0)
ret, thresh2 = cv.threshold(img2, 127, 255,0)
contours,hierarchy = cv.findContours(thresh,2,1)
cnt1 = contours[0]
contours,hierarchy = cv.findContours(thresh2,2,1)
cnt2 = contours[0]
ret = cv.matchShapes(cnt1,cnt2,1,0.0)
print( ret )
Я пробовал формы, которые соответствуют различным формам, приведенным ниже:
Я получаю следующие результаты:
- сопоставление изображения A с самим собой = 0,0
- Сопоставьте изображение A с изображением B = 0,001946
- сопоставьте изображение A с изображением C = 0,326911
Видите ли, даже поворот изображения не имеет большого значения в этом сравнении.
Ссылаться наМоменты Ху — это семь моментов, инвариантных к перемещению, вращению и масштабированию. Седьмая - неперекошенная сумма. Эти значения можно использоватьcpu.HuMoments() функция найдена.
Упражнение
- Проверьте документацию наcv.pointPolygonTest(), вы можете найти красивые изображения в красном и синем цветах. Он представляет собой расстояние от всех пикселей до белой кривой. Все пиксели внутри кривой синие, в зависимости от расстояния. Внешние точки также красные. Края контура отмечены белым цветом. Так что вопрос простой. Напишите код для создания такого представления расстояния.
- использоватьcv.matchShapes() Сравните изображения цифр или букв. (Это простой шаг к OCR)
Сводная станция блога о технологиях искусственного интеллекта Panchuang: http://docs.panchuang.net/PyTorch, официальная учебная станция на китайском языке: http://pytorch.panchuang.net/OpenCV, официальный китайский документ: http://woshicver.com/