OpenCV 2.4.5&通过VideoCapture提升

时间:2013-05-22 06:56:08

标签: c++ opencv boost

问题:想要将cv :: VideoCapture对象传递到另一个线程。我希望能够动态处理我可以拥有的相机数量。

建议的解决方案:插入向量并作为参数传递给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++;
    }
}

检索机制:创建本地向量并将传入的数据分配给该向量:

cVision::cVision(std::vector< boost::shared_ptr<cv::VideoCapture> > CamVect)
{
    Cameras=CamVect;
}

在此之后,我继续执行以下操作以提取图像:

注意,下面有一些typedef:

typedef std::vector< boost::shared_ptr<cv::VideoCapture> > CameraContainer;
typedef CameraContainer::iterator CamIterator;

使用它,我创建一个迭代器并尝试检索图像。从我从class definition'&gt;&gt;'收集到的内容operator只执行一个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!

任何建议都会非常有用!

1 个答案:

答案 0 :(得分:1)

我想出了如何规避这一点。即通过将以下内容定义为来自main()的全局:

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

在此之后,我刚刚从线程中调用了相同的方法,它按预期工作。

仍然不确定为什么会发生这种情况。