2

Mat のサイズを変更すると、opencv の Mat で奇妙なことが起こっています。

これは opencv のヘッダーです。最初に、ビジュアル C# のマネージ コードからポインターを受け取ります。

 unsigned char *  PointerImage( unsigned char*  matData, int widht)

私はopencvのポインタからMatを作成します:

 cv::Mat OriginalImg(Size(widht,widht),CV_8UC3,matData);

サイズ変更を適用せず、ビジュアル C# でプログラムに作成されたマットにポインターを送信すると、正常に動作し、ビジュアル C# で画像を表示できます。

 unsigned char *data = OriginalImg.data;

サイズ変更を適用して画像を大きくすると、問題が発生します。

cv::resize( OriginalImg, OriginalImg, size(270,270));

今、私は画像を見ることができません。

ここにコード全体があります:

  unsigned char *  PointerImage( unsigned char*  matData, int widht){

    cv::Mat OriginalImg(Size(widht,widht),CV_8UC3,matData);
    cv::resize( OriginalImg, OriginalImg, size);
    unsigned char *data = OriginalImg.data;

    return data;

}

サイズ変更を適用するときのポインターについて疑問があります。ありがとう。

4

1 に答える 1

1

ユーザー@berakはまったく正しいです。コードにメモリ リークがあります。関数内で作成したローカル変数データへのポインタを返すことはできません。プログラムが PointerIMage 関数のスコープから出ると、OriginalImg オブジェクトのデストラクタが起動されます。メモリが解放され、OriginalImg.data も解放され、このポインターが使用できなくなります。

C++コードでグローバル変数を使用することを検討するか(実際には良い解決策ではありません)、後でc#で使用できるクラスにC++コードをカプセル化してください(.NET形式のネイティブコードを呼び出す方法によって異なります)。

于 2014-03-27T20:14:43.710 に答える