OpenCVを使用した先取り先オブジェクトのコピー

私はC ++プログラマーの多くではなく、C#やJavaに慣れていて、ポインタについて心配する必要はありません。私はここで何をしているのか理解していましたが、結果は私が期待していたものではなく、私がここで愚かなことをしているかどうか、あるいはプログラムが問題を引き起こしています。

とにかく、私はOpenCVで作業しています。私はこのように初期化する2つの画像を持っています:

IplImage *current_frame = NULL;
IplImage *previous_frame = NULL;

次に、私はこのコードブロックを持っています:

if (current_frame != NULL)
    {
        previous_frame = new IplImage(*current_frame);
        current_frame = cvQueryFrame( capture );
    }
    else
    {
        current_frame = cvQueryFrame( capture );
        previous_frame = cvQueryFrame( capture );
    }

アイデアは、コードが初めて実行されたときに、現在のフレームと前のフレームの両方が新しくキャプチャされたイメージを使用しますが、それ以降のフレームの場合はprevious_frameはcurrent_frameの前の値をとり、current_frameは新しいイメージをキャプチャしますコードとそれはif文の正しい枝に入っています)。

実際に起こっていることは、私が両方のフレームを出力していることです。以前のフレームが1つ遅れるのではなく、同じであることです。

私はポインタを悪用していますか?もしそうなら、私が望む行動を得るためにどうすればいいですか?それとも、私はそれが欲しいと思うように見えるのですか?

ありがとう。

2
追加された 編集された
ビュー: 1

1 答え

I suspect you are using the raw C API: here IplImage is defined as a POD struct

typedef struct _IplImage
{
 //...
    char *imageData;
 //...
}
IplImage;

ご覧のとおり、 new IplImage(* current_frame)は実際のデータではなくポインタ(特に imageData )だけをコピーします。つまり、両方の画像でデータを誤って共有しています。

I suggest you read here for the C++ wrappers, and especially how to use them for memory management: http://opencv.willowgarage.com/documentation/cpp/memory_management.html

EDIT If you want to use the C API:

currFrame = cvQueryFrame( cap );

// Clone the frame to have an identically sized and typed copy
prevFrame  = cvCloneImage( currFrame );
1
追加された
このような質問からこれを行うには、C APIの方法でつまずいた: stackoverflow.com/questions/4567188/…
追加された 著者 sehe,
そのcvCloneImageは、まさに私がやろうとしていたことです、ありがとう!私はまた、なぜ私がやっていたのはばかげていたのか分かります。
追加された 著者 Diarmuid Ó Muirgheasa,