平台: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:\Windows\System32\drivers\etc并打开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:\opencv3\build下找到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%\bin;%MYSQL_HOME%\bin\;D:\Working\buildOpenCV\bin;D:\ProgramFiles\gtk_-bundle_2.24.10_win32\bin;D:\ProgramFiles\MinGW-V5.1.6\MinGW\bin重试了方案一二三四
 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:\Users\wang\Anaconda3\libs,复制粘贴后命名为python37_d.lib;(2)C:\Users\wang\Anaconda3\pkgs\python-3.7.0-hea74fb7_0\libs,复制粘贴后命名为python37_d.lib)试了,生成不报错,重新生成还是报错!

法二:在 Anaconda3 的 pyconfig.h 文件中做出修改两处。(搜索:pyconfig.h ,实际主要搜索是Anaconda3目录下,我的pyconfig.h两处在(1)C:\Users\wang\Anaconda3\include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://#       define Py_DEBUG;(2)C:\Users\wang\Anaconda3\pkgs\python-3.7.0-hea74fb7_0\include,记事本打开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:\Users\wang\Anaconda3;C:\Users\wang\Anaconda3\Scripts;C:\Users\wang\Anaconda3\Library\bin;C:\Users\wang\Anaconda3\Library\mingw-w64\bin)

     第二步:重新安装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:\ProgramFiles\Python36)

     第四步:按方案八(官网: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:\ProgramFiles\OpenCV3.4.1\opencv\mybuild\install\x86\vc14\bin3个后缀是.dll(opencv_world341d.dll,opencv_ffmpeg341.dll,opencv_img_hash341d.dll)应用程序扩展复制到C:\Windows\SysWOW64中,重新运行,成功!(参看:由于找不到 opencv_world320.dll,无法继续执行代——https://www.cnblogs.com/ganjiqi/p/8651350.html
         注意:64位系统用户需要注意,32位的DLL文件放在【C:\Windows\SysWOW64】,64位的DLL文件放在“【C:\Windows\System32】。

 

  由于不用了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:\ProgramFiles\OpenCV3\opencv\opencv_contrib-3.4.1\modules),添加后报错?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:\ProgramFiles\OpenCV3\opencv\mybuild\modules下没有xfeatures2d这类的文件,一直重新configure、generate还是没有,最后在D:\ProgramFiles\OpenCV3\opencv\mybuild\modules\.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:\ProgramFiles\OpenCV3\opencv\mybuild,下载完成后opencv_ffmpeg.dll;opencv_ffmpeg_64.dll放置D:\ProgramFiles\OpenCV3\opencv\mybuild\3rdparty\ffmpeg下,face_landmark_model.dat放置D:\ProgramFiles\OpenCV3\opencv\mybuild\testdata\cv\face下,注意这里可能没有testdata,cv,face文件夹,按照CMakeDownloadLog.txt给出的路径依次建立即可。)

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

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

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

但是我使用的是:

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

参看: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:\Users\wang\Anaconda3\include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://#       define Py_DEBUG;(2)C:\Users\wang\Anaconda3\pkgs\python-3.7.0-hea74fb7_0\include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://#       define Py_DEBUG;)

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

Issue9:添加系统环境变量?

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

(我的是D:\ProgramFiles\OpenCV3\opencv\mybuild\install\x64\vc14\bin)

Issue10:配置新的工程?

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

(我的where to build the binaries中设置的路径是D:\ProgramFiles\OpenCV3\opencv\mybuild)

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 = ;
// 特征点匹配
if (keyPoints1.size() > && keyPoints2.size() > )
{
// 计算特征匹配点
cv::FlannBasedMatcher matcher;
vector< cv::DMatch > matches;
std::vector<cv::DMatch> viewMatches;
matcher.match(descriptorMat1, descriptorMat2, matches);
// 最优匹配判断
double minDist = ;
for (int i = ; i < matches.size(); i++)
{
if (matches[i].distance < minDist)
minDist = matches[i].distance;
}
// 计算距离特征符合要求的特征点
int num = ;
std::cout << "minDist: " << minDist << std::endl;
for (int i = ; i < matches.size(); i++)
{
// 特征点匹配距离判断
if (matches[i].distance <= * 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();
}
return result;
}
int main()
{
// 读取源图像及待匹配图像
cv::Mat srcImage1 =
cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpg", );
if (srcImage1.empty())
return -;
cv::Mat srcImage2 =
cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand3.jpg", );
if (srcImage2.empty())
return -;
float matchRate = cacSIFTFeatureAndCompare(srcImage1, srcImage2, );
std::cout << "matchRate: " << matchRate << std::endl;
return ;
}

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 = ;
// 特征点匹配
if (keyPoints1.size() > && keyPoints2.size() > )
{
// 计算特征匹配点
cv::FlannBasedMatcher matcher;
vector< cv::DMatch > matches;
std::vector<cv::DMatch> viewMatches;
matcher.match(descriptorMat1, descriptorMat2, matches);
// 最优匹配判断
double minDist = ;
for (int i = ; i < matches.size(); i++)
{
if (matches[i].distance < minDist)
minDist = matches[i].distance;
}
// 计算距离特征符合要求的特征点
int num = ;
std::cout << "minDist: " << minDist << std::endl;
for (int i = ; i < matches.size(); i++)
{
// 特征点匹配距离判断
if (matches[i].distance <= * 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();
}
return result;
}
int main()
{
// 读取源图像及待匹配图像
cv::Mat srcImage1 =
cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpg", );
if (srcImage1.empty())
return -;
cv::Mat srcImage2 =
cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand3.jpg", );
if (srcImage2.empty())
return -;
float matchRate = cacSURFFeatureAndCompare(srcImage1, srcImage2, );
std::cout << "matchRate: " << matchRate << std::endl;
return ;
}

OpenCV_SURF

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

   (2)图片的路径!(我的图片中设置的路径是D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpg和D:/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->属性

opencv3.0中contrib模块的添加+实现SIFT/SURF算法的更多相关文章

  1. 【OpenCV】opencv3.0中的SVM训练 mnist 手写字体识别

    前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的 ...

  2. Android 6.0中在/dev下添加新设备驱动下Selinux相关设置【转】

    本文转载自:https://blog.csdn.net/fantasy_wxe/article/details/52013922 错误1: 07-23 13:06:57.617   117   117 ...

  3. 在OpenCV3.1.0中使用SIFT,SURF算法

    写在前边: 1.我使用的是python2.7 + OpenCV3.1.0 2.OpenCV3.0.0+的文档有很大问题,很多文档写的还是OpenCV2.0+, OpenCV3.0+根本用不了,其中有一 ...

  4. opencv3.0配置opencv_contrib

    在opencv3.0中无法直接使用sift,surf等特征点检测算子,需要额外配置opencv_contrib. 在查看网上诸多教程,失败n次后,终于找到了正确的配置方式. visual studio ...

  5. Windows环境中编译opencv3.0同时加入OPENCV_contrib库及解决遇到相关问题[contrib 必须要3.1以上的opencv才支持了]

    更新:现在contrib库必须要opencv3.1以上才能支持编译通过了. 方法和步骤还是和本篇文章一样. ############################################## ...

  6. OpenCV3.1.0中调用MHI(Motion History Images, 运动历史图像)

    写在前边: OpenCV3.0+要想使用MHI,就要现安装扩展模块opencv_contrib.安装方法见:ubuntu 14.04 64位 安装Opencv3.1.0 (包含opencv_contr ...

  7. VC++ 6.0中添加库文件和头文件

    附加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Include files. 对于特定项目的头文件包含,在& ...

  8. VC6.0中添加库文件和头文件

    附加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Include files. 对于特定项目的头文件包含,在“ ...

  9. VC 6.0中添加库文件和头文件 【转】

    本文转载自:http://blog.sina.com.cn/s/blog_9d3971af0102wxjq.html 加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools&g ...

随机推荐

  1. JAVA 基础编程练习题28 【程序 28 排序算法】

    28 [程序 28 排序算法] 题目:对 10 个数进行排序 程序分析:可以利用选择法,即从后 9 个比较过程中,选择一个最小的与第一个元素交换, 下次类推,即 用第二个元素与后 8 个进行比较,并进 ...

  2. XHProf报告字段含义

    Function Name:方法名称. Calls:方法被调用的次数. Calls%:方法调用次数在同级方法总数调用次数中所占的百分比. Incl.Wall Time(microsec):方法执行花费 ...

  3. 【ARTS】01_29_左耳听风-201900527~201900602

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  4. 日记 进程 ip /端口

    查看日记: tail -f  log.txt       循环查看 cat  info         查看文件 less info           查看文件 head -n 10 /vv/v  ...

  5. 360再报丑闻,派遣黑客盗取ESET安全软件病毒库,法院已经介入调查

    360再报丑闻,派遣黑客盗取ESET安全软件病毒库,联合法院已经介入调查.360于2019/3/10日通过非法途径试图盗取ESET安全软件100MB的病毒库,ESET立即反抗,360黑客电脑立即崩溃, ...

  6. 【amad】cookiecutter -- 一个命令行工具,使用项目模版来构建项目

    动机 简介 个人评分 动机 一般的框架都有脚手架工具,但是并不会让所有人满意. 简介 cookiecutter1是一个Python实现的命令行工具,可以通过项目模版来构建项目. 它的特性包括: 跨平台 ...

  7. Git速成学习第五课:分支管理策略

    Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/ 通常合并分支时,如果可能用Fast forward模式,但是在这种模式下,删除分支后,会丢掉分支 ...

  8. DataNode 详解及HDFS 2.X新特性

    1. 工作机制 一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳. DataNode 启动后向 Name ...

  9. SQL Server数据库语法(一)

    --创建数据库 DB_CYITcreate database DB_CYITON(name='DB_CYIT',--主文件逻辑名称filename='G:\data\DB_CYIT.mdf', --文 ...

  10. 【jmeter测试范例】001——TCP测试

    1.打开Jmeter(或者运行NewDriver.java启动Jmeter) 2.新建一个测试计划 ······ 3.新建线程组 4.设置线程组的参数 1.线程的数量 2.要在多久内完成,即每个请求发 ...