VS2017+opencv3.4.4+contrib3.4.4+cmake的尝试经历(2)

续前

5 未经处理的异常,内存报错

某一次报错:0x00007FFE4911A388 处(位于 Project1.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x0000005CD2BCC3B8 处。

另一次报错:0x00007FFE7EEAA388 处(位于 Project1.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x0000003C9473C168 处。

貌似每次运行的报错都在内存位置不同,其他一样。

停在system.cpp(c:\opencv_3.4.4\sources\modules\core\src\system.cpp)的1028行“throw exc”处,红色禁止符号“×”,如图
VS2017+opencv3.4.4+contrib3.4.4+cmake的尝试经历(2)_第1张图片
打断点查到是这句导致的:

cv::Ptr<cv::xfeatures2d::SurfFeatureDetector> ptrSURF = cv::xfeatures2d::SurfFeatureDetector::create(2000.0);

这句在书上描述如下:

SURF 特征检测属于opencv_contrib库,在编译OpenCV 时包含了附加模块才能使用,详见第1 章。这里将重点讨论cv::xfeatures2d 模块和它的cv::xfeatures2d::SurfFeature Detector 类。和其他检测器一样,检测兴趣点之前要先创建检测器实例,然后调用它的检测方法:

// 创建SURF 特征检测器对象
cv::Ptr<cv::xfeatures2d::SurfFeatureDetector> ptrSURF = cv::xfeatures2d::SurfFeatureDetector::create(2000.0);
// 检测关键点
ptrSURF->detect(image,keypoints);

怀疑点:

  1. 环境配置的问题(废话,无头绪)

  2. 依赖项的问题,把debug和release都加d结尾的试试 依赖项的问题,把debug和release都加d结尾的试试
    a) 查我的库,发现只有debug的lib,怀疑是release没有lib导致,就准备在release下也编译一次查我的库,发现只有debug的lib,怀疑是release没有lib导致,就准备在release下也编译一次
    b) 后来发现opencv还没编译release版本,又重复了一边前面的编译历程
    c) 最终放弃这个线索

  3. 内存溢出的问题,网上与这个报错相关的解决大多是说内存问题,所以有点怀疑代码本身问题

  4. 后来发现就是SURF和SIFT算法有问题(xfeatures2d库里面的),但是用FREAK算法却没事(也是xfeatures2d),区别就在于前两者是nonfree头文件的

  5. 后来又从网上搜到SURF和SIFT属于nonfree模块[https://blog.csdn.net/zhoukehu_CSDN/article/details/83145026],要在CMAKE中勾选opencv_enable_nonfree选项才能用,逼着我又重走一遍库的编译,最后真的解决了问题!
    VS2017+opencv3.4.4+contrib3.4.4+cmake的尝试经历(2)_第2张图片

6 当前不会命中断点,源代码与原始版本不同

因为之前加断点的代码用来查上一个问题,有修改过的,我回退到原始版本后,发现断点无法命中,报“当前不会命中断点,源代码与原始版本不同”。解决方法,参考[https://blog.csdn.net/xxdddail/article/details/18696399]用了方法三,重新生成解决方案,最靠谱,搞定。

7 总结我的整个正确的步骤

  1. 因为我原来是用exe安装opencv的,所以原来的库都能用,除了contrib里的没有,所以现在安装contrib,为了可以回退,先备份原来的build文件夹后,新建一个build文件夹。
  2. 用cmake按照指南(指南漏了说勾选 “opencv _enable _nonfree”)配置路径,多次重复configure直到成功(期间要去掉一些不要的库),然后generate。
  3. 然后用cmake的open project按键调用vs2017,自动打开cmake生成的sln文件,然后重新生成解决方案,历时半小时。
  4. 然后在解决方案资源管理器窗口的模块树中选中CMakeTargets->INSTALL(这是146个项目中的一个叫INSTALL的项目->右键->仅用于项目->仅生成INSTALL。
  5. 重新按照指南配置系统环境变量、包含路径、库路径、依赖项这几个参数。
  6. 编译并运行包括contrib库的工程,没问题。

你可能感兴趣的:(opencv)