3

を使用してWindowsフォームに画像を正常に表示しようとしimwriteましたが、ディスクが損傷するため、これを行うためのより良い方法が必要です。

以下は、画像を一時的にハードドライブに書き込む現在のコードです。

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

        namedWindow("video",0);
        VideoCapture cap(0);
        flag = true;
        while(flag){
            Mat frame;
            cap >> frame; // get a new frame from camera
            **imwrite("vdo.jpg",frame);**
            this->panel1->BackgroundImage = System::Drawing::Image::FromFile("vdo.jpg");

            waitKey(5);
            delete panel1->BackgroundImage;
            this->panel1->BackgroundImage = nullptr;

        }
    }

メモリ内にあるOpenCVを使用しようとするMatと、動作しません。次のコードスニペットは、私がこれまでに試したものです。

this->panel1->BackgroundImage = System::Drawing::Bitmap(frame);

また

this->panel1->BackgroundImage = gcnew System::Drawing::Bitmap( frame.widht,frame.height,System::Drawing::Imaging::PixelFormat::Undefined, ( System::IntPtr ) frame.imageData);

frameを使用せずにこのコードで表示したいimwrite。どうすればこれを達成できますか?

4

1 に答える 1

5

画像をファイルに書き込んでからすぐにコントロールに読み戻すことを避けることは、間違いなく良い考えです。通常、ハード ドライブはシステム内で最も遅いメモリ デバイスであるため、非常に非効率的です。

Bitmap上記の例で正しいコンストラクターを使用しているとは思いません。おそらく、このコンストラクター定義を使用する必要があります。Bitmapまた、 が未定義であることをオブジェクトに伝えることも、PixelFormatおそらく役に立たないでしょう。CV_8UC3マトリックスを返すカラーカメラがあると仮定しています(つまり、あなたのPixelFormat == Format24bppRgb)。

次のような呼び出しを試してみてください。

this->panel1->BackgroundImage = gcnew System::Drawing::Bitmap(frame.size().width,
                                                              frame.size().height,
                                                              frame.step,
                                                              PixelFormat::Format24bppRgb,
                                                              (IntPtr)frame.data);

また、OpenCV は色を BGR 形式でネイティブに保存することを覚えておいてください。したがって、データを正しく表示するには、赤と青のチャネルを入れ替える必要がある場合があります。

うまくいけば、それで始められるでしょう!

于 2012-03-08T04:10:49.970 に答える