我是靠谱客的博主 傻傻小霸王,这篇文章主要介绍opencv-图片特征点提取,现在分享给大家,希望可以做个参考。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "opencv2/opencv.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/nonfree/features2d.hpp" #include "opencv2/flann/miniflann.hpp" #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/calib3d/calib3d.hpp" #include <stdio.h> #include <iostream> using namespace cv; using namespace std; cv::Mat flannMatchExtract(cv::Mat srcImage1, cv::Mat srcImage2) { CV_Assert(srcImage1.data != 0 && srcImage2.data != 0); // 构造SURF检测器 int hessPara = 300; SurfFeatureDetector detector(hessPara); vector<KeyPoint> kPoint1, kPoint2; // 特征点检测 detector.detect(srcImage1,kPoint1); detector.detect(srcImage2,kPoint2); SurfDescriptorExtractor extractor; // 描述子提取 cv::Mat despMat1, despMat2; extractor.compute(srcImage1,kPoint1, despMat1); extractor.compute(srcImage2,kPoint2, despMat2); // Flann 特征点匹配 FlannBasedMatcher matcher; vector< DMatch > matches; matcher.match( despMat1, despMat2, matches ); double max_dist = 0; double min_dist = 100; // 距离判断-最优匹配点 for( int i = 0; i < despMat1.rows; i++ ) { double dist = matches[i].distance; if( dist < min_dist ) min_dist = dist; if( dist > max_dist ) max_dist = dist; } printf("Max dist : %f n", max_dist ); printf("Min dist : %f n", min_dist ); // 最佳匹配点 vector< DMatch > matchVec; // 检测点 for( int i = 0; i < despMat1.rows; i++ ) { if( matches[i].distance < 3*min_dist ) { matchVec.push_back( matches[i]); } } // 绘制检测点 cv::Mat matchMat, matchMat2; drawMatches( srcImage1, kPoint1, srcImage2, kPoint2, matchVec, matchMat, Scalar::all(-1), Scalar::all(-1),vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS ); imshow( "matchMat", matchMat); // 特征点一致性检测 vector<Point2f> obj; vector<Point2f> scene; for( int i = 0; i < matchVec.size(); i++ ) { obj.push_back( kPoint1[ matchVec[i].queryIdx ].pt ); scene.push_back( kPoint2[ matchVec[i].trainIdx ].pt ); } // 随机一致性 Mat H = findHomography( obj, scene, CV_RANSAC ); // 构造变换矩阵 Point2f objCorner[4] = { cvPoint(0,0), cvPoint( srcImage1.cols, 0 ), cvPoint( srcImage1.cols, srcImage1.rows ), cvPoint( 0, srcImage1.rows ) }; // 绘制匹配点 cv::Point sceneCors[4]; for( int i = 0; i < 4; i++ ) { double x = objCorner[i].x; double y = objCorner[i].y; // 映射矩阵构造 double Z = 1./( H.at<double>(2,0)*x + H.at<double>(2,1)*y + H.at<double>(2,2) ); double X = ( H.at<double>(0,0)*x + H.at<double>(0,1)*y + H.at<double>(0,2) )*Z; double Y = ( H.at<double>(1,0)*x + H.at<double>(1,1)*y + H.at<double>(1,2) )*Z; sceneCors[i] = cvPoint( cvRound(X) + srcImage1.cols, cvRound(Y) ); } // 绘制匹配出目标 line( matchMat, sceneCors[0], sceneCors[1], Scalar(0, 255, 0), 2 ); line( matchMat, sceneCors[1], sceneCors[2], Scalar( 0, 255, 0), 2 ); line( matchMat, sceneCors[2], sceneCors[3], Scalar( 0, 255, 0), 2 ); line( matchMat, sceneCors[3], sceneCors[0], Scalar( 0, 255, 0), 2 ); imshow( "ObjectMat", matchMat ); return matchMat; } int main() { cv::Mat srcImage1 = imread("hand1.jpg"); cv::Mat srcImage2 = imread("hand2.jpg"); if (!srcImage1.data || !srcImage2.data) return -1; cv::Mat resMatchMat = flannMatchExtract(srcImage1, srcImage2); cv::waitKey(0); return 0; }


最后

以上就是傻傻小霸王最近收集整理的关于opencv-图片特征点提取的全部内容,更多相关opencv-图片特征点提取内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(79)

评论列表共有 0 条评论

立即
投稿
返回
顶部