我有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;
}
这对于一个网络摄像头来说就是转身和做流媒体。一旦这个工作比其他工作只是复制它。
答案 0 :(得分:3)
当你创建线程时,它开始运行,但你的主程序仍在运行,只是终止,使得子线程完成。尝试在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
}