• 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->属性

  • 相关阅读:
    Objects in this class cannot be updated outside
    操作系统原理好书推荐
    Can't initialize OCI
    比较好的GIS blog
    栅格数据开发
    arcgis 本地地图服务 silverlight 调用报错 .
    (转载)Rasterdataset Load data耗时
    网络达人梁宏达
    arcengine总结(1)栅格数据开发
    MyNPOI V1.2发布并开放源码,让.NET Excel导出将简单进行到底【转】
  • 原文地址:https://www.cnblogs.com/Alliswell-WP/p/opencv3OfcontribAdd.html
Copyright © 2020-2023  润新知