本人的环境配置为Win7+VS2005+OpenCV2.3,最近被此问题,即OpenCV的C++接口频频出现运行时错误(runtime error),在实验室的其他机子上也测试过,会出现如下情况://简单的一段代码Mat image=imread(“4_gray.bmp”)...
本人的环境配置为Win7+VS2005+OpenCV2.3,最近被此问题,即OpenCV的C++接口频频出现运行时错误(runtime error),在实验室的其他机子上也测试过,会出现如下情况:
//简单的一段代码
Mat image=imread(“4_gray.bmp”);
Mat与imread属于OpenCV的C++接口,运行这一段简单的代码时,会跳出内存错误,调试时根据调用堆栈跳到imread函数时,发现参数const string& filename根本无法传入值,显示为<bad ptr>。如果使用OpenCV的C接口,如cvLoadImage等,则完全没有问题。
这样的C++接口问题还表现为,在使用solvePnP、calibrateCamera等C++接口函数时,由于这些函数定义时某些参数类型为InputArry,如果以vector<Point3f>类型(或者其他一些与vector有关类型)传入时,函数内部获取数据时,会出现数据丢失的情况,使用kind()获取类型时也无法正确获取。
解决方法:由于CMake编译OpenCV2.3源代码时,生成的工程的属性中有其中一项:C/C++->Code Generation->Runtime Library中配置的是Multi-threaded Debug DLL(MDd),但是在现有的新建的OpenCV实验工程中,该项的配置为Multi-threa 大专栏 解决在Windows对OpenCV C++接口的支持问题ded (/MT),所以会造成运行时错误。只要把该项改成Multi-threaded Debug DLL(MDd)即可:
下面说说这四个选项的不同:
Multi-threaded (/MT),静态链接方式,链接时会载入libcmt.lib;
Multi-threaded Debug (/MTd),上者的debug版本,链接时载入libcmtd.lib;
Multi-threaded DLL (/MD),动态链接方式,使用 msvcrt.lib 创建多线程 DLL;
Multi-threaded Debug DLL (/MDd),上者的debug版本,使用 msvcrtd.lib创建多线程DLL;
可以看出,四种不同的编译参数,载入的lib也不同,这样编译出来的dll和lib也会不同,所以OpenCV的实验工程要选择和编译OpenCV源代码时相同的编译参数,也要注意debug版本的工程要选择debug版本的编译参数,release版本的要选择release版本的编译参数。
还要拜谢stackoverflow的神贴及神回复啊,神贴在此。
本文标题为:解决在Windows对OpenCV C++接口的支持问题
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- Qt计时器使用方法详解 2023-05-30
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- Easyx实现扫雷游戏 2023-02-06
- C语言详解float类型在内存中的存储方式 2023-03-27
- C++ 数据结构超详细讲解顺序表 2023-03-25
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- ubuntu下C/C++获取剩余内存 2023-09-18
- C语言qsort()函数的使用方法详解 2023-04-26