C++ 带多线程的Opencv视频捕获
我试图通过使用多线程和cv::VideoCapture以及std::thread来显示多个视频。如果我只调用函数work,它就工作了!但是当我把它放到一个线程中时,什么也不显示。我错过什么了吗?或者你有更好的办法吗?谢谢 p、 我使用的是MacOSX10.10.2和Opencv 2.4.9 代码如下:C++ 带多线程的Opencv视频捕获,c++,multithreading,opencv,C++,Multithreading,Opencv,我试图通过使用多线程和cv::VideoCapture以及std::thread来显示多个视频。如果我只调用函数work,它就工作了!但是当我把它放到一个线程中时,什么也不显示。我错过什么了吗?或者你有更好的办法吗?谢谢 p、 我使用的是MacOSX10.10.2和Opencv 2.4.9 代码如下: void work(std::string address, std::string window) { cv::VideoCapture cap(address); if (!c
void work(std::string address, std::string window) {
cv::VideoCapture cap(address);
if (!cap.isOpened()) {
std::cout << "Cannot open camera" << std::endl;
return;
}
cv::Mat frame;
while (char(cv::waitKey(1)) != 'q' && cap.isOpened()) {
cap >> frame;
if(frame.empty()) {
std::cout << "Video over" << std::endl;
break;
}
cv::imshow(window, frame);
}
}
int main(int argc, char *argv[]) {
std::thread t1(work, "/Path/to/test.mp4", "test");
t1.join();
// work("/Path/to/test.mp4", "test"); // it works if just call function work()
std::cout << "Done..." << std::endl;
}
旧线程,但您可能会错过cv::waitKey5;调用cv::imshow之后。在附加线程中使用cv::imshow可能不是一个好主意。cv::imshow只能在主线程中正常工作。我无法在Windows 7上重现您的问题;你是否碰巧有一行cv::namedWindowtest;在你的实际代码中?如果在创建线程之前将其包含在main函数中,则只会得到一个灰色屏幕,应用程序将挂起。如果确实有,请尝试将window函数移动到work函数中,使窗口由执行显示和检查键盘输入的线程创建。它也不起作用。我发现如果在创建线程之前包含cv::namedWindow,它只会显示视频的第一帧,应用程序就会挂起。但是如果我删除cv::namedWindow,我会看到一个灰色屏幕,应用程序会挂起。我真的很困惑。奇怪。至于,imshow会自动创建窗口,因此如果您不从主函数初始化窗口并尝试从线程访问它,它应该可以工作。如果放置cv::nameWindowtest;在工作功能中,它是否也会产生灰色屏幕并挂起?您好。这个问题有进展吗?在python上创建stereocam查看器时,我也遇到了一个问题。它们可以在多个进程上正常运行,但不能在多个线程上运行。