opencvc++图像导出到c#

Opencv c++ image export to c#

本文关键字:图像 opencvc++      更新时间:2023-10-16

我试图写我自己的c++插件在Unity3d中使用它。在我完成帧处理后,我想将其导出到Unity并分配给Texture2d,但我得到了一个红色的问号纹理和传递给c#的数据看起来像:"

c++ DLL代码:
extern "C" int EXPORT_API GetJpeg(unsigned char* *data, int* size)
cv::Mat myMat(frame);
std::vector<int> p;
p.push_back(CV_IMWRITE_JPEG_QUALITY);
p.push_back(10);
std::vector<unsigned char> buf;
cv::imencode(".jpg", myMat, buf, p);
*data = &buf.front();
*size = buf.size();
p.clear();
myMat.release();
if (buf.size() > 0)
{
    return 1;
}
return 0;

DLL导入

[DllImport("OpenCVPlugin")]
static extern int GetJpeg(out IntPtr data, out int size);

更新功能
if(capture < 1)
    {
        capture = StartCapture(camIndx);
        camIndx++;
    }
    process = ProcessFrame();
    int hr = 0;
    IntPtr frameData = IntPtr.Zero;
    int gSize = 0;
    hr = GetJpeg(out frameData, out gSize);
    byte[] arr = new byte[gSize];
    if(arr != null && gSize > 0)
    {
        Marshal.Copy(frameData, arr, 0, gSize);
        tex = new Texture2D(400,400);
        tex.LoadImage(arr);
        DisplayPlane.renderer.material.mainTexture = tex;
    }

我做错了什么?请帮助。

出错的一件事是GetJPEG中的'但是'在GetJPEG返回时被销毁,因此您返回一个指向释放内存的指针。

你可以在GetJPEG中使用一个全局缓冲区,或者显式地传递一个缓冲区。