2

C++ でビルドされた DLL があり、Mat オブジェクトを返します。その画像情報は 384*384*24 色です。

C# コード

Bitmap a = new Bitmap(384, 384, 3 * 384, PixelFormat.Format24bppRgb, test1());
pictureBox0.Image = a;

C++ コード

uchar*  DLL_EXPORT test1(void)
{
    Mat OriginalImg = imread("c:\\20100812133.jpg", 1 );

    return OriginalImg.data;
}

コード上は問題ありませんが、画像を灰色で読みたいです。画像処理(例:Threshod)を行い、色に変換し、C# に戻って表示します。

C++ コード

uchar*  DLL_EXPORT test0(void)
{
    Mat OriginalImg = imread("c:\\20100812133.jpg", 0 );
    threshold(OriginalImg,OriginalImg,0,255,THRESH_OTSU);
    cvtColor(OriginalImg,OriginalImg,CV_GRAY2BGR);
    return OriginalImg.data;
}

C++ コードが失敗しました。助けてもらえますか?


アップデータ http://ppt.cc/h2SI写真が失敗です。原因はメモリだと思います。C# コードの 3 番目のパラメーター 3*384 を 2*384 に修正します。C# は正常に実行されますが、画像は次のように壊れていますhttp://ppt.cc/IRfd

-- 更新

Bitmap a = new Bitmap(384, 384, 1 * 384, PixelFormat.Format24bppRgb, test0());
Bitmap a = new Bitmap(384, 384, 2 * 384, PixelFormat.Format24bppRgb, test0());
Bitmap a = new Bitmap(384, 384, 3 * 384, PixelFormat.Format24bppRgb, test0());

Bitmap a = new Bitmap(384, 384, 2 * 384, PixelFormat.Format32bppRgb, test0());
Bitmap a = new Bitmap(384, 384, 3 * 384, PixelFormat.Format32bppRgb, test0());
Bitmap a = new Bitmap(384, 384, 4 * 384, PixelFormat.Format32bppRgb, test0());

私は6を試して、実行はOKですが、画像は壊れています。

4

2 に答える 2

1

すでに解放されているローカル変数へのポインターを返しているため、信頼できません。

コンストラクターがその内容をコピーできるように、Matオブジェクトが十分長く存続するように調整する必要があります。Bitmap最も簡単な方法は、C++/CLI を使用することです。その後、C++ から .NET ビットマップを返すことができます。

Bitmap^ MyImageProcessor::test0(void)
{
    Mat OriginalImg = imread("c:\\20100812133.jpg", 0 );
    threshold(OriginalImg,OriginalImg,0,255,THRESH_OTSU);
    cvtColor(OriginalImg,OriginalImg,CV_GRAY2BGR);
    return gcnew Bitmap(384,
                        384,
                        3 * 384,
                        PixelFormat.Format24bppRgb,
                        IntPtr(OriginalImg.data)
                       );
}
于 2012-07-23T16:36:02.180 に答える
0

imreadの成功を確認しましたか?

Mat OriginalImg = imread("c:\\20100812133.jpg", 0 );
if(OriginalImg.empty())
    return NULL;

そして C# で (私が書いたコードは必ずしも正しいとは限らないことに注意してください。しかし、あなたはアイデアを得るでしょう)

char* imgData = test1;

if(imgData == Null)
{
 // do something smart
}

Bitmap a = new Bitmap(384, 384, 3 * 384, PixelFormat.Format24bppRgb, imgData);
pictureBox0.Image = a;

これは、プログラミングで最も頻繁に犯す間違いの 1 つであり、最も厄介な間違いの 1 つです。

于 2012-07-23T14:47:38.810 に答える