您的位置:首页 > 编程语言 > Python开发

Good Features to track特征点检测原理与opencv(python)实现

2017-06-16 15:35 2041 查看
在学习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:

CV_<bit_depth>(S|U|F)C<number_of_channels>
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 = 'Dirk.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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息