我正在使用以下代码来尝试检测折线的角以“测量”线。该代码基于我在on 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()的等效函数调用是什么?

最佳答案

输出似乎已转置,在正方形图像上交换x和y索引可解决此问题(圆在最大角上)。

07-27 15:30