折腾了好几天,终于把opencv3.1加上一个额外的包opencv_contrib编译好了。(总体来说编译opencv就是填坑!!!)

最后我编译成功的是mingw版本的。也就是结合了Qt4.7+cmake3.4.3+mingw4.8(Qt自带)。所以先说这个版本的。

1、关于cmake,一定不要用现在的最新版3.5的,我在这个坑里周旋了不知道多少天,知道看到下面这篇文章,才知道是cmake的问题!

http://blog.csdn.net/xizero00/article/details/50823020

然后使用的3.4.3,不管是用mingw编译还是VS的msvc这都是一个问题。所以一定要选用低版本的cmake!

2、关于编译器,分别尝试过MSVC2013,用VS来编译;还有mingw(自己装了一个,可惜和qt里面的不一样,所以最后编译出来的也不能用)。

我的qt里面的编译器是4.8.1的,然后自己装的是4.9的,在cmake第一步configure的时候,如果指定本地的(就是自己手贱装的),就不行!

需要自己指定编译器,那就是安装的qt目录下的mingw下的bin,分别指点gcc和g++;并且要把这个bin路径添加到环境变量中,并重启计算机,不然是不会生效的。

忘了在哪看到的说,在cmd下echo %path%,就可以看到自己添加的环境变量,但是就算看到也不一定生效了。开始不知道,所以一直以为自己的qt里面的mingw有问题,

也是被坑了好久。所以一定要用qt自带的mingw。

然后configure的时候勾选上WITH_QT和WITH_OPENGL。然后在为变量OPENCV_EXTRA_MODULES_PATH指定下载下来的opencv_contrib包,下载地址:

https://github.com/Itseez/opencv_contrib/

设置为这个包的路径为:..\opencv_contrib-master\modules

这样configure完了之后就generation

最后在生成的二进制代码的文件夹下打开dos

使用mingw32-make 来编译,最后mingw32-make install 来安装。

================================================================================

至于为什么要添加这个额外包opencv_contrib,是为了使用SURF、SIFT等这些在早期2.x版本里面还可以直接使用的图像特征匹配算法,在opencv3里面已经没有了,所以要添加。最后使用SURF实现了一下匹配,代码如下:

 #include <QtGui/QApplication>
#include "mainwindow.h"
#include <opencv/cv.h>
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w; cv::Mat imgs1 = cv::imread("d:/picture/detect1.png");
cv::Mat imgs2 = cv::imread("d:/picture/detect2.png");
if(imgs1.empty())
{
std::cout<<"read image fail";
}
if(imgs2.empty())
{
std::cout<<"read image fail";
}
cv::cvtColor(imgs1,imgs1,CV_BGR2GRAY);
cv::cvtColor(imgs2,imgs2,CV_BGR2GRAY);
cv::Ptr<cv::xfeatures2d::SURF> detector = cv::xfeatures2d::SURF::create(); cv::Mat result1,result2;
std::vector<cv::KeyPoint> key1,key2;
cv::BFMatcher matcher;
std::vector<cv::DMatch> matches;
detector->detectAndCompute(imgs1,cv::Mat(),key1,result1);
detector->detectAndCompute(imgs2,cv::Mat(),key2,result2);
matcher.match(result1,result2,matches); cv::Mat img_matches;
cv::drawMatches(imgs1,key1,imgs2,key2,matches,img_matches); cv::imshow("Matches",img_matches); // cv::Mat img = cv::imread("D:/picture/build3.jpg");
// cv::Mat image; //// //convert to gray
// cv::cvtColor(img,image,CV_BGR2GRAY);
// std::vector<cv::KeyPoint> keypoints;
// cv::Ptr<cv::xfeatures2d::SURF> detector = cv::xfeatures2d::SURF::create(800);
// detector->detect(image,keypoints); // cv::drawKeypoints(image,keypoints,image,cv::Scalar::all(255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); // cv::imshow("surf",image);
cv::waitKey();
w.show(); return a.exec();
}

其中SURF的定义和之前的不一样了,它是直接通过xfeature2d这个命名空间来create的。实现的效果如下:

总体来说,是使用了BFMather来匹配,还有其他的匹配的类,比如FlannBasedMatcher等。还需要继续研究。

只是希望以后编译opencv能不再有那么多坑!

对了,用MSVC2013编译之后没有错误,运行哪些图像的imread和imshow等基本的也没有问题,只是在使用SURF的detect函数的时候,程序总是崩溃。还未找到解决办法,有待继续研究。发生的错误如下:

0x000007FEDC7D2289 (opencv_xfeatures2d310d.dll) (surfOpencv.exe 中)处的第一机会异常:  0xC0000005:  写入位置 0x000000000000001C 时发生访问冲突。
0x000007FEDC7D2289 (opencv_xfeatures2d310d.dll) (surfOpencv.exe 中)处有未经处理的异常:  0xC0000005:  写入位置 0x000000000000001C 时发生访问冲突。

截个图:

希望知道是怎么回事的朋友指点。

opencv3.1 + opencv_contrib编译记事(win7下)的更多相关文章

  1. Win7下VS2008编译QtiPlot

    Win7下VS2008编译QtiPlot By wangsh 2011-11-25 QtiPlot 是一款开源免费的科学绘图软件,可运行在多个平台(windows.Linux等)中,从功能上讲,Qti ...

  2. 如何为Android平台编译 opencv3 和 opencv_contrib (Linux)

    编译出来的opencv库有问题,正在调试中 ...... 本文以编译opencv 3.3.0 和 opencv_contrib 3.3.0为例,系统为 Linux x64 (Fedora 21),具体 ...

  3. win7下使用cygwin编译VLC

     win7下使用cygwin编译VLC http://kathy.blog.51cto.com/1168050/295460 2010-04-15 14:54:01 标签:编译 休闲 VLC 职场 w ...

  4. mongodb及mongoclient在win7下的编译和使用

    1.导言 折腾mongodb几个小时最终有结果了.呃.如今就简单总结一下. 事实上我的需求非常easy,就是在C++代码中调用mongodb的库函数.也就是要得到mongoclient.lib.本来想 ...

  5. opencv3.2+opencv_contrib+cmake

    转自原文 opencv3.2+opencv_contrib+cmake 心得体会 初学OpenCV发现opencv3.2(下载链接在附录)是没有xfeatures2d等模块的.第三方库opencv_c ...

  6. Windows驱动开发技术详解HelloWDM例子win7下无法安装

    HelloWDM例子编译完成之后,在win7下安装显示 查看setupapi.dev看到如下信息 这个C:\MyDriver_Check目录完全不是我指定的,我放到c盘根目录下 查看inf [Sour ...

  7. win7下安装Sass和compass

    由于项目需要我们使用到sass来编译css文件.本人在win7下开发 由于国内安装sass遇到了一些困难,后来不得不网查询,后来终于解决了,这里介绍一下 1.要安装sass环境必须要先安装rubyIn ...

  8. 64位WIN7下安装MPICH2

    1.首先,下载32位的MPICH2,(注意哦,是32位,不是64位) http://202.117.4.228/files/B117000000042632/www.mcs.anl.gov/resea ...

  9. win7下IIS配置以及域名映射方法

    win7下IIS配置以及域名映射方法 第一步:打开控制面板,选择程序与功能,如下图: 第二步:双击打开程序与功能面板,如下图: 第三步:打开”打开或关闭windows功能”(红线圈起来的地方),如下图 ...

随机推荐

  1. oracle user account locked

    1.Question describe when you use account scott/tiger connect to oracle, you will see "the user ...

  2. Python on VS Code

    install python extension Press F1, and input "ext install python". Then the icon at the le ...

  3. html格式化

    解决方法是: 在myeclipse中是这样解决的: 点击 myeclipse菜单栏的 window选项卡,找到下拉 perferences 选项 , 在里面快捷 "搜索" 框里面输 ...

  4. php面试题之一——PHP核心技术(高级部分)

    一.PHP核心技术 1.写出一个能创建多级目录的PHP函数(新浪网技术部) <?php /** * 创建多级目录 * @param $path string 要创建的目录 * @param $m ...

  5. SFTP和FTS协议的区别

    都是为FTP连接加密,协议非常相似.一个是借助SSL协议加密,一个时借助SSH协议加密.SSL是为HTTP/SMTP等加密设计的:SSH是为TELNET/FTP等加密.建立传输通道而设计的.其实SSH ...

  6. [Xamarin.Android] 发布NuGet套件

    [Xamarin.Android] 发布NuGet套件 前言 在Xamarin中,可以将自己开发的项目包装成为NuGet套件发布至NuGet Server,来提供其他开发人员使用.本篇介绍如何封装并发 ...

  7. css超出2行部分省略号...

    今天做东西,遇到了这个问题,百度后总结得到了这个结果. 首先,要知道css的三条属性. overflow:hidden; //超出的文本隐藏 text-overflow:ellipsis; //溢出用 ...

  8. linux常识以及常用命令和参数

    linux,it人士众所周知,一款稳定.强大.开源的系统,1973年,unix正式诞生,ritchie等人用c语言写出第一个unix内核,之后经过不后人不断的改进,形成现在linux的各个版本,其中比 ...

  9. andriod CheckBox

    <?xml version="1.0" encoding="UTF-8"?> <LinearLayout android:orientatio ...

  10. R语言学习笔记:字符串处理

    想在R语言中生成一个图形文件的文件名,前缀是fitbit,后面跟上月份,再加上".jpg",先不百度,试了试其它语言的类似语法,没一个可行的: C#中:"fitbit&q ...