Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C+返回Mat+;VB.Net的动态链接库 我在C++中编写了一个函数,它接受一个Mat类对象,并在处理后返回一个Mat。我想将其集成到用VB.NET编写的UI中_C++_.net_Vb.net_Opencv - Fatal编程技术网

从C+返回Mat+;VB.Net的动态链接库 我在C++中编写了一个函数,它接受一个Mat类对象,并在处理后返回一个Mat。我想将其集成到用VB.NET编写的UI中

从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

我用C编写了这个代码段++

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 >>