本人的环境配置为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++接口的支持问题
基础教程推荐
- 利用QT设计秒表功能 2023-05-30
- VisualStudio2010安装教程 2023-01-05
- C语言植物大战数据结构二叉树递归 2023-04-09
- 05-C语言进阶——动态内存管理 2023-11-20
- 纯C++代码详解二叉树相关操作 2023-05-15
- g++: const 丢弃限定符 2022-10-07
- C语言的三种条件判断语句你都了解吗 2023-03-05
- C语言数组长度的计算方法实例总结(sizeof与strlen) 2023-04-26
- Qt数据库应用之实现通用数据库请求 2023-03-18
- character-encoding – Linux中最常见的C语言编码(和Unix?) 2023-11-21
