2

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

4

2 に答える 2

2

以下を試してください:

  cv2.circle( cornershow,  # dest
              (y,x),      # pos
              4,          # radius
              (115,0,25)  # color
              )
于 2013-08-20T16:06:51.970 に答える
2

出力は転置されているようで、正方形の画像で x と y のインデックスを交換すると修正されます (円は角の最大値にあります)。

于 2013-08-16T07:32:24.230 に答える