ちくのう症(蓄膿症)は「菌」が原因!?

現在,Open CVを使用して,webカメラからから取得した映像を動画として保存しようとしています。
公式サイトや参考書のコードを丸写ししテストしています。
コンソールアプリケーションで作成した場合は,問題なく動画を保存できましたが,フォームアプリケーションで作成した場合,エラーで停止してしまいます。

動作としては,timerを使用して,30msec間隔でカメラから画像を取得し,動画として保存というものです。

CvCapture *capture;//画像
CvVideoWriter* rec;
IplImage *srcImage;

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

timer1->Interval=30;
timer1->Enabled=true;

capture = cvCaptureFromCAM(0);
srcImage = cvQueryFrame(capture);
rec = cvCreateVideoWriter("movie.avi",CV_FOURCC('M','J','P','G'),30,cvSize(100,100));


}
private: System::Void timer1_Tick() {
   captureImage();
}

private:System::Void captureImage(void){

cvFlip(srcImage,srcImage,0);

srcImage=cvQueryFrame(capture);

cvWriteFrame(rec,srcImage);


}

上記の, cvWriteFrame(rec,srcImage); の箇所で停止してしまいます。
ビルドは成功しているのですが,実行時の1目でエラーになります。
エラー内容『保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。』

どなたか原因がわかるかたがいらっしゃいましたら,ご教授いただけますでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

もうちょっと詳しく読んでみましたが



http://opencv.jp/opencv-2svn/c/highgui_reading_a …
> 返された画像は,ユーザによって解放されたり変更されたりするべきではありません.
> また,エラーが起きて,NULLが返される場合もあります.

→ cvFlip(srcImage,srcImage,0); でsrcImageを変更している。
(そもそも、この場所でcvFlipする意味がわからない)
→ エラーのチェックがない

と、問題となりそうなことをやってます。
画面表示とファイル出力とで処理のタイミングは当然変わるので、その結果不具合が顕著になっただけかもしれません。

あと、cvWriteFrameが完了する前にタイマー割り込みが発生した場合にも問題が発生しそうです
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
いろいろと試してみましたが,cvVideosWriterのFOURCCの設定がまずかったようです。非圧縮だとうまく保存できました(サイズはすごく大きいですが...)
アドバイスありがとうございました。

お礼日時:2011/12/22 11:03

あくまで予想ですが



> timer1->Enabled=true;

この時点でタイマーが動きだして、以下のキャプチャの準備が出来ないうちに タイマー割り込み発生 → timer1_Tick() → captureImage() と呼ばれている、ってことは無いですか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
アドバイスを元にプログラムを変更しましたが,うまくいきませんでした...
cvWriteFrame(rec,srcImage);ではなく,ウィンドウに画像を表示するプログラムなら問題なく動作するのですが...

お礼日時:2011/12/20 19:03

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング