opencv是2000年由Intel公司开源、并持续维护的项目,且该项目允许利用opencv的代码生成商业产品。因此,opencv也被广泛应用与人机互动、物体识别、图像分割、人脸识别、动作识别、运动跟踪、机器人、运动分析、机器视觉、结构分析、汽车安全驾驶。但是,由于opencv实际上是一个c函数库,基于opencv的应用大多使用c++开发。市面上仅有几种介绍opencv的中文资料也是基于C++实现。笔者希望通过尝试使用python调用opencv,以降低计算机视觉相关应用开发的门槛。
1.应用一 图像匹配
做图像匹配是基于特征识别,特征识别是基于特征点的识别,所谓特征点又称兴趣点、关键点。其中,角点是图像中最基本的一种关键点,它是由图像中一些几何结构的关节点构成,很多都是线条之间产生的交点。Harris角点是一类比较经典的角点类型,它的基本原理是计算图像中每点与周围点变化率的平均值。
(1)
(2)
其中I(x+u,y+u)代表了点(x,y)邻域点的灰度值。通过变换可以将上式变化为一个协方差矩阵求特征值的问题(2),具体数学原理本文不过多描述。
1.1Harris角点检测
在opencv Harris角点检测是的函数为cornerHairrs(),但是它的输出是一幅浮点值图像,浮点值越高,表明越可能是特征角点,我们需要对图像进行阈值化。
cv2.cornerHarris()对应参数如下:
img -数据类型为float32的输入图像。
blockSize-角点检测中要考虑的领域大小。
ksize-Sobel求导中使用的窗口大小。
k-Harris角点检测方程中的自由参数,取值参数[0.04,0.06]
import cv2
import numpy as np
filename='C:\\workspace\\test.jpg'
img=cv2.imread(filename)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray=np.float32(gray)
dst=cv2.cornerHarris(gray,2,3,0.04)
dst=cv2.dilate(dst,None)
img[dst>0.01*dst.max()]=[0,0,255]
cv2.imshow('dst',img)
if cv2.waitKey(0)&0xff==27:
cv2.destroyAllWindows()
图中红点即为角点,角点基本上能反映图像轮廓的变化,根据变化可进一步进行图像的匹配,判断是否为同一图,进而可判断图中物体是否移动、变动。
未完待续……
转载请注明原创地址