linux OpenCV视频捕获抓取和检索

bkhjykvo  于 2022-11-02  发布在  Linux
关注(0)|答案(1)|浏览(148)

这个问题我已经有很长时间了,我不知道是怎么回事。所以我有一个循环,从那里调用nextFrame,现在的问题是imshow实际上显示了什么。
我特别希望每次调用cap.grab()cap.retrieve()时都有一个图像,但它似乎在“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

EDIT问题是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

EDIT它可能是具有缓冲区的摄像机,而不是VideoCapture对象本身。

vnjpjtjt

vnjpjtjt1#

一个缓慢和欺骗的修复可能是做

cap.open( *CAMERA_NUM* );

在循环中,这是缓慢的,但是它在没有缓冲器的情况下实现了静止图像。

相关问题