gpt4 book ai didi

c++ - 在多线程应用程序中使用 opencv waitKey()

转载 作者:行者123 更新时间:2023-11-28 05:30:20 51 4
gpt4 key购买 nike

我有一个用 C++ 和 Qt5.7 和 OpenNI 编写的多线程应用程序。它有一个启动第二个线程的主线程,该线程从 .oni 记录文件(asus xtion pro live)捕获帧进行一些处理,并通过 Qt 信号槽机制将帧传递给主线程,主线程使用 imshow()。我想要做的是实现一个暂停键,例如按下“p”处理暂停。我在想这样的事情:

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;
}
}
}

这样是行不通的,我想那是因为frame是由另一个线程(主线程)显示的,这里的waitKey()只是阻塞了整个过程,但是如果我将它放在主线程中,就在 imshow() 之后:

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

waitkey 似乎被忽略了(图像显示工作正常)..有什么想法吗?

编辑GUI 部分仅用于调试目的。

最佳答案

您应该在显示线程中实现线程安全的 FIFO 缓冲区或循环缓冲区。来自相机线程的信号会将图像推送到此缓冲区,而显示线程会将它们取出并在单独的循环中显示它们。只有这样,您才能将相机事件循环与显示线程分开。

关于c++ - 在多线程应用程序中使用 opencv waitKey(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39700877/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com