2016-09-26 31 views
0

Qt5.7とOpenNIを使用してC++で記述されたマルチスレッドアプリケーションがあります。 .oni録音ファイル(asus xtion pro live)からフレームをキャプチャする第2のスレッドを開始するメインスレッドがあり、Qtシグナルスロット機構を介してフレームをメインスレッドに渡します。を使用して表示します。 私がやりたいことは、一時停止キーを実装することです。たとえば、処理の一時停止を 'p'押すことです。単純にブロック全体のプロセス、私はフレームが別のスレッド(メイン1)で表示されるので、それはだと思う、それは動作しません。このようにマルチスレッドアプリケーションでopencv waitKey()を使用

void Camera::run(){ 
    while(!cameraStop && this->device.isValid()) 
    { 
     try { 
     if (!buttonPause) { 
      getFrame(); 
      process(); 
      emit sigFrameImageReady(frame); 
      if (cv::waitKey(1)==112){ 
       setButtonPause(!(getButtonPause())); 
      } 
      } 

     } 
     catch(std::exception &ex) { 
     std::cerr << "getFrame()" << ex.what() << std::endl; 
     } 
    } 
} 

ここwaitKey()を、私はこのような何かを考えていますしかし、私はこのように単にimshow()後、メインスレッドにそれを置く場合:

void Process::FrameImageReady(cv::Mat FrameImage) 
{ 
    if (modedebug) 
    cv::imshow("bgr", FrameImage); 
    if (cv::waitKey(1)==112){ 
    cam->setButtonPause(!(getButtonPause())); 
    } 
} 

waitkeyを任意のアイデア...(画像罰金作品を表示する)は無視しているようですか?

EDIT GUI部分はデバッグ目的のみです。

+0

'imshow'、' waitKey'や 'highgui'の他の機能は、デバッグのためだけのものです。既にQtを使用しているので、Qtの機能を使って画像を表示することをお勧めします。これはスレッドで正しく動作します。 – Miki

+0

画像表示がうまく動作していますが、唯一の問題はwaitkey()です。同じ機能を持つQt関数を使用することをお勧めしますか?あなたは1つを提案できますか? – rok

+0

[KeyEvent](http://doc.qt.io/qt-5/qkeyevent.html)をチェックしてください。実際には私のものではありません...私はOpenCVの機能性のために、すべてのGUI用にQtを使うことを提案しています複雑な作業には使用されません。 – Miki

答えて

1

表示スレッドにスレッドセーフFIFOバッファまたは循環バッファを実装する必要があります。カメラスレッドからの信号はこのバッファに画像をプッシュし、表示スレッドはそれらを取り出して別のループで表示します。カメラのイベントループと表示スレッドを分離するだけです。

関連する問題