2011-12-07 14 views
2

現在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クラスをカプセル化しています。

+0

最小の実例を掲載してください。また、QPixmapとしてcv :: Matとして開いた画像を表示できますか? – Unapiedra

+0

あなたが示したコードは、サイクルの中にあるようです。もしそうなら、たぶんQtイベントを処理しないでしょう。次に、タイマーを作成し、このコードを 'timeout'シグナルハンドラに入れます。また、私はそれがビデオを表示するための最良の方法ではないことに注意したいと思います。 RGBからBGRへ、BGRからRGBへの変換より、画像からpixmapへ - 本当にsloooow – Lol4t0

+0

ちょっと、私はopencv、C++、QTの新機能ですから、タイマーなどで平均私はそれが最も効率的ではないかもしれないことに気づいていますが、それはGUIの中に画像を表示することを私が知る唯一の方法です:P – BlackBox

答えて

4

要約:

ビデオ再生中にコードがUIを更新しないため、プログラムがハングします。

詳細

主な問題は、コード内でウィジェットの状態を変更した直後にQtがUIを更新しないことです。 Qtは eventsを使用してウィジェットを更新します。そして、一般的な場合のすべてのイベント処理は、単一スレッドで実行されます。あなたのコードもイベントハンドラです(おそらくボタンクリックイベントのハンドラです)。あなたのコードはループ内のウィジェットの状態を変更しますが、ウィジェットがイベントを処理した後にのみ変更が表示されます。しかし、ウィジェットは、現在のイベントが処理された後、つまり自分のコードだけがイベントを処理できます。したがって、コードは処理が完了するまでブロックします。それが終わると、最後のフレームが見えます。

あなたは何をすべきあなたがここにループを使用することはできません

(OK、あなたが本当にでき、必ずしも必要ではないが) あなたが1つのフレームを示して機能を、作るべきと仕上げよりも、Qtのプロセスのイベントをできるように。 Qtは一定の時間間隔、つまりフレームレートから決定されるこの関数を呼び出す必要があります Qtが指定された時間間隔で何らかの関数を呼び出す最も良い方法は、timerを使用することです。

再生を開始するには、videoストリームを開始するタイマーを初期化する必要があります。最後のフレームが表示されたら、タイマーを停止する必要があります。

+0

偉大な、今これをフォローし、素晴らしいアドバイスのように聞こえるでしょう。ありがとうございました!あなたの答えを上げようと試みましたが、私はもっと評判が必要なようです:P。 – BlackBox

+0

うん、治療をして、アプリケーションのさらなる拡張をずっと簡単にしました、ありがとうございました。 – BlackBox