魏老师学生——Cecil:学习OpenCV-机器视觉之旅
Q:我们是如何玩拼图的?
A:找到一些适于被跟踪、容易被比较的唯一特征。
Q:这些特征是什么?
A:边缘比平面好找,角点最好找。有时是斑点。
特征检测:找到图像特征的技术。
特征描述:描述特征周围区域,便于在其他图像中找出相同特征。
Harris角点检测
窗口函数:矩形窗口或高斯窗口、对每个像素给予不同权重。
检测结果:由角点分数构成的灰度图。
选取适当阈值对图像进行二值化,从而检测到图中角点。
OpenCV中的Harris角点检测
cv2.cornerHarris(img,blockSize,ksize,k) ——解释:进行角点检测的函数
- img:输入图像,数据类型float32.
- blockSize:邻域的大小。
- ksize:sobel求导中的窗口大小。
- k:角点检测方程中的自由参数,取值[0.04,0.06]。
代码演示
#coding=utf-8
import cv2
import numpy as np
img=cv2.imread('./image2/mario.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray=np.float32(gray)
dst=cv2.cornerHarris(gray,3,3,0.04)
dst=cv2.dilate(dst,None) #标记角点
img[dst>0.01*dst.max()]=[0,0,255] #取阈值
cv2.imshow('img',img)
if cv2.waitKey(0)&0xFF==27:
cv2.destroyAllWindows()
亚像素级精确度的角点
cv2.cornerSubPix(img,corners,winSize,zeroZone,criteria) ——解释:提供最大精度的角点检测。
工作原理:
需要定义迭代的停止条件(迭代次数或精度满足后停止)
- 找到Harris角点;
- 将角点重心传给函数修正;
- 红色像素标出角点,绿色像素标出修正后像素。
- zeroZone:在以下未完成求和公式的搜索区域中确定定义区域的一半。(-1,-1)代表区域不存在。
代码演示
#coding=utf-8
import cv2
import numpy as np
img=cv2.imread('./image2/mario.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray=np.float32(gray)
dst=cv2.cornerHarris(gray,2,3,0.04)
dst=cv2.dilate(dst,None)
ret,dst=cv2.threshold(dst,0.01*dst.max(),255,0)
dst=np.uint8(dst)
ret,labels,stats,centroids=cv2.connectedComponentsWithStats(dst)
criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,90,0,0.001)
corners=cv2.cornerSubPix(gray,np.float32(centroids),(2,2),(-1,-1),criteria)
res=np.hstack((centroids,corners))
res=np.int0(res) #省略小数部分
img[res[:,1],res[:,0]]=[0,0,255]
img[res[:,3],res[:,2]]=[0,255,0]
cv2.imshow('img',img)
if cv2.waitKey(0)&0xFF==27:
cv2.destroyAllWindows()