本人的环境配置为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语言 static 关键字 2023-03-26
- C语言 详解字符串基础 2023-03-27
- C语言实现宾馆管理系统课程设计 2023-03-13
- C++实现ETW进行进程变动监控详解 2023-05-15
- centos 7 vscode cmake 编译c++工程 2023-09-17
- C++实战之二进制数据处理与封装 2023-05-29
- C语言编程C++旋转字符操作串示例详解 2022-11-20
- [C语言]二叉搜索树 2023-09-07
- 带你深度走入C语言取整以及4种函数 2022-09-17
- [c语言-函数]不定量参数 2023-09-08