2016-09-26 4 views
0

Qt5.7 및 OpenNI를 사용하여 C++로 작성된 멀티 스레딩 응용 프로그램이 있습니다. 이것은 메인 녹음 파일 (asus xtion pro live)에서 프레임을 캡쳐하는 두 번째 스레드를 시작하는 메인 스레드를 가지고 있으며, Qt 신호 슬롯 메커니즘을 통해 프레임을 메인 스레드에 전달합니다.이 스레드는 imshow()을 사용하여 디스플레이합니다. 내가 원하는 것은 일시 중지 키를 구현하는 것입니다. 예를 들어 'p'를 누르면 처리가 일시 중지됩니다. 나는이 같은 것을 생각하고 :멀티 스레딩 응용 프로그램에서 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은 .. 어떤 생각 (이미지가 잘 작동 표시) 무시하는 것 같다?

편집 GUI 부분은 디버깅 용도로만 사용됩니다.

+0

'imshow','waitKey'와'highgui'의 다른 기능들은 디버깅 목적으로 만 사용됩니다. 이미 Qt를 사용하고 있기 때문에 스레드로 올바르게 동작하는 이미지를 물결 모양으로 표시하는 것이 좋습니다. – Miki

+0

이미지 표시가 올바르게 작동하며 유일한 문제는 waitkey()입니다. 동일한 기능을 가진 Qt 함수를 사용 하시겠습니까? 하나 추천 해 주시겠습니까? – rok

+0

[KeyEvent] (http://doc.qt.io/qt-5/qkeyevent.html)를 확인하십시오.하지만 실제로는 제 것이 아닙니다 ... OpenCV 기능 이후 모든 GUI 항목에 대해 Qt를 사용하도록 제안하고 있습니다. 복잡한 작업에 사용하기위한 것이 아닙니다. – Miki

답변

1

표시 스레드에 스레드 안전 FIFO 버퍼 또는 순환 버퍼를 구현해야합니다. 카메라 스레드의 신호는이 버퍼로 이미지를 푸시 할 것이며 표시 스레드는이를 꺼내어 별도의 루프에 표시합니다. 그런 식으로 카메라 이벤트 루프를 디스플레이 스레드와 분리합니다.

관련 문제