• 締切済み

OpenCVでの動画処理(入出力)

 OpenCVを用いて動画処理を行っています。  動作環境はMacOS10.9で、MacPortsを用いて最新版(おそらく...)のOpenCVを入れています。開発環境はXCode4です。  USBカメラを接続し、cvQueryFrame(CvCapture*)の関数を用いて画像を取得しています。そのままこの関数の返り値をIplImage*に代入してはいけないようなことをどこかで聞いていたので、念のため... IplImage* cap = cvQueryFrame(capture); IplImage* img; if(cap) img = cvCloneImage(cap); else img = NULL; というようなコードを書いて、imgに対して処理を行っています。  しかし、頻度は少ないのですがたまにimgにNULLが代入されるときが有ります。頻度は5000フレームに一度あるかどうかで、再現性が低いのでなんだかよくわかりません。 これは仕様なのでしょうか?USBカメラがたまに画像を取得できない瞬間があるという理解でいいのでしょうか?  私のコードに間違いがある場合は指導お願いします。  あと、動作が正常なので、画像は取得できているのでしょうが... QTCaptureSession warning: Session received the following error while decompressing video: Error Domain=NSOSStatusErrorDomain Code=-12909 "The operation couldn’t be completed. (OSStatus error -12909.)". Make sure that the formats of all video outputs are properly configured. というような警告が標準出力される時があります。 この警告の頻度はなかなか多く、200フレームに一度ぐらいあります。 動作は正常ですが、この瞬間だけ処理速度が少し落ちる傾向があるようです。 ちなみに言語はC++を用いています。 よろしくお願いします。

みんなの回答

  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.2

cvReleaseImage(cap) をやらないのは正しいです。 他に細かい点としては、cvCloneImage を毎フレームやるのは重いので、事前にサイズ・チャンネル数がわかっているのであれば、そのサイズの IplImage を用意して cvCopy したほうが負荷が軽いです。cvReleaseImage(img) を毎フレームする必要もなくなります。(アルゴリズムによっては、そもそもコピー自体不要かもしれませんが…) 他に問題があるかどうかは、ソース全体を見てみないとわかりません。

  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.1

私は Mac で OpenCV を使ったことはないですが、Windows でやっていた時はそのような現象は発生していなかったと思います。もしあるとすれば Mac 固有の不具合ではないでしょうか。 コードスニペットもその部分は問題なさそうに見えます。(もちろん、cvReleaseImage(img) などはちゃんとやっていますよね?)

hira_kazu
質問者

お礼

 回答ありがとうございます。  cvReleaseImage(img)は行っています。  cvReleaseImage(cap)はやらない方が良いらしいのでやっていないですが...  メモリリークは起こしていないようなので、解放はうまく出来ているようです。  画像が取得できなくてもエラーを起こさないように気をつけてみます><