現在QTCreatorバージョン4.7.4を使用して、アプリケーション内でAVIファイルを再生するGUIアプリケーションを作成しています。QTCreator GUI内でビデオを再生する
私がやっているのは、各フレームをQLabel内のQPixmapとして設定することです。
video.load("lk",video.EXT_AVI);
if(video.hasLoaded()){
while(!video.hasFinished()){
frame = video.getCurrentFrame();
cv::cvtColor(frame, frame, CV_BGR2RGB);
QImage myImage = QImage((const unsigned char*) (frame.data),frame.cols, frame.rows, frame.step1(),QImage::Format_RGB888);
ui->displayLabel->setPixmap((QPixmap::fromImage(myImage)));
video.nextFrame();
}
}
私は、各フレームを取得するためにOpenCVのAPIからVideoCaptureクラスを使用していたように、フレームは、最初CV :: MATオブジェクトとして取得したので、私はQImagesに変換されます。
単純なコンソールプログラムでopencv APIのCV :: imshow()関数を使用している場合、ファイルを正常に再生できますが、ループで上記のコードを実行すると、プログラム最後のフレームまで本質的にクラッシュし、最後のフレームを示す安定した状態に戻る。
私はC++には新しく、Javaには良い経験をしていますので、この問題の最初の推測では、イベントスレッドですべてが行われているため、すべてのリソースを使い果たしてしばらく応答を停止する。
ご協力いただければ幸いです。
注:videoは自分のクラスで、opencv APIのVideoCaptureクラスをカプセル化しています。
最小の実例を掲載してください。また、QPixmapとしてcv :: Matとして開いた画像を表示できますか? – Unapiedra
あなたが示したコードは、サイクルの中にあるようです。もしそうなら、たぶんQtイベントを処理しないでしょう。次に、タイマーを作成し、このコードを 'timeout'シグナルハンドラに入れます。また、私はそれがビデオを表示するための最良の方法ではないことに注意したいと思います。 RGBからBGRへ、BGRからRGBへの変換より、画像からpixmapへ - 本当にsloooow – Lol4t0
ちょっと、私はopencv、C++、QTの新機能ですから、タイマーなどで平均私はそれが最も効率的ではないかもしれないことに気づいていますが、それはGUIの中に画像を表示することを私が知る唯一の方法です:P – BlackBox