我有一个使用 OpenCV 的 C++/CLI 项目。我自己在 VS 2010 中编译了这个版本的 OpenCV,我可以在非托管项目中毫无问题地使用它——当我尝试在托管项目中使用它时,问题就开始了。
感兴趣的函数是cv::imread(std::string&, int)
。简单地从托管模块调用它根本不起作用,在接收端产生 <invalid pointer>。我有点期待它。毕竟,托管代码有自己的std::string
实现。
当我创建一个单独的 C++ 文件、从其模块中删除 CLI 支持并将我的代码放入其中时,事情变得更有趣了。现在,imread
得到了一个有效的指针,但它的内容被打乱了。显然,string
我正在传递它包含偏移 4 个字节的字符串指针,但它希望它位于 0 偏移量。
非托管模块使用与 OpenCV 相同的 CRT DLL,并将所有选项设置为适合正常 OpenCV 使用的值。为什么会有不同的string
布局?我搞不清楚了。
示例代码:
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <string>
using namespace cv;
using namespace std;
void Run()
{
string path("C:\\Users\\Don Reba\\Pictures\\Merlin 1D.jpg");
Mat image(imread(path, CV_LOAD_IMAGE_GRAYSCALE));
imwrite("image.jpg", image);
}