折腾了好几天,终于把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. 泛函编程(12)-数据流-Stream

    在前面的章节中我们介绍了List,也讨论了List的数据结构和操作函数.List这个东西从外表看上去挺美,但在现实中使用起来却可能很不实在.为什么?有两方面:其一,我们可以发现所有List的操作都是在 ...

  2. Hibernate的初步

    1.简介 在java开发领域,基于数据库应用的设计与实现一直都是面向关系的,Hibernate对象/关系映射ORM框架的出现为java面向对象开发提供了易于使用的数据持久化解决方案. ORM介绍: ( ...

  3. Erlang 内存泄漏分析

    随着项目越来越依赖Erlang,碰到的问题也随之增加.前段时间线上系统碰到内存高消耗问题,记录一下troubleshooting的分析过程.线上系统用的是Erlang R16B02版本. 问题描述 有 ...

  4. ahjesus让nodejs支持dotjs模板

    经过几天的实验加搜索,终于知道一个中间件可以解决这个问题了 npm install consolidate consolidate传送门 传送门2使用说明传送门快照:ahjesus Since doT ...

  5. ahjesus mongodb指定到数据盘连接不上的解决方案

    关于配置路径指定到数据盘会出现连接不上的情况 我发现是因为数据盘权限不足引起的,目前没找到治本的方法 有个治标的方法就是设置数据盘的权限和用户 sudo chmod 777 * -R  /path/d ...

  6. SQL数据库基础(九)

    变量: SQL语言也跟其他编程语言一样,拥有变量.分支.循环等控制语句. 在SQL语言里面把变量分为局部变量和全局变量,全局变量又称系统变量. 局部变量: 使用declare关键字给变量声明,语法非常 ...

  7. SQLSERVER数据库表各种同步技术

    1 --SQLSERVER数据库表各种同步技术 减少SQLServer中每次的同步数据量 2 3 --说到数据库,我就不由地想到同步数据,如何尽可能地减少每次的同步数据量,以此来提高同步效率,降低对网 ...

  8. ABAP 表格控制(Table Control)和步循环

    表格控制(Table Control)和步循环     1.两个标准Demo: SAPMTZ60,SAPMTZ61 2.简介 3.建立Table Control程序的基本流程 4.使用步循环 5.表格 ...

  9. ARC-数据类型需要释放的情况

    // Foundation :  OC// Core Foundation : C语言// Foundation和Core Foundation框架的数据类型可以互相转换的 //NSString *s ...

  10. C语言-11-可变参数的实现方案

    概述 某种情况下,我们可能需要一个具有可变参数的函数,C语言提供了一种标准的实现可变参数的方法 C语言实现可变参数的方案是基于标准库的 可变参数的类型 可变参数可以放在一个集合中,可以使用指针类型的参 ...