Я использую следующий код, чтобы попытаться обнаружить углы полилиний, чтобы «измерить» линии. Код основан на фрагменте, который я нашел где-то на SO, и основан на cv2.cornerHarris():
cornerimg = cv2.cornerHarris( gray, # src
2, # blockSize
3, # ksize / aperture
0.04 # k
# dst
# borderType
)
# ?
cornerimg = cv2.normalize( cornerimg, # src
None, # dst
0, # alpha
255, # beta
cv2.NORM_MINMAX, # norm type
cv2.CV_32FC1, # dtype
None # mask
)
# ?
cornerimg = cv2.convertScaleAbs( cornerimg )
cornershow = cornerimg.copy()
# iterate over pixels to get corner positions
w, h = gray.shape
for y in range(0, h):
for x in range (0, w):
#harris = cv2.cv.Get2D( cv2.cv.fromarray(cornerimg), y, x)
#if harris[0] > 10e-06:
if cornerimg[x,y] > 64:
print("corner at ", x, y)
cv2.circle( cornershow, # dest
(x,y), # pos
4, # radius
(115,0,25) # color
)
cv2.imshow('harris cornerimg', cornershow)
Исходный код приводит к появлению белых пятен в угловых точках, а уровень кажется индикатором «угловатости». Фрагмент (обновленный для использования cv2) перебирает полученное изображение и по какой-то причине сканирует значения больше, чем 10e-06, я заменил это сравнением того, что, по моему мнению, должно быть яркостью изображения.
Однако круги, нарисованные в этих местах, далеки от реальных горячих точек, найденных в нормализованном выводе Харриса.
Что я делаю не так?
Кроме того, cv2.goodFeaturesToTrack() можно настроить на использование Harris (useHarrisDetector=True), но моя попытка использовать его не приводит к правильному обнаружению угла Harris:
cv2.goodFeaturesToTrack( blurred, # img
500, # maxCorners
0.03, # qualityLevel
10, # minDistance
None, # corners,
None, # mask,
2, # blockSize,
useHarrisDetector=True, # useHarrisDetector,
k=0.04 # k
)
Что будет эквивалентно вызову функции cv2.cornerHarris()?