次のコードを使用して、線を「測定」するためにポリラインのコーナーを検出しようとしています。コードは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) を使用することもできますが、それを使用しようとしても、cornerHarris が適切に検出しているようには見えません。
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() への同等の関数呼び出しは何でしょうか?