问题:想要传递cv:: videoccapture对象到另一个线程。我希望能够动态地处理我可以有多少个相机。
建议的解决方案:插入到vector中并作为参数传递给Thread:
插入机制:std::vector< boost::shared_ptr<cv::VideoCapture> > CamVect;
for(int i=0;i<6;i++){
boost::shared_ptr<cv::VideoCapture> cvInputObj(new cv::VideoCapture(i));
if((*cvInputObj.get()).isOpened()){
CamVect.push_back(cvInputObj);
ValidCams++;
}
}
检索机制:创建本地vector并将传入的数据赋值给该vector:
cVision::cVision(std::vector< boost::shared_ptr<cv::VideoCapture> > CamVect)
{
Cameras=CamVect;
}
接下来,我继续做下面的事情来取出图像:
注意,以下是一些类型定义:
typedef std::vector< boost::shared_ptr<cv::VideoCapture> > CameraContainer;
typedef CameraContainer::iterator CamIterator;
使用它,我创建了一个迭代器并尝试检索图像。从我从类定义中收集到的信息来看,'>>'操作符只是执行一个grab(),然后执行一个retrieve()
void cVision::grabImage(int CamNumber){
int index=0;
for(CamIterator it=Cameras.begin();it!=Cameras.end();++it)
{
if(index==CamNumber) {
if((*it)->grab()) {
cout<<"Successfully grabbed!"<<endl;
if((*it)->retrieve(imCur[CamNumber],0))
cout<<"Successfully retrieved!"<<endl;
else
cout<<"Error retrieving"<<endl;
}
} else index++;
}
}
问题:它似乎是成功地调用grab()方法,但在检索失败?(这是我的猜测):
libv4l2: error dequeuing buf: Invalid argument
VIDIOC_DQBUF: Invalid argument
Successfully grabbed!
任何建议都会非常有帮助!
我知道如何绕过这个。也就是说,通过定义以下语句作为main()的全局变量:
std::vector< boost::shared_ptr<cv::VideoCapture> > CamVect;
在此之后,我只是从线程调用相同的方法,它按预期工作。
仍然不确定为什么会发生这种情况