十五天掌握OpenCV——图像特征提取与描述 —理解图像特征

魏老师学生——Cecil:学习OpenCV-机器视觉之旅


Q:我们是如何玩拼图的?
A:找到一些适于被跟踪、容易被比较的唯一特征。
Q:这些特征是什么?
A:边缘比平面好找,角点最好找。有时是斑点。

特征检测:找到图像特征的技术。
特征描述:描述特征周围区域,便于在其他图像中找出相同特征。

Harris角点检测
窗口函数:矩形窗口或高斯窗口、对每个像素给予不同权重。
检测结果:由角点分数构成的灰度图。
选取适当阈值对图像进行二值化,从而检测到图中角点。

OpenCV中的Harris角点检测

cv2.cornerHarris(img,blockSize,ksize,k) ——解释:进行角点检测的函数

  1. img:输入图像,数据类型float32.
  2. blockSize:邻域的大小。
  3. ksize:sobel求导中的窗口大小。
  4. 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) ——解释:提供最大精度的角点检测。
工作原理:
需要定义迭代的停止条件(迭代次数或精度满足后停止)

  1. 找到Harris角点;
  2. 将角点重心传给函数修正;
  3. 红色像素标出角点,绿色像素标出修正后像素。
  4. 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()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值