Good Features to track特征点检测原理与opencv(python)实现 标签: pythonopencvgoodfeaturetotrack 2017-06-16 1
在学习Good Features to track特征点检测时,主要参考了opencv官方资料关于特征点检测的介绍,网址:http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_shi_tomasi/py_shi_tomasi.html#shi-tomasi。
1.原理
Good Features to track特征点检测来自于Shi et al. 的一篇文章,就叫Good Features to track。文中讲了对于跟踪Track问题,有哪些特征点是好的。这里我们就要弄清楚其中选取特征点的方法原理。
由另一篇本人博客讲解可知,Harris角点检测是定义一个
,通过比较R>阈值来决定是否是一个角点。
对于Good Features to track,同样定义了R:
也是用R值大小来分析是否是特征点。
不过Good Features to track在实现上有一个参数是输入想要得到特征的数目,也就是说会选择最好的N个特征点来给出。举例来说,如果需要50个特征点,那么这个算法会给出R最大的点出来(也就是最小特征值最大的50个点)。
Good Features to track和Harris的不同可以从下图看出来(图来自官方资料)
左图是harris的特征点的分布,右图是Good Features to track,横轴纵轴分别是两个特征值。对比可以发现,Good Features to track需要最小的特征值也大于的,这一点上要求比harris要高。
Good Features to track 一般也能得到比harris更好的特征点。
2. 代码实现与解释
主要函数是cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance, [, corners [, mask [, blocksize [, useHarrisDetector [, k ]]]]] )
--> corners
参数解释如下:
maxCorners : 最大数目的角点数。即上文提到的N。
qualityLevel:该参数指出最低可接受的角点质量,是一个百分数,示例中给出为0.01。 具体来说,如果最好的角点质量=1500,而qualityLevel = 0.01,那么角点质量<15的就都会被拒掉。这里需要对角点质量如何得到进行简单说明。在官方的函数说明中,角点质量可由cornerHarris() 或 cornerMinEigenval() 得到,即两种quality measure。第一种cornerHarris()就是Harris角点检测的代码,函数返回每个像素点处计算出的R值,R值越大,认为角点质量越好;而cornerMinEigval()是计算每个像素点处对应的协方差矩阵的最小特征值,作为该像素点处的角点质量,认为最小特征值越大,角点质量越好(协方差矩阵就是Harris中提到的M,参考我另一篇博客)。
minDistance:角点之间最小的欧拉距离,避免得到相邻特征点。
mask:可选参数,给出ROI。该参数与原图尺寸相同且类型为CV_8UC1,指示出需要进行特征检测的区域,如在人脸检测中检测到的人脸区域进行特征点提取(matlab中的KLT算法中就是这样)。
/* 注:CV_8UC1:
- 1
- 1
1--bit_depth---比特数---代表8bite,16bites,32bites,64bites---举个例子吧--比如说,如
如果你现在创建了一个存储--灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张
灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位--所以它对
应的就是CV_8
2--S|U|F--S--代表---signed int---有符号整形
U--代表--unsigned int--无符号整形
F--代表--float---------单精度浮点型
3--C<number_of_channels>----代表---一张图片的通道数,比如:
1--灰度图片--grayImg---是--单通道图像
2--RGB彩色图像---------是--3通道图像
3--带Alph通道的RGB图像--是--4通道图像
来自http://blog.csdn.net/maweifei/article/details/51221259
*/blocksize:在每一个像素的领域中计算derivative covariation matrix的平均块的大小。即计算M用到的块大小。
corners:检测到的角点的输出向量。
python代码(示例):
# -*- coding: utf-8 -*- """ Created on Thu Jun 15 06:43:25 2017 @author: dc """ import numpy as np import cv2 #import matplotlib.pyplot as plt #读入图像 filename = 'Dick.jpg' img = cv2.imread(filename) img2 = img #转化为灰度float32类型进行处理 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img_gray = np.float32(img_gray) #得到角点坐标向量 goodfeatures_corners = cv2.goodFeaturesToTrack(img_gray, 25, 0.01, 10) goodfeatures_corners = np.int0(goodfeatures_corners) # 注意学习这种遍历的方法(写法) for i in goodfeatures_corners: #注意到i 是以列表为元素的列表,所以需要flatten或者ravel一下。 x,y = i.flatten() cv2.circle(img2,(x,y), 3, [0,255,], -1) cv2.imshow('goodfeature',img2) cv2.waitKey()