zoukankan      html  css  js  c++  java
  • opencv3.1 + opencv_contrib编译记事(win7下)

        折腾了好几天,终于把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-mastermodules

        这样configure完了之后就generation

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

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

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

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

     1 #include <QtGui/QApplication>
     2 #include "mainwindow.h"
     3 #include <opencv/cv.h>
     4 #include <opencv2/opencv.hpp>
     5 #include <opencv2/xfeatures2d.hpp>
     6 #include <opencv2/xfeatures2d/nonfree.hpp>
     7 
     8 int main(int argc, char *argv[])
     9 {
    10     QApplication a(argc, argv);
    11     MainWindow w;
    12 
    13 
    14     cv::Mat imgs1 = cv::imread("d:/picture/detect1.png");
    15     cv::Mat imgs2 = cv::imread("d:/picture/detect2.png");
    16     if(imgs1.empty())
    17     {
    18         std::cout<<"read image fail";
    19     }
    20     if(imgs2.empty())
    21     {
    22         std::cout<<"read image fail";
    23     }
    24     cv::cvtColor(imgs1,imgs1,CV_BGR2GRAY);
    25     cv::cvtColor(imgs2,imgs2,CV_BGR2GRAY);
    26     cv::Ptr<cv::xfeatures2d::SURF> detector = cv::xfeatures2d::SURF::create(10000);
    27 
    28     cv::Mat result1,result2;
    29     std::vector<cv::KeyPoint> key1,key2;
    30     cv::BFMatcher matcher;
    31     std::vector<cv::DMatch> matches;
    32     detector->detectAndCompute(imgs1,cv::Mat(),key1,result1);
    33     detector->detectAndCompute(imgs2,cv::Mat(),key2,result2);
    34     matcher.match(result1,result2,matches);
    35 
    36     cv::Mat img_matches;
    37     cv::drawMatches(imgs1,key1,imgs2,key2,matches,img_matches);
    38 
    39     cv::imshow("Matches",img_matches);
    40 
    41 
    42 
    43 
    44 
    45 
    46 //    cv::Mat img = cv::imread("D:/picture/build3.jpg");
    47 //    cv::Mat image;
    48 
    49 ////    //convert to gray
    50 //    cv::cvtColor(img,image,CV_BGR2GRAY);
    51 //    std::vector<cv::KeyPoint> keypoints;
    52 //    cv::Ptr<cv::xfeatures2d::SURF> detector = cv::xfeatures2d::SURF::create(800);
    53 //    detector->detect(image,keypoints);
    54 
    55 //    cv::drawKeypoints(image,keypoints,image,cv::Scalar::all(255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
    56 
    57 //    cv::imshow("surf",image);
    58     cv::waitKey(0);
    59     w.show();
    60     
    61     return a.exec();
    62 }

        其中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 时发生访问冲突。

    截个图:

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

  • 相关阅读:
    Java面试题:==运算符与equals方法的区别
    STS或eclipse中导入新项目出现红色感叹号红色叉叉的问题
    SpringBoot+SpringDataJpa快速上手(基本CRUD)
    Java-数组拷贝
    Java-数组拷贝
    最小高度树Java版本(力扣)
    macOS安装minikube
    测试面试LeetCode系列:字符串的左旋转
    测试面试LeetCode系列:按既定顺序创建目标数组
    systemd的文件描述符限制引发的问题
  • 原文地址:https://www.cnblogs.com/leewhite/p/5308183.html
Copyright © 2011-2022 走看看