我有一個使用OpenCV的C++/CLI項目。我自己在VS 2010中編譯了這個版本的OpenCV,我可以在沒有問題的情況下在非託管項目中使用它 - 當我試圖在託管項目中使用它時,麻煩就開始了。將STL字符串從C++/CLI應用程序傳遞到C++ DLL
感興趣的功能是cv::imread(std::string&, int)
。只需從管理模塊調用它就根本不起作用,在接收端生成<無效指針>。我有點期待它。畢竟,託管代碼有自己的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);
}
嗯,你沒有顯示任何託管代碼,就像你通過你的文件路徑。也許你可以避開這個問題,通過傳遞一個'const char *'而不是一個字符串,並且在調用imread時將它留給調用的字符串ctor? – berak 2013-02-22 12:58:55
代碼片段用於我的非託管模塊。當調用函數「Run」時,managed-> native轉換髮生。不幸的是,'imread'接受一個字符串引用,並且據我所知,在我身邊建立字符串是沒有辦法的。而且,這不是唯一的情況 - OpenCV始終使用字符串和向量。 – 2013-02-22 14:23:47