opencv找亚像素角点的方法

亚像素角点

角点的定义就是在原图上很突出的点,一般意义上,这种点在两个正交方向上的梯度都很明显,所以就先将其理想为国际象棋棋盘的样子。

在这里插入图片描述
那么要求角点的亚像素精度的坐标,需要的就是找坐标的约束。
如上图所示,如果一个点q是可能的角点,那它周围的点p就有两种情况。

  • p点在平坦处,其梯度为0.
  • p点在边缘,其梯度方向与pq向量方向垂直。
    不难发现,这两种情况下p的梯度与pq向量的点积都为0.
    那么求角点的原理就是在可能的点q的周围找许多点p,求其梯度与pq向量的点积,采用优化算法令这些点积接近于0,变量是q点的坐标,不断优化可以得到越来越精确的q的坐标。
    所以在opencv里面的求亚像素坐标的函数如下:
    在这里插入图片描述
    其中win就是找p的窗口大小,而zero-zone则是将特别靠近q点的p点删掉的窗口大小,即p点是在win内且不在zero-zone内的点。
亚像素角点检测是一种精细的角点检测方法,可以更准确地定位图像中的角点OpenCV中提供了cornerSubPix()函数来实现亚像素角点检测。 使用方法如下: 1. 首先进行角点检测,可以使用cornerHarris()或者cornerMinEigenVal()等函数。 2. 对于检测到的角点,使用cornerSubPix()函数进行亚像素级别的精细定位。 3. 调用cornerSubPix()函数时,需要传入原始图像、角点坐标、搜索窗口大小等参数,函数会返回精细定位后的角点坐标。 示例代码如下: ``` import cv2 # 读取图像 img = cv2.imread('test.jpg') # 进行角点检测 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) corners = cv2.cornerHarris(gray, 2, 3, 0.04) # 取出角点坐标 corners = cv2.goodFeaturesToTrack(gray, 100, 0.01, 10) corners = np.int0(corners) # 进行亚像素角点检测 corners_sub = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)) # 在图像上绘制角点 for i in corners: x, y = i.ravel() cv2.circle(img, (x, y), 3, (0, 0, 255), -1) for i in corners_sub: x, y = i.ravel() cv2.circle(img, (x, y), 3, (0, 255, 0), -1) # 显示图像 cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中,我们先使用cornerHarris()函数进行角点检测,然后使用goodFeaturesToTrack()函数取出角点坐标。最后使用cornerSubPix()函数进行亚像素级别的角点精细定位,并在图像上绘制出检测结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值