特征点提取opencv

1. cornerHarris()

opencv中提供了Harris角点检测的接口,即cv::cornerHarris()
缺陷:角点是像素级别的,速度较慢

dst = cv2.cornerHarris(gray,2,3,0.04)
	img - 数据类型为 float32 的输入图像
	blockSize - 角点检测中要考虑的领域大小
	ksize - Sobel 求导中使用的窗口大小
	k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06]

2. goodFeaturesToTrack()

cv::goodFeaturesToTrack()的具体调用形式如下:

void cv::goodFeaturesToTrack(
		cv::InputArray image, // 输入图像(CV_8UC1 CV_32FC1)
		cv::OutputArray corners, // 输出角点vector
		int maxCorners, // 最大角点数目
		double qualityLevel, // 质量水平系数(小于1.0的正数,一般在0.01-0.1之间)
		double minDistance, // 最小距离,小于此距离的点忽略
		cv::InputArray mask = noArray(), // mask=0的点忽略
		int blockSize = 3, // 使用的邻域数
		bool useHarrisDetector = false, // false ='Shi Tomasi metric'
		double k = 0.04 // Harris角点检测时使用
	);
Harris角点检测
cvGoodFeaturesToTrack(img_gray,eig_img,temp_img,corners,&corner_count,quality_level,min_distance)
shi-Tomas角点检测
goodFeaturesToTrack(src_gray,corners,maxCorners,qualityLevel,minDistance,Mat(),blockSize,useHarrisDetector,k);

3. cv::cornerSubPix()亚像素角点检测

效果比goodFeaturesToTrack()要好

void cv::cornerSubPix(
		cv::InputArray image, // 输入图像
		cv::InputOutputArray corners, // 角点(既作为输入也作为输出)
		cv::Size winSize, // 区域大小为 NXN; N=(winSize*2+1)
		cv::Size zeroZone, // 类似于winSize,但是总具有较小的范围,Size(-1,-1)表示忽略
		cv::TermCriteria criteria // 停止优化的标准
	);

4. SURF特征点

Speeded Up Robust Feature
尺度不变特征,而且是具有较高计算效率的特征

SurfFeatureDetector surfDetector(800);  // 海塞矩阵阈值,在这里调整精度,值越大点越少,越精准 
vector<KeyPoint> keyPoint1, keyPoint2;
surfDetector.detect(image1, keyPoint1);
surfDetector.detect(image2, keyPoint2);

5. SIFT特征点

ScaleInvariant Feature Transform
SIFT算法检测的特征在空间和尺度上定位更加精确
尺度不变特征,在注重速度的场合难有应用

SiftFeatureDetector siftDetector(2000);  // 海塞矩阵阈值,在这里调整精度,值越大点越少,越精准 
vector<KeyPoint> keyPoint1, keyPoint2;
siftDetector.detect(image1, keyPoint1);
siftDetector.detect(image2, keyPoint2);

6、ORB特征点

Oriented FAST and Rotated BRIEF
旋转不变性,没有尺度不变性

ORB::ORB(int nfeatures=500, float scaleFactor=1.2f, int nlevels=8, int edgeThreshold=31, int firstLevel=0, int WTA_K=2, 
int scoreType=ORB::HARRIS_SCORE, int patchSize=31)

nfeatures - 最多提取的特征点的数量;
scaleFactor - 金字塔图像之间的尺度参数,类似于SIFT中的k;
nlevels – 高斯金字塔的层数;
edgeThreshold – 边缘阈值,这个值主要是根据后面的patchSize来定的,靠近边缘edgeThreshold以内的像素是不检测特征点的。
firstLevel - 看过SIFT都知道,我们可以指定第一层的索引值,这里默认为0。
WET_K - 用于产生BIREF描述子的 点对的个数,一般为2个,也可以设置为3个或4个,那么这时候描述子之间的距离计算就不能用汉明距离了,而是应该用一个变种。OpenCV中,如果设置WET_K = 2,则选用点对就只有2个点,匹配的时候距离参数选择NORM_HAMMING,如果WET_K设置为3或4,则BIREF描述子会选择3个或4个点,那么后面匹配的时候应该选择的距离参数为NORM_HAMMING2。
scoreType - 用于对特征点进行排序的算法,你可以选择HARRIS_SCORE,也可以选择FAST_SCORE,但是它也只是比前者快一点点而已。
patchSize – 用于计算BIREF描述子的特征点邻域大小。

ORB orb; 
orb.detect(img_1, keypoints_1); 
orb.detect(img_2, keypoints_2);

猜你喜欢

转载自blog.csdn.net/weixin_43848793/article/details/89409643