У меня есть многопоточное приложение, написанное на C++ с Qt5.7 и OpenNI. У него есть основной поток, который запускает второй поток, который захватывает кадр из файла записи .oni (asus xtion pro live) выполняет некоторую обработку, и через механизм сигнала с интервалом Qt передает кадр в основной поток, который отображает его с помощью . Что я хочу сделать, так это реализовать клавишу паузы, так что нажатие, например, «p» на паузу обработки. Я имею в виду что-то вроде этого:using 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 предназначена только для целей отладки.
'imshow',' waitKey' и другие функции в 'highgui' предназначены только для целей отладки. Поскольку вы уже используете Qt, я предлагаю показать изображения через Qt-функции, которые будут корректно вести себя с помощью потоков – Miki
. Теперь отображение изображений отлично работает, единственная проблема, с которой я столкнулся, - это waitkey(). Вы предлагаете использовать функцию Qt с одинаковыми функциональными возможностями? Не могли бы вы предложить его? – rok
Проверьте [KeyEvent] (http://doc.qt.io/qt-5/qkeyevent.html), но это не мое дело ... Я просто предлагаю использовать Qt для всего GUI-материала, поскольку функции OpenCV не предназначены для использования в сложных задачах. – Miki