2017-05-09 118 views
0

我正在編寫一個在C#中使用C++代碼的包裝器)。將Cv :: Mat從C++傳遞到C#(託管)

我有一個函數應該返回到C#的cv::Mat,但我找不到一種方法將Mat傳遞給C#。

例子:

我想有這樣的事情:

cv::Mat MyProject::ReturnColorMat() 
{ 
    return _colorMat; 
} 

我知道C#正在與Emgu,有沒有兩者之間的轉換?

我試着通過了Matbyte array,那有效,但我想通過Mat本身。

這可能嗎?

回答

0

您可以在C#中創建一個COM接口,並生成一個.tlb文件,該文件可以在C++中使用 像這樣,您可以使用相同的接口來引用託管對象。

C#

[ComVisible(true)] 

    [Guid("12345678-3914-41F0-BB26-122986A93788")] 

    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 

    public interface IMat 
    {...} 

    public class ManagedMat : IMat 
    {...} 

    [DllImport("cppProjectname.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)] 
    public static extern int call2Cpp(IMat obj); 

C++

#import "projectname.tlb" no_registry raw_interfaces_only 

// use IMat to access the ManagedMat object 
extern "C" int __declspec(dllexport) call2Cpp(IMat obj) 
{...} 
0

本土和管理結構不同的內存佈局,因此順利通過跨託管/非託管邊界結構,需要額外的步驟來保護數據的完整性。 (see here

一種可能性是轉換CV ::墊在C++端位圖,比獲得使用的PInvoke
在C++側C#中的位圖,你可以使用此功能,從here

CBitmap* IplImageToCBitmap(IplImage* img) 
{ 
    CDC dc; 
    CDC memDC; 

    if (!dc.CreateDC("DISPLAY", NULL, NULL, NULL)) 
     return NULL; 

    if (!memDC.CreateCompatibleDC(&dc)) 
     return NULL; 

    CBitmap* bmp = new CBitmap(); 
    CBitmap* pOldBitmap; 

    bmp->CreateCompatibleBitmap(&dc, img->width, img->height); 
    pOldBitmap = memDC.SelectObject(bmp); 

    CvvImage cvImage; // you will need OpenCV_2.2.0- to use CvvImage 
    cvImage.CopyOf(img); 
    cvImage.Show(memDC.m_hDC, 0, 0, img->width, img->height, 0, 0); 
    cvImage.Destroy(); 

    memDC.SelectObject(pOldBitmap); 
    memDC.DeleteDC(); 
    dc.DeleteDC(); 

    return bmp; 
} 
採取

,然後換你的函數以這種方式

extern "C" __declspec(dllexport) HRESULT WrappedFunction(HBITMAP * hBitmap); 

HRESULT WrappedFunction(/*[out]*/ HBITMAP * hBitmap) 
{ 
    cv::Mat aMat = YourFunction(); 

    CBitmap *bmp = IplImageToCBitmap((IplImage*) &aMat); 

    *hBitmap = (HBITMAP)bmp->Detach(); 

    return S_OK; 
} 

然後,在C#側,你可以這樣做:

IntPtr ret; 
WrappedFunction(out ret); 
Bitmap b = Image.FromHbitmap(ret); 
相關問題