opencv3.0中contrib模块的添加+实现SIFT/SURF算法

平台:win10 x64 +VS 2015专业版 +opencv-3.x.+CMake+Anaconda3(python3.7.0)

Issue说明:Opencv3.0版本已经发布了有一段时间,在这段时间也是不断的进行了更新和修复,最近看了一下3.0新增的一些功能,感觉还是蛮强大的,作为一个一直以Opencv为开发环境的程序员来说是一定要体验一下这个新版本的,特别看到说在tracking领域近年比较好的文章TLD和 KCF都有扩展包了,那更是要尝试一下。尝试用扩展包实现sift/surf算法。

原因:opencv从2.x到3.x是一个很大的转变,对于很多功能不完善、性能不稳定的模块,都被方法了extra_modules(扩展模块)里面了。这样倒是稳定了,但是对于我这样的新手,要添加这些扩展模块却是相当的痛苦啊!!因为要用到sift/surf算法,但是3.0以后这些算法都放到了在xfeacture模块中,并不在主模块中,于是就开始了艰难的配置过程。

解决办法:Win10 x64+vs2015+opencv3.4.1+附加模块opencv_contrib+cmake3.15.2编译和配置

目录:

一、下载地址汇总(OpenCV+OpenCV_contrib+CMake)
二、中间遇到的Issue汇总
三、主要参考链接
四、项目Issue

一、下载地址汇总(OpenCV+OpenCV_contrib+CMake)

OpenCV:https://sourceforge.net/projects/opencvlibrary/files/opencv-win/

OpenCV_contrib:https://github.com/opencv/opencv_contrib/releases

CMake:https://cmake.org/download/


二、中间遇到的Issue汇总

Issue1:在github上下载资料,速度只有10几KB/s,下个opencv_contrib-3.4.1.zip,需要一个多小时!!!如何修改host文件加快github访问及下载速度?

答:进入目录C:WindowsSystem32driversetc并打开host文件

就是要将新的host添加到文件后面添加内容

访问:http://github.global.ssl.fastly.net.ipaddress.com/#ipinfo

查看IP地址(本人的是:151.101.185.194

然后访问:http://github.com.ipaddress.com/#ipinfo

查看IP地址(本人的是:192.30.253.112

然后将就可以,在host文件末尾添加新的数据(一定要另起一行哦!)

151.101.185.194 github.global.ssl.fastly.net
192.30.253.112 github.com

为了是host生效,

在cmd里输入如下指令

ipconfig /flushdns

参考:百度经验:github怎么修改host表下载——https://jingyan.baidu.com/article/ea24bc397265049a62b331d7.html

Issue2:我之前的电脑是Win10 x64+vs2015+opencv3.4.1(使用opencv-3.4.1-vc14_vc15.exe解压完成的,无附加模块opencv_contrib)+cmake3.13.4,参看网上 opencv3.0中contrib模块的添加——https://blog.csdn.net/streamchuanxi/article/details/51044929  配置一直报错?方案九(x64)、方案十(x86)成功!

答:网上opencv3.0中contrib模块的添加——https://blog.csdn.net/streamchuanxi/article/details/51044929中 从以下网址下载opencv源代码和扩展模块源代码(一定要从下面链接下载,实际此博客这块有错误!参看总结)。
OpenCV: https://github.com/Itseez/opencv
Extra Modules: https://github.com/Itseez/opencv_contrib

下载:opencv-master.zip+opencv_contrib-master.zip

然后点击“configure”按钮,更改内容,然后点击“configure”,回提示Generate Done。

在D:opencv3uild下找到OPENCV.sln,打开,找到CMakeTargets下的INSTALL,在Debug(或Release)下分别右键生成,经过40分钟左右报错!!!

方案一:上边网址:opencv3-master.zip+opencv_contrib-master.zip+vs 14 2015 x64(第一次点击“configure”按钮选择)
   INSTALL生成时 报错100多项 警告100多项

方案二:上边网址:opencv3-master.zip+opencv_contrib-master.zip+vs 14 2015 win32(第一次点击“configure”按钮选择)
    INSTALL生成时 报错100多项 警告100多项

官网下载opencv:opencv-master.zip+opencv_contrib-master.zip  链接:https://github.com/opencv

方案三:官网:opencv4-master.zip+opencv_contrib-master.zip+vs 14 2015 x64(第一次点击“configure”按钮选择)
    INSTALL生成时 报错100多项 警告100多项

方案四:官网:opencv4-master.zip+opencv_contrib-master.zip+vs 14 2015 win32(第一次点击“configure”按钮选择)
    INSTALL生成时 报错100多项 警告100多项

方案五:怀疑CMake版本问题,下载最新的CMake3.15.2(官网——CMake:https://cmake.org/download/)重试了方案一二三四

 INSTALL生成时 报错100多项 警告100多项

方案六:怀疑Win10系统环境变量问题,去掉%JAVA_HOME%in;%MYSQL_HOME%in;D:WorkinguildOpenCVin;D:ProgramFilesgtk_-bundle_2.24.10_win32in;D:ProgramFilesMinGW-V5.1.6MinGWin重试了方案一二三四
 INSTALL生成时 报错100多项 警告100多项

方案七:Win10+VS2017编译opencv3.2.0和opencv_contrib3.2.0来调用text模块——https://www.jianshu.com/p/4d49aa5e5656  中注意在安装VS2017的时候需要勾选使用C++的桌面开发这个选项,否则后面用CMake编译的时候可能会提示找不到C++编译器。(估计应该就是需要右边小红框里的那个东西,但是保险起见我还是全装了=-=) 怀疑VS2015安装问题,
 在网上搜索VS2015未报此安装问题,另外自己安装博客也没有问题。

方案八:Win10+vs2015+opencv3.4.1+附加模块opencv_contrib+cmake3.11.0编译和配置——https://elody-07.github.io/opencv3.4.1+contrib+cmake3.11.0/#2-opencv3-4-1,重新下载opencv3.4.1+附加模块opencv_contrib

注意:opencv_contrib的版本一定要和opencv相同!!!下载:opencv-3.4.1-vc14_vc15.exe+opencv_contrib-3.4.1.zip
官网:opencv-3.4.1-vc14_vc15.exe+opencv_contrib-3.4.1.zip+vs 14 2015 win32(第一次点击“configure”按钮选择)
    INSTALL生成时 报错,但是这一次只报了两个错误:1.const char不能赋值为char
;2.模块计算机类型“x64”与目标计算机类型“X86”冲突

第一个错误通过定位(cv2.cpp的889行)修改“char* str = PyString_AsString(obj);”为“const char* str = PyString_AsString(obj);”解决

第二个错误无法修改

方案九:官网:opencv-3.4.1-vc14_vc15.exe+opencv_contrib-3.4.1.zip+vs 14 2015 x64(第一次点击“configure”按钮选择)
    INSTALL生成时 报错,但是这一次只报了两个错误:1.const char不能赋值为char;2.无法打开文件"python37_d.lib"   

第一个错误通过定位(cv2.cpp的889行)修改“char* str = PyString_AsString(obj);”为“const char* str = PyString_AsString(obj);”解决

第二个错误解决方案  参考:无法打开文件“python35_d.lib”——https://blog.csdn.net/weixin_38383877/article/details/89891380

法一:(简单)全盘搜索python37.lib,把python37.lib复制粘贴后命名为python37_d.lib。(实际主要搜索是Anaconda3目录下,我的python37.lib两处在(1)C:UserswangAnaconda3libs,复制粘贴后命名为python37_d.lib;(2)C:UserswangAnaconda3pkgspython-3.7.0-hea74fb7_0libs,复制粘贴后命名为python37_d.lib试了,生成不报错,重新生成还是报错!

法二:在 Anaconda3 的 pyconfig.h 文件中做出修改两处。(搜索:pyconfig.h ,实际主要搜索是Anaconda3目录下,我的pyconfig.h两处在(1)C:UserswangAnaconda3include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://#       define Py_DEBUG;(2)C:UserswangAnaconda3pkgspython-3.7.0-hea74fb7_0include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://#       define Py_DEBUG;)  试了,成功!!!

注意:我试了只修改法一,法二(1)处仍会报错无法打开文件"python37_d.lib" 。

方案十:更改python参考:1)LNK1104 无法打开文件“python37_d.lib” 解决办法——https://blog.csdn.net/weixin_43788499/article/details/84933210

2)Win10 OpenCV3.3.0+VS2013配置大坑,OpenCV解决方案编译报错“找不到python36_d.lib”错误——https://www.cnblogs.com/qilin20/p/10987398.html

具体实现:第一步:去掉Anaconda的路径。(我删除了系统环境变量:C:UserswangAnaconda3;C:UserswangAnaconda3Scripts;C:UserswangAnaconda3Libraryin;C:UserswangAnaconda3Librarymingw-w64in)

     第二步:重新安装Python,确保你安装了python的debug版本,勾选最后一项Download debug binaries(requires VS 2015 or later),然后install。(Python官网:https://www.python.org/,下载了python-3.6.5-amd64.exe,安装参看:https://baijiahao.baidu.com/s?id=1606573927720991570&wfr=spider&for=pc,在高级选项中勾选最后一项Download debug binaries(requires VS 2015 or later)

     第三步:检查Python的系统环境变量,若第二步没有添加,添加为新安装python的。(手动添加了系统环境变量:D:ProgramFilesPython36

     第四步:方案八(官网:opencv-3.4.1-vc14_vc15.exe+opencv_contrib-3.4.1.zip+vs 14 2015 win32)配置,INSTALL生成时没有报错(错误0,警告66),成功

     第五步:测试代码Issue11报错:由于找不到 opencv_world341d.dll,无法继续执行代码

         解决方案:D:ProgramFilesOpenCV3.4.1opencvmybuildinstallx86vc14in3个后缀是.dll(opencv_world341d.dll,opencv_ffmpeg341.dll,opencv_img_hash341d.dll)应用程序扩展复制到C:WindowsSysWOW64中,重新运行,成功!(参看:由于找不到 opencv_world320.dll,无法继续执行代——https://www.cnblogs.com/ganjiqi/p/8651350.html
         注意:64位系统用户需要注意,32位的DLL文件放在【C:WindowsSysWOW64】,64位的DLL文件放在“【C:WindowsSystem32】。

 

  由于不用了Anaconda的python,更换了python,x86也成功了,所以,需要测试之前的方案。

   目前测试方案一方案三仍然fail,即INSTALL生成时 报错100多项 警告100多项

综上,方案九(x64)、方案十(x86)成功!

方案九(x64):Anaconda3(python3.7.0),配置x64可以,x86报错模块计算机类型“x64”与目标计算机类型“X86”冲突

方案十(x86):python3.6.5,配置x86和x64都可以。推荐!!!

方案十配置过程:

步骤一:下载python3.6.5+opencv3.4.1+opencv_contrib+cmake

    一、下载地址汇总(OpenCV+OpenCV_contrib+CMake)+方案十具体实现

步骤二:Cmake编译

    Issue3+Issue4+Issue6

步骤三:生成库文件

    见Issue7

步骤四:配置系统环境变量和工程

    见Issue9

步骤五:测试项目

    见Issue11+Issue12

总结:(1)Win10+vs2015+opencv3.4.1+附加模块opencv_contrib+cmake3.11.0编译和配置——https://elody-07.github.io/opencv3.4.1+contrib+cmake3.11.0/#2-opencv3-4-1

 VS2015编译只能用下载编译好的cv3.x,而不能用下载好的opencv-master.zip。要使用下载编译好的cv3.x!!!有的博客这块有错误!

   (2)在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib——https://www.cnblogs.com/jliangqiu2016/p/5597501.html

里面说明了:1)由于现在官方的opencv3.1.0要在x64上使用,而且在visual studio2013包括本身以后的平台上使用,怎么让其在以前的版本使用,也可以在x86机子上跑呢?这也就是要CMake的原因之一

      2)CMake编译工具的选择:第一次导出时需要设置后面用来编译此OpenCV.sln工程的VS的版本(这里特别要注意的是,自己机器上是否装有相应的VS版本,如果没有装,还是要编译就会出错,可能是找不到对应的工具原因,以及选择X86和X64),这里用的是VS 2015,也可以选择Visual Studio 10,就能在VS2010上使用:

      3)debug版本和release版本的区别:release版本需要用动态链接库?参看OpenCV:Debug和Release模式 && 静态和动态编译——https://www.cnblogs.com/king-lps/p/7758050.html

Issue3:1)CMake如何操作?2)Cmake编译第一次编译完成后会显示编译opencv所需要的参数。在Name为OPENCV_EXTRA_MODULES_PATH的Value中填入opencv_contrib-3.0.0的路径/modules(我的为:D:ProgramFilesOpenCV3opencvopencv_contrib-3.4.1modules),添加后报错?3)Cmake编译第一次编译后需要更改哪些参数?4)第二次编译注意事项?

1)CMake使用?

答:安装cmake后,打开bin目录下的cmake-gui.exe
where is the source code输入opencv地址/sources地址
where to build the libraries输入保存编译结果的地址
点击Configure选择对应自己电脑上的VS版本的编译器,对于VS2015来说,32位的选择Visual Studio 14 2015,64位的选择Visual Studio 14 2015 Win64,点击finish后自动进行第一次编译

2)路径问题!

答:windows系统的路径问题,是“”,而CMake路径应为“/”,所以更改为D:/ProgramFiles/OpenCV3/opencv/opencv_contrib-3.4.1/modules

3)Cmake编译第一次编译后需要更改哪些参数?

答:四个参数:

1)选择 BUILD_opencv_world;
2)OPENCV_EXTRA_MODULES_PATH 中要填入contrib-master下的modules目录;一定要是“/”
3)选择OPENCV_ENABLE_NONFREE
4)去掉BUILD_opencv_hdf——第一次编译后找不到,第二次编译后才能找到!

参考:OpenCV4.0群的VS+opencv配置文档:Windows环境下最新OpenCV代码的-下载-编译-使用(2018-9重制).pptx

4)第二次编译注意事项

答:在第一次编译后更改完四个参数后,第二次编译完后一定要检查一下参数列表,如果参数列表还有红色标记的条目输出栏是否有报错(红色,主要是下载失败,参见Issue6,就再尝试几次configure,直到所有条目都是白色为止。

Issue4:Cmake编译好的个人建议?后面再忙活都是白干!没有xfeatures2d这类的文件?

答:【该步骤是个人建议】检查一下附加模版是否成功编译并加入到opencv中。如果附加模块opencv_contrib并未成功编译到opencv中,那后面再忙活都是白干。因为后面的步骤都比较费时,而且最终到了使用SIFT的时候才会发现附加模块增加失败,而且难以锁定原因,必须返回来逐步检查。所以个人建议不要跳过这一步,很简单
方法:进入where to build the binaries中设置的目录,然后进入modules,查看一下是否有xfeatures2d这类的文件。这类文件是属于附加模版opencv_contrib的,如果没有,请检查一下CMake中参数列表里,OPENCV_EXTRA_MODULES_PATH的Value是否为opencv_contrib-3.0.0的路径/modules,如果不是,请重新设置OPENCV_EXTRA_MODULES_PATH的Value为opencv_contrib-3.0.0的路径/modules,然后重新configure、generate。如果附加模块opencv_contrib并未成功编译到opencv中,那后面就够忙活的了,后面更费时,而且最终会配置失败,还难以想到。

(我检查了我的路径D:ProgramFilesOpenCV3opencvmybuildmodules下没有xfeatures2d这类的文件,一直重新configure、generate还是没有,最后在D:ProgramFilesOpenCV3opencvmybuildmodules.firstpass下找到了,不知道是不是更改了,反正和网上说的不太一样,在modules下的.firstpass文件夹下。)

参考:【图像处理】windows 10 + vs2015+ opencv3.0.0 +附加模块opencv_contrib编译和配置——https://blog.csdn.net/chentravelling/article/details/59540828

Issue5:Win10 OpenCV3.3.0+VS2013配置大坑,OpenCV解决方案编译报错“找不到python36_d.lib”错误——https://www.cnblogs.com/qilin20/p/10987398.html

答:方案十给出,CMake配置时一定要注意Python的安装路径。在此说明VS配置若一直失败,一定要更改Python。

Issue6:关于CMke配置的问题:opencv_ffmpeg.dll;opencv_ffmpeg_64.dll;face_landmark_model.dat一直下载失败?

答:打开mybuild下CMakeDownloadLog.txt,里边有下载链接,把链接传至手机下载后,再把文件传到CMakeDownloadLog.txt中说明的文件夹下。

(我的CMakeDownloadLog.txt路径是D:ProgramFilesOpenCV3opencvmybuild,下载完成后opencv_ffmpeg.dll;opencv_ffmpeg_64.dll放置D:ProgramFilesOpenCV3opencvmybuild3rdpartyffmpeg下,face_landmark_model.dat放置D:ProgramFilesOpenCV3opencvmybuild estdatacvface下,注意这里可能没有testdata,cv,face文件夹,按照CMakeDownloadLog.txt给出的路径依次建立即可。

Issue7:VS2015在解决方案资源管理器中找到CMake Targets,右键点击“生成”的问题?

答:步骤一: 在解决方案资源管理器中找到CMake Targets,右键点击“生成”(大概40分钟,我的电脑比较渣,50分钟呢)。
  步骤二:生成成功后,如果在mybuild文件夹中还没有出现一个名为install的文件夹,回到VS界面,右击INSTALL->仅用于项目->仅生成INSTALL,再次生成成功后就会出现install文件夹

   (我的路径是D:ProgramFilesOpenCV3opencvmybuild,经检查,mybuild下有了install文件夹。)

但是我使用的是:

  步骤一:在“解决方案'OpenCV'(100多个项目)”上面点击右键-->重新生成解决方案。(也得接近45分钟呢。)
  步骤二:找到CMakeTargets中的INSTALL,然后右键选择“仅限于项目”-->“仅生成INSTALL”,然后就在D:ProgramFilesOpenCV3opencvmybuildinstall中多了许多东东。

参看:Windows环境下编译OpenCV3.0和OpenCV_contrib【原创】——https://segmentfault.com/a/1190000003496009

Issue8:无法打开文件 无法打开文件‘python37_d.lib’?

答:生成INSTALL时,我碰到过的问题,问题是:无法打开文件‘python37_d.lib’

原因是我之前在电脑上安装了Anaconda3,openCV用Cmake编译时都检测到了。解决方法是打开python3对应的pyconfig.h文件,做两处修改。

(搜索:pyconfig.h ,实际主要搜索是Anaconda3目录下,我的pyconfig.h两处在(1)C:UserswangAnaconda3include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://#       define Py_DEBUG;(2)C:UserswangAnaconda3pkgspython-3.7.0-hea74fb7_0include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://#       define Py_DEBUG;)

 在方案九中的法二已有说明!

Issue9:添加系统环境变量?

答:在计算机-环境变量-path中增加CMake:where to build the binaries中设置的路径installx64vc14in

(我的是D:ProgramFilesOpenCV3opencvmybuildinstallx64vc14in)

Issue10:配置新的工程?

答:打开VS2015,新建一个工程
找到属性管理器->Debug|x64->右击Microsoft.Cpp.x64.user->属性
1)VC++目录-包含目录
<where to build the binaries中设置的路径>installinclude
<where to build the binaries中设置的路径>installincludeopencv
<where to build the binaries中设置的路径>installinclude<opencv2>
2)VC++目录-库目录
<where to build the binaries中设置的路径>installx64vc14lib
3)链接器-输入-附加依赖项
这里添加的.lib文件都需要出现在<where to build the binaries中设置的路径>installx64vc14lib 中。如果lib文件被添加到附加依赖项里,但是上述文件夹中没有该lib文件,会出现找不到XXX.lib的错误。

(我的where to build the binaries中设置的路径是D:ProgramFilesOpenCV3opencvmybuild)

Issue11:测试?

答:在工程项目中新建一个cpp,记得添加到工程里。输入如下代码:

#include <iostream>  
#include <opencv2/core/core.hpp>  
#include<opencv2/highgui/highgui.hpp>  
using namespace cv;

int main()
{
    Mat img = imread("D:/Working/opencvimg/lena.jpg");//读入一张图片,更改为自己电脑需要调用的图片的路径和图片名称。
    namedWindow("Test");     //创建一个名为Test窗口
    imshow("Test", img);   //窗口中显示图像
    waitKey(5000);            //等待5000ms后窗口自动关闭
}

选择Debug,x64,运行代码。

三、主要参考链接:

1)Win10+vs2015+opencv3.4.1+附加模块opencv_contrib+cmake3.11.0编译和配置——https://elody-07.github.io/opencv3.4.1+contrib+cmake3.11.0/#2-opencv3-4-1

2)【图像处理】windows 10 + vs2015+ opencv3.0.0 +附加模块opencv_contrib编译和配置——https://blog.csdn.net/chentravelling/article/details/59540828

3)opencv3.0中contrib模块的添加——https://blog.csdn.net/streamchuanxi/article/details/51044929

4)Opencv3.0和contribute模块的下载 编译 安装——https://blog.csdn.net/u012462822/article/details/49100025#comments

5)在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib——https://www.cnblogs.com/jliangqiu2016/p/5597501.html

以上Issue是关于VS2015配置opencv3.0中contrib模块的,以下Issue针对项目。

四、项目Issue:

Issue12:测试SIFT代码?

答:在工程项目中新建一个cpp,记得添加到工程里。输入如下代码:

#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>
#include <iostream>

using namespace cv::xfeatures2d;
using namespace std;
using namespace cv;
// 计算图像的SIFT特征及匹配
float cacSIFTFeatureAndCompare(cv::Mat srcImage1,
    cv::Mat srcImage2, float paraHessian)
{
    CV_Assert(srcImage1.data != NULL && srcImage2.data != NULL);
    // 转换为灰度
    cv::Mat grayMat1, grayMat2;
    cv::cvtColor(srcImage1, grayMat1, CV_RGB2GRAY);
    cv::cvtColor(srcImage2, grayMat2, CV_RGB2GRAY);
    // 初始化SIFT检测描述子
    cv::Ptr<Feature2D> sift = xfeatures2d::SIFT::create();
    
    // 关键点及特征描述矩阵声明
    vector<cv::KeyPoint> keyPoints1, keyPoints2;
    cv::Mat descriptorMat1, descriptorMat2;
        
    sift->detectAndCompute(grayMat1, Mat(), keyPoints1, descriptorMat1);
    sift->detectAndCompute(grayMat2, Mat(), keyPoints2, descriptorMat2);
    float result = 0;
    // 特征点匹配
    if (keyPoints1.size() > 0 && keyPoints2.size() > 0)
    {
        // 计算特征匹配点
        cv::FlannBasedMatcher matcher;
        vector< cv::DMatch > matches;
        std::vector<cv::DMatch> viewMatches;
        matcher.match(descriptorMat1, descriptorMat2, matches);
        // 最优匹配判断
        double minDist = 100;
        for (int i = 0; i < matches.size(); i++)
        {
            if (matches[i].distance < minDist)
                minDist = matches[i].distance;
        }
        // 计算距离特征符合要求的特征点
        int num = 0;
        std::cout << "minDist: " << minDist << std::endl;
        for (int i = 0; i < matches.size(); i++)
        {
            // 特征点匹配距离判断
            if (matches[i].distance <= 2 * minDist)
            {
                result += matches[i].distance * matches[i].distance;
                viewMatches.push_back(matches[i]);
                num++;
            }
        }
        // 匹配度计算
        result /= num;
        // 绘制特征点匹配结果
        cv::Mat matchMat;
        cv::drawMatches(srcImage1, keyPoints1,
            srcImage2, keyPoints2, matches, matchMat);
        cv::imshow("matchMat", matchMat);
        cv::waitKey(0);
    }
    return result;
}
int main()
{
    // 读取源图像及待匹配图像
    cv::Mat srcImage1 =
        cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpg", 1);
    if (srcImage1.empty())
        return -1;
    cv::Mat srcImage2 =
        cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand3.jpg", 1);
    if (srcImage2.empty())
        return -1;
    float matchRate = cacSIFTFeatureAndCompare(srcImage1, srcImage2, 1000);
    std::cout << "matchRate: " << matchRate << std::endl;
    return 0;
}
OpenCV_SIFT

测试SURF代码?

在工程项目中新建一个cpp,记得添加到工程里。输入如下代码:

#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>
#include <iostream>

using namespace cv::xfeatures2d;
using namespace std;
using namespace cv;

// 计算图像的SURF特征及匹配
float cacSURFFeatureAndCompare(cv::Mat srcImage1,
    cv::Mat srcImage2, float paraHessian)
{
    CV_Assert(srcImage1.data != NULL && srcImage2.data != NULL);
    // 转换为灰度
    cv::Mat grayMat1, grayMat2;
    cv::cvtColor(srcImage1, grayMat1, CV_RGB2GRAY);
    cv::cvtColor(srcImage2, grayMat2, CV_RGB2GRAY);
    // 初始化SURF检测描述子
    cv::Ptr<Feature2D> surf = xfeatures2d::SURF::create();
    
    // 关键点及特征描述矩阵声明
    vector<cv::KeyPoint> keyPoints1, keyPoints2;
    cv::Mat descriptorMat1, descriptorMat2;
        
    surf->detectAndCompute(grayMat1, Mat(), keyPoints1, descriptorMat1);
    surf->detectAndCompute(grayMat2, Mat(), keyPoints2, descriptorMat2);
    float result = 0;
    // 特征点匹配
    if (keyPoints1.size() > 0 && keyPoints2.size() > 0)
    {
        // 计算特征匹配点
        cv::FlannBasedMatcher matcher;
        vector< cv::DMatch > matches;
        std::vector<cv::DMatch> viewMatches;
        matcher.match(descriptorMat1, descriptorMat2, matches);
        // 最优匹配判断
        double minDist = 100;
        for (int i = 0; i < matches.size(); i++)
        {
            if (matches[i].distance < minDist)
                minDist = matches[i].distance;
        }
        // 计算距离特征符合要求的特征点
        int num = 0;
        std::cout << "minDist: " << minDist << std::endl;
        for (int i = 0; i < matches.size(); i++)
        {
            // 特征点匹配距离判断
            if (matches[i].distance <= 2 * minDist)
            {
                result += matches[i].distance * matches[i].distance;
                viewMatches.push_back(matches[i]);
                num++;
            }
        }
        // 匹配度计算
        result /= num;
        // 绘制特征点匹配结果
        cv::Mat matchMat;
        cv::drawMatches(srcImage1, keyPoints1,
            srcImage2, keyPoints2, matches, matchMat);
        cv::imshow("matchMat", matchMat);
        cv::waitKey(0);
    }
    return result;
}
int main()
{
    // 读取源图像及待匹配图像
    cv::Mat srcImage1 =
        cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpg", 1);
    if (srcImage1.empty())
        return -1;
    cv::Mat srcImage2 =
        cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand3.jpg", 1);
    if (srcImage2.empty())
        return -1;
    float matchRate = cacSURFFeatureAndCompare(srcImage1, srcImage2, 1000);
    std::cout << "matchRate: " << matchRate << std::endl;
    return 0;
}
OpenCV_SURF

注意:(1)选择Debug,x64,运行代码。

   (2)图片的路径!(我的图片中设置的路径是D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpgD:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand3.jpg

参考:《OpenCV图像处理编程实例》朱伟等著

Issue13:运行SIFT/SURF代码错误?

答:若选择Debug,x86报错:LNK1104    无法打开文件“opencv_img_hash341d.lib”

原因:编译时配置的是x64,而x86无法调用x64的包

解决:编译时配置x86,但还未实验,在前面的方案中配置x86失败了,提示:模块计算机类型“x64”与目标计算机类型“X86”冲突

  若选择Release,x64报错:发生生成错误,无法解析的外部符号。

原因:Issue10:配置新的工程中属性管理器->Debug|x64->右击Microsoft.Cpp.x64.user->属性,只配置了Debug|x64

解决:配置新的工程中属性管理器->Release|x64->右击Microsoft.Cpp.x64.user->属性

原文地址:https://www.cnblogs.com/Alliswell-WP/p/opencv3OfcontribAdd.html