2017-05-09 69 views
0

C#でC++コードを使用するためのラッパーを作成しています。C++からC#(管理対象)にcv :: Matを渡す

cv::MatをC#に戻す関数がありますが、MatをC#に渡す方法が見つかりません。

例:

私はこのような何かを持っているしたいと思います:

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

私はC#のEmguと協力して、両者の間の変換があることを知っていますか?

Matbyte arrayを渡そうとしましたが、うまくいきましたが、Matに渡したいと思います。

これは可能ですか?

答えて

0

C#でCOMインターフェイスを作成し、C++で使用できる.tlbファイルを生成する このように、管理対象オブジェクトを参照するために同じインターフェイスを使用できます。

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

可能性が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; 
} 
から取られ、CV ::マットC++側で、あなたはこの機能を使用することができますC++側でのPInvoke
を使用してC#でビットマップを得るよりも、ビットマップに変換することです

IntPtr ret; 
WrappedFunction(out ret); 
Bitmap b = Image.FromHbitmap(ret); 

、その後はあなたが行うことができますC#の側に、

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

次に、このようにあなたの関数をラップ

関連する問題