#
include
<stdio.h>
#
include
<iostream>
#
include
"opencv2/core/core.hpp"
#
include
"opencv2/nonfree/features2d.hpp"
#
include
"opencv2/legacy/legacy.hpp"
#
include
"opencv2/highgui/highgui.hpp"
using
namespace
cv;
using
namespace
std;
int main( int argc, char** argv )
{
Mat src_1 = imread(
"D:\\opencv_pic\\cat3d120.jpg"
, CV_LOAD_IMAGE_GRAYSCALE );
Mat src_2 = imread(
"D:\\opencv_pic\\cat0.jpg"
, CV_LOAD_IMAGE_GRAYSCALE );
if
( !src_1.data || !src_2.data )
{
cout keypoints_1, keypoints_2;
detector.detect( src_1, keypoints_1 );
detector.detect( src_2, keypoints_2 );
cout > matcher;
vector matches;
matcher.match( descriptors_1, descriptors_2, matches );
cout<br>
<p>实验结果:</p>
<img src=
"/static/imghw/default1.png"
data-src=
"/inc/test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20141115151204375%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9seWJpbg%3D%3D%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fu012564690%2Farticle%2Fdetails%2F17370511"
class
=
"lazy"
alt=
"OpenCV中feature2D学习SIFT和SURF算子实现特征点提取与匹配"
><br>
<p><span><br>
</span></p>
<h1 id=
"span-FLANN匹配法-span"
><span>FLANN匹配法</span></h1>
<p>使用暴力匹配的结果不怎么好,下面使用FlannBasedMatcher进行特征匹配,只保留好的特征匹配点,代码如下:</p>
<pre
class
=
"brush:php;toolbar:false"
>
#
include
<stdio.h>
#
include
<iostream>
#
include
"opencv2/core/core.hpp"
#
include
"opencv2/nonfree/features2d.hpp"
#
include
"opencv2/features2d/features2d.hpp"
#
include
"opencv2/highgui/highgui.hpp"
using
namespace
cv;
using
namespace
std;
int main( int argc, char** argv )
{
Mat src_1 = imread(
"D:\\opencv_pic\\cat3d120.jpg"
, CV_LOAD_IMAGE_GRAYSCALE );
Mat src_2 = imread(
"D:\\opencv_pic\\cat0.jpg"
, CV_LOAD_IMAGE_GRAYSCALE );
if
( !src_1.data || !src_2.data )
{
cout keypoints_1, keypoints_2;
detector.detect( src_1, keypoints_1 );
detector.detect( src_2, keypoints_2 );
cout allMatches;
matcher.match( descriptors_1, descriptors_2, allMatches );
cout maxDist )
maxDist = dist;
}
printf(
" max dist : %f \n"
, maxDist );
printf(
" min dist : %f \n"
, minDist );
for
( int i = 0; i (),
DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS
);
imshow(
"matching result"
, matchImg );
for
( int i = 0; i <br>
<p>实验结果:</p>
<img src=
"/static/imghw/default1.png"
data-src=
"/inc/test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20141115151359125%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9seWJpbg%3D%3D%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fu012564690%2Farticle%2Fdetails%2F17370511"
class
=
"lazy"
alt=
"OpenCV中feature2D学习SIFT和SURF算子实现特征点提取与匹配"
><br>
<p><br>
</p>
<p>从第二个实验结果可以看出,经过过滤之后特征点数目从49减少到33,匹配的准确度有所上升。当然也可以使用SIFT算子进行上述两种匹配实验,只需要将SurfFeatureDetector换成SiftFeatureDetector,将SurfDescriptorExtractor换成SiftDescriptorExtractor即可。</p>
<p><br>
</p>
<h1 id=
"span-拓展-span"
><span>拓展</span></h1>
<p> 在FLANN匹配法的基础上,还可以进一步利用透视变换和空间映射找出已知物体(目标检测),具体来说就是利用findHomography函数利用匹配的关键点找出相应的变换,再利用perspectiveTransform函数映射点群。具体可以参考这篇文章:OpenCV中feature2D学习——SIFT和SURF算法实现目标检测。</p>
<p><br>
</p>
</iostream></stdio.h>