从C+返回Mat+;VB.Net的动态链接库 我在C++中编写了一个函数,它接受一个Mat类对象,并在处理后返回一个Mat。我想将其集成到用VB.NET编写的UI中
我用C编写了这个代码段++从C+返回Mat+;VB.Net的动态链接库 我在C++中编写了一个函数,它接受一个Mat类对象,并在处理后返回一个Mat。我想将其集成到用VB.NET编写的UI中,c++,.net,vb.net,opencv,C++,.net,Vb.net,Opencv,我用C编写了这个代码段++ extern "C" _declspec(dllexport) Mat cropImage(Mat matA){ Mat matB = processingObject.doSomething(matA); return matB; } 处理对象。剂量测量(matA)工作正常 如何在VB中使用此dll?我不介意更改C++代码来实现这项工作。 谢谢 更新> 找到了解决该问题的方法。但不是我想要的100% C++ extern "C" __decls
extern "C" _declspec(dllexport) Mat cropImage(Mat matA){
Mat matB = processingObject.doSomething(matA);
return matB;
}
处理对象。剂量测量(matA)工作正常
如何在VB中使用此dll?我不介意更改C++代码来实现这项工作。
谢谢
更新>
找到了解决该问题的方法。但不是我想要的100%
C++
extern "C" __declspec(dllexport) int* cropImage(char* path, int& size)
{
Mat matA = pavObj.cropped_liquid_region(path);
int rows = matA.rows;
int cols = matA.cols;
int channels = matA.channels();
int length = rows*cols*channels + 3;
size = length;
int* arr = new int[length];
arr[0] = rows;
arr[1] = cols;
arr[2] = channels;
Mat layer[3];
split(matA, layer); // split into color layers BGR
int count = 3;
for(int i=0;i<3;i++){
for(int j=0;j<layer[i].rows;j++){
for(int k=0;k<layer[i].cols;k++){
arr[count] = layer[i].at<uchar>(j, k);
count++;
}
}
}
return arr;
}
extern "C" __declspec(dllexport) int ReleaseMemory(int* pArray)
{
delete[] pArray;
return 0;
}
因此,基本上发生的是,图像的内容被带到一个1D数组中,并传递到管理端,在管理端再次重建图像。您需要使用C端的DllImport调用来调用
要点是,您需要像这样导入dll:
<System.Runtime.InteropService.DllImport("mat.dll", _
SetLastError:=True, CharSet:=CharSet.Auto)> _
<< VB Signature of your cropImage function >>
_
>
您可能还需要进行一些参数编组,以便在VB和C++之间“翻译”Mat类型。谢谢Martin,您能提供编组代码和VB签名吗?我是cpp、vb互操作的业余爱好者。
Dim size As Integer
Dim ptr As IntPtr = cropImage(path, size)
Dim result(size) As Integer
Marshal.Copy(ptr, result, 0, size)
ReleaseMemory(ptr)
<System.Runtime.InteropService.DllImport("mat.dll", _
SetLastError:=True, CharSet:=CharSet.Auto)> _
<< VB Signature of your cropImage function >>