OpenCV 在不同线程上从网络摄像头运行视频
Posted
技术标签:
【中文标题】OpenCV 在不同线程上从网络摄像头运行视频【英文标题】:OpenCV Running Video from WebCam on different thread 【发布时间】:2013-12-04 14:53:36 【问题描述】:我有 2 个网络摄像头,我想同时从这两个摄像头获取输入。因此,我相信我必须使用 c++ 中的线程,即 pthread。当我运行下面给出的代码时,网络摄像头会打开一秒钟并退出例程。我无法弄清楚我的代码有什么问题。
void *WebCam(void *arg)
VideoCapture cap(0);
for (; ; )
Mat frame;
*cap >> frame;
resize(frame, frame, Size(640, 480));
flip(frame, frame, 1);
imshow("frame", frame);
if(waitKey(30) >= 0)
break;
pthread_exit(NULL);
int main()
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, &WebCam, NULL);
return 0;
这只是为了让一个网络摄像头转动并进行流式传输。一旦这个工作比其他工作将只是它的副本。
【问题讨论】:
你为什么认为,你需要线程?不一定正确。 你为什么要取消上限? 我重新格式化/编辑了您的代码,正如@ChronoTrigger 在下面注意到的那样,您所要做的就是在return 0;
之前添加pthread_join(thread1, NULL);
。
【参考方案1】:
当您创建线程时,它开始运行,但是您仍在运行的主程序只是终止,使子线程也完成。尝试在pthread_create
之后添加这个:
pthread_join(thread1, NULL);
顺便说一句,即使你有两个摄像头,也可以避免使用线程。我不确定,但在处理 highgui 函数(imshow
、waitKey
)时它们可能会出现问题,因为您必须确保它们是线程安全的。否则,两个线程同时调用waitKey
会是什么结果呢?
您可以使用与此类似的设计摆脱线程:
VideoCapture cap0(0);
VideoCapture cap1(1);
for(;;)
cv::Mat im[2];
cap0 >> im[0];
cap1 >> im[1];
// check which of im[i] is non empty and do something with it
【讨论】:
我认为如果两个相机的帧率不同(不同的光照条件或不同的相机),这种方法会导致丢帧。以上是关于OpenCV 在不同线程上从网络摄像头运行视频的主要内容,如果未能解决你的问题,请参考以下文章
c++ && OpenCV的多线程实时视频传输(TCP on Windows)
OpenCV:来自 VideoWriter 的写入是不是应该在独立线程中运行?
Opencv/c++ - 在线程中录制实时视频,在另一个线程中处理图像?