0

Windows フォームで OpenCV を使用しようとしています。グローバル cv::Mat オブジェクトを作成し、他の関数が使用するオブジェクトを期待しています。ただし、グローバル cv::Mat オブジェクトを初期化して関数を終了/返すたびに、グローバル cv::Mat オブジェクトの値が不明な理由で自動的に変更されます。

1 つのサンプル コード スニペットは次のようになります。

private: cv::Mat *cvImage;

何らかの理由で、cv::Mat を返す decode() という関数を作成しました。

void copy(){cvImage = &decode();}

cvImage は上記のコードでは正しい値を取得できません。通常、data、dataend、datalimit、datastart、rows は 0 または予期しない値です。

cv::Mat img などのローカル変数を使用してすべてを実行しようとしても cvImage = &img; 、関数が終了または復帰するたびに、cvImage の値も予期せず変更されます。

どうしてこうなったんだろう??

4

1 に答える 1

1

そこでポインターを使用すると、未定義の動作が発生します。Mats と一緒に使用しないでください。

しないでください cv::Mat *cvImage;

行う cv::Mat cvImage;

cv::Mats は refcounted であり、それらのポインターは大混乱を引き起こします。

リマインダーとして:

Mat a,b;  b=a;         // shallow copy, shared pixels (that's probably, what you wanted)
Mat a,b;  b=a.clone(); // deep copy, b will have y copy of a's pixels

編集:

「何らかの理由で、cv::Mat を返す decode() という関数を作成しました。」

これが最初の問題です。

void copy(){cvImage = &decode();}

そしてあなたはそれのアドレスを返します。

どうやら、そのcliはPODオブジェクト(ポインターなど)のみを処理できるようです

  1. temp のアドレスを取得する代わりに、decode が aa Mat* を返すようにします

    Mat * decode() { Mat *m = new Mat(100,100,CV_UC8); ... m を返します。}

  2. コピーして古いものを削除させてください

    void copy(){ if (cvImage) cvImage を削除します。cvImage = デコード(); }

于 2013-03-28T10:17:52.420 に答える