OpenCV视频捕捉抓取和检索

时间:2016-05-21 14:58:55

标签: c++ linux opencv video-capture

我已经有这个问题很长一段时间了,我不知道最近会发生什么。 所以我有一个调用nextFrame的循环,现在问题在于imshow实际显示的内容。

每次拨打cap.grab()cap.retrieve()时,我特别想要一张图片,但似乎在#34; cap"内部有这个缓冲区。对象,所以取而代之的是获得单独的瞬时图像,当我点击图像时,我会得到图像的序列/图像,然后在3/4帧之后得到一个新的序列。

我如何获得单帧?

cap是一个VideoCapture对象,maxCount是向量的大小。

void CamLoop::nextFrame() {
.
.
.
    //if first loop fill a vector<Mat> with random Mats from camera
    if (firstLoop) {
        Mat buff;
        cap >> buff;
        for(int i = 0; i<(maxCounter); i++) {
            buffer.push_back(buff);
        }
    }

    projector.nextCode();

    if (!customImages) {
        cap.grab();
        Mat buff;
        cap.retrieve(buff);


//tried this way too
//cap >> buff;

        buffer[counter] = buff;

        setMouseCallback( "Camera", mouseFunc, this );
        imshow("Camera", buffer[counter]);
        waitKey(1);
    }
.
.
.
counter++;
}

我在Eclipse Mars上使用Linux Mint Rosa和OpenCV 3.1.0

修改  问题是VideoCapture有一个缓冲区,在调试模式下在你自己的计算机上试试这个,框架是不活的,我怎么会遇到这个问题?

我尝试使用

cap.set(CV_CAP_PROP_BUFFERSIZE,1);

但它给了我这个错误。

VIDEOIO ERROR: V4L2: setting property #38 is not supported

也尝试了

cap.set(CV_CAP_PROP_MODE,1);

但它给了我这个错误。

VIDEOIO ERROR: V4L2: setting property #9 is not supported

修改 它可能是带缓冲区的摄像机,而不是VideoCapture对象本身。

1 个答案:

答案 0 :(得分:0)

缓慢而作弊的修复可能是

cap.open( *CAMERA_NUM* );

在循环中,这很慢,但它实现了没有缓冲区的静止图像。