ネイティブおよび管理構造はそれほど成功し、管理/管理対象外の境界を越えて構造体を渡すと、データの整合性を維持するために追加の手順が必要になり、メモリでは異なってレイアウトされています。 (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;
}
次に、このようにあなたの関数をラップ