2013-05-22 42 views
0

问题:想要将cv :: VideoCapture对象传递到不同的线程。我希望能够动态处理我可以拥有的摄像机数量。OpenCV 2.4.5&Boost for Passing VideoCapture

建议的解决方案:插入到载体中,并通过作为参数进螺纹:

插入机构:

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

检索机制:创建局部矢量并指定在数据传递给矢量作为这样:

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; 

利用这一点,我创建了一个迭代,并尝试获取图像。从我从class definition聚集在“>>”运营商只是做后跟一个检索()

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

问题抓斗():现在看来似乎是成功调用抢()方法,但未能上检索? (这是我的猜测):

libv4l2: error dequeuing buf: Invalid argument 
VIDIOC_DQBUF: Invalid argument 
Successfully grabbed! 

任何建议将非常有帮助!

回答

1

我想出了如何绕过这个。即从main()的定义如下的全局:

std::vector< boost::shared_ptr<cv::VideoCapture> > CamVect; 

在此之后我刚打电话从线程同样的方法和它的工作如预期。

不知道为什么发生这种情况。