【发布时间】:2016-09-18 18:28:27
【问题描述】:
我有这个问题很长时间了,我不确定发生了什么。
所以我有一个循环,从中调用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
编辑 问题是 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 对象本身。
【问题讨论】:
-
什么是
maxCounter?你在哪里增加counter?不管怎样,cap >> buff应该给你一帧到buff。 -
捕获后克隆缓冲区。 CV::Mat 默认不做深拷贝,所以你有大量对同一个底层数组的引用(阅读文档)
-
已编辑问题,克隆缓冲区没有帮助。
-
A.Sarid 问题更多在于 VideoCapture 中似乎有这个奇怪的缓冲区,所以图像“cap>>buff”给我的不是来自相机的下一帧,而是来自这个奇怪的缓冲区
-
您确定缓冲区在 VideoCapture 中而不是在您的相机中吗?对我来说,只有 2 个缓冲图像。
标签: c++ linux opencv video-capture