OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 13093|回复: 13

VS2013编译opencv3.1+opencv_contrib成功,但调用SURF算法出错。

[复制链接]
发表于 2016-3-22 11:06:24 | 显示全部楼层 |阅读模式
我采用的MSVC2013编译opencv3.1+opencv_contib,是为了使用这个extra_modules里面的SURF、SIFT等算法,在编译成功之后,一般的图像读出(imread)、显示(imshow)都没有问题,可是在#include <opencv2/xfeatures2d/nonfree.hpp>之后使用SURF算法检测时,程序出现崩溃,调试的结果显示,确实是关于opencv_xfeatures2d310的问题。
0x000007FEDC7D2289 (opencv_xfeatures2d310d.dll) (surfOpencv.exe 中)处的第一机会异常:  0xC0000005:  写入位置 0x000000000000001C 时发生访问冲突。
0x000007FEDC7D2289 (opencv_xfeatures2d310d.dll) (surfOpencv.exe 中)处有未经处理的异常:  0xC0000005:  写入位置 0x000000000000001C 时发生访问冲突。

我不知道这到底是编译出来的库的问题,还是程序的问题?我的程序如下:
  1. #include <opencv/cv.h>
  2. #include <opencv2/opencv.hpp>
  3. #include <opencv2/xfeatures2d.hpp>
  4. #include <opencv2/xfeatures2d/nonfree.hpp>
  5. #include <iostream>
  6. using namespace cv;
  7. using namespace xfeatures2d;
  8. int main()
  9. {
  10.         Mat  image1 = imread("D:/picture/build3.jpg",IMREAD_GRAYSCALE);
  11.         Mat  image2 = imread("D:/picture/surf2.jpg", IMREAD_GRAYSCALE);
  12.         if (image1.empty())
  13.         {
  14.                 printf("read picture failed!");
  15.                 return 0;
  16.         }
  17.         if (image2.empty())
  18.         {
  19.                 printf("read picture failed!");
  20.                 return 0;
  21.         }
  22.        
  23.         /*
  24.         Ptr<xfeatures2d::SURF> detector = xfeatures2d::SURF::create(800);
  25.         cv::BFMatcher matcher;
  26.         Mat c, d;
  27.         std::vector<cv::KeyPoint> key1, key2;
  28.         std::vector<DMatch> matches;
  29.         std::cout << "noo ";
  30.         detector->detectAndCompute(image1, Mat(), key1, c);
  31.         detector->detectAndCompute(image2, Mat(), key2, d);
  32.         */
  33.         std::vector<KeyPoint> keypoints;
  34.         Ptr<SURF> surf;
  35.         surf = SURF::create(800);
  36.         std::cout << "yes ";
  37.         surf->detect(image1, keypoints);
  38.         std::cout << "noo ";
  39.         //drawKeypoints(image1, keypoints, image1, cv::Scalar::all(255), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

  40.         imshow("image", image1);       
  41.         cv::waitKey(0);
  42.         return 0;
  43. }
复制代码
经过调试,确定是surf调用detect的时候出现了问题;或者是detectAndCompute的时候,程序都会崩溃。
求帮助!
回复

使用道具 举报

发表于 2016-3-22 12:36:59 | 显示全部楼层
本帖最后由 yzbx 于 2016-3-22 12:43 编辑

我用的opencv2, 没有用opencv_contrib, 可以用直接用surf
opencv3 的话,surf 也不应该在opencv_contrib 吧?
印象中,surf 已经成熟了,已经不在测试包opencv_contrib中了。

我用的surf的类:SurfFeatureDetector
头文件:
#include <opencv2/nonfree/features2d.hpp>
#include <opencv2/nonfree/nonfree.hpp>

参考:http://www.360doc.com/content/11/1116/17/3054335_164862648.shtml
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-22 13:55:34 | 显示全部楼层
yzbx 发表于 2016-3-22 12:36
我用的opencv2, 没有用opencv_contrib, 可以用直接用surf
opencv3 的话,surf 也不应该在opencv_contrib 吧 ...

谢谢楼主解答。我知道在低版本的中可以直接使用,下面的是我下载的额外包,里面是有surf算法的。
https--github.com/Itseez/opencv_contrib/blob/master/modules/xfeatures2d/src/surf.cpp
如果实在不行就退回到2点几吧。。
回复 支持 反对

使用道具 举报

发表于 2016-3-22 17:02:28 | 显示全部楼层
楼主你好,我也遇到了跟你一样很神奇的事情,暂时帮不上忙,同寻解决办法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-22 17:38:25 | 显示全部楼层
pool 发表于 2016-3-22 17:02
楼主你好,我也遇到了跟你一样很神奇的事情,暂时帮不上忙,同寻解决办法 ...

恩。确实很无语。我重新用qt自带的mingw重新编译一个mingw版本的。可以使用。要注意的是,一定要用qt自带的mingw,然后要将mingw的bin目录添加到path中,并且重启计算机。之前也这样尝试过,但是没有重启计算机,不然的话用cmake来configure的时候一直有错误,说指定的gcc、g++不可用。然后cmake的版本记得选低版本的,3.5的生成的makefile在编译opencv_contrib会有个bioinspired模块编译不过。我用的cmake3.4.
回复 支持 反对

使用道具 举报

发表于 2016-3-22 21:03:40 | 显示全部楼层
whitelee 发表于 2016-3-22 17:38
恩。确实很无语。我重新用qt自带的mingw重新编译一个mingw版本的。可以使用。要注意的是,一定要用qt自带 ...

嗯,你说的cmake确实是注意点,我后来编译注意到了,因为这报错一直提示xfeatures2d310d.dll的问题,所以我尝试运行release版本,竟然可以运行!!!!可能是debug版本的dll文件有问题,而xfeatures2d310.dll没有问题,总之暂时使用release版本吧
回复 支持 反对

使用道具 举报

发表于 2016-7-12 18:19:12 | 显示全部楼层
楼主请问opencv3.1怎么配置额外库,有没有步骤,我是一个刚接触这个的~~弄了好久没有成功,用的c++
回复 支持 反对

使用道具 举报

发表于 2016-7-12 19:53:03 | 显示全部楼层
楼主你好,请问你是怎么编译opencv_contrib,有没有教程,我卡这里好几天了
回复 支持 反对

使用道具 举报

发表于 2016-9-10 14:20:31 | 显示全部楼层
opencv 3.0 开始把 sift surf library 移动到  <xfeature2d\nonfree.hpp>里, 需要include 头文件。

当然makefile 时一定要加上 contrib 那个一起编译。

使用方法和orb 很像

// 创建方式为 sift 和 surf 方式一样 xfeatures2d::sift 可以申请
Ptr <xfeatures2d::SURF> detector = xfeatures2d::SURF::create(50, 1, 1, false, false);

keypoint initial
detector->detect(srcImage1, keyPoint1);
detector->detect(srcImage2, keyPoint2);

compute initial
detector->compute(srcImage1, keyPoint1, descriptorMat1);
detector->compute(srcImage2, keyPoint2, descriptorMat2);

FlannBasedMatcher matcher;

std::vector<DMatch> mathces;
matcher.match(descriptorMat1, descriptorMat2, mathces);

Mat matchMat;
drawMatches(srcImage1, keyPoint1,
srcImage2, keyPoint2, mathces, matchMat);
cv::imshow("Mathces", matchMat);



回复 支持 反对

使用道具 举报

发表于 2016-10-5 11:56:29 | 显示全部楼层
前一阵子刚搞定,有什么问题可以找我
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-5-7 17:57 , Processed in 0.011309 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表