小言_互联网的博客

亚像素级精确度的角点

394人阅读  评论(0)

        有时我们需要最大精度的角点检测。OpenCV为我们提供了函cv2.cornerSubPix(), 它可以提供亚像素级别的角点检测。下面是一个例子。首先我们要找到 Harris 角点,然后将角点的重心传给这个函数进行修正。Harris 角点用红色像素标出,绿色像素是修正后的像素。在使用这个函数是我们要定义一个迭代停止条件。当迭代次数达到或者精度条件满足后迭代就会停止。我们同样需要定义进行角点搜索的邻域大小。

ret, labels, stats, centroids = cv2.connectedComponentsWithStats(image, connectivity, ltype)

        image:8位单通道图像

        labels:输出标签

        stats:Nx5的矩阵(CV_32S):[x0, y0, width0, height0, area0; ... ; x(N-1), y(N-1), width(N-1), height(N-1), area(N-1)]

        centroids:Nx2 质心矩阵(CV_64F ): [ cx0, cy0; ... ; cx(N-1), cy(N-1)]

        connectivity:默认为8,4- or 8-connected components

        ltype:默认为CV_32S,标签类型 (CV_32S or CV_16U)

cv2.cornerSubPix(image, corners, winSize, zeroZone, criteria)

        image:输入图像

        corners:角点的初始坐标

        winSize:搜索窗口边长的一半

        zeroZone:搜索区域中间的dead region边长的一半

        criteria:迭代过程的终止条件

例如:


  
  1. import cv2
  2. import numpy as np
  3. filename = 'test30_3.jpg'
  4. img = cv2.imread(filename)
  5. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  6. gray = np.float32(gray)
  7. dst = cv2.cornerHarris(gray, 2, 3, 0.04)
  8. dst = cv2.dilate(dst, None)
  9. ret, dst = cv2.threshold(dst, 0.01*dst. max(), 255, 0)
  10. dst = np.uint8(dst)
  11. ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)
  12. # 定义一个标准去停止迭代
  13. criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
  14. # 返回值由角点坐标组成的一个数组(而非图像)
  15. corners = cv2.cornerSubPix(gray, np.float32(centroids), ( 5, 5), (- 1, - 1), criteria)
  16. res = np.hstack((centroids, corners))
  17. # np.int0 可以用来省略小数点后面的数字(非四舍五入)。
  18. res = np.int0(res)
  19. img[res[:, 1], res[:, 0]] = [ 0, 0, 255]
  20. img[res[:, 3], res[:, 2]] = [ 0, 255, 0]
  21. cv2.imwrite( 'subpixe.png', img)

结果如下:

  可以看出绿色比红色更加精确。


转载:https://blog.csdn.net/weixin_34910922/article/details/128193740
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场