Вы можете выполнить определение формы, используя контуры с OpenCV.Я реализовал следующее в Python.
Шаги:
- Поскольку вы имеете дело с дорожными знаками, большинство из них будет красного цвета.В цветовом пространстве RGB количество красного является наибольшим в красном канале.Но так как белый цвет также включает в себя красный, я не использовал его.Я скорее использовал синий канал, где красное содержание минимально.
Изображение синего канала:
Затем я применил порог Оцу к изображению выше и инвертировал его.
Порог Оцу и инверсия:
Наконец я нашел контуры и отметил эти контуры, имеющие около 8 дуг вокруг него.
Окончательный результат:
Код:
import numpy as np
import cv2
import os
path = r'C:\Desktop\Stack\contour\shape_detection'
filename = 'stop.png'
img = cv2.imread(os.path.join(path, filename), 1)
cv2.imshow('img1',img[:,:,0])
ret,thresh1 = cv2.threshold(img[:,:,0], 0, 255,cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
cv2.imshow('thresh1', thresh1)
_, contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True)
print len(approx)
if len(approx)==8:
print "octagon"
cv2.drawContours(img, [cnt], 0, (0, 255, 0), 6)
cv2.imshow('sign', img)
cv2.waitKey(0)
cv2.destroyAllWindows()