我正在使用OpenCV 3.1,我尝试运行一个简单的代码,如下所示(主要功能):
cv::VideoCapture cam;
cv::Mat matTestingNumbers;
cam.open(0);
if (!cam.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; }
while (cam.read(matTestingNumbers))
{
cv::imshow("matTestingNumbers", matTestingNumbers);
cv::waitKey(5000);
}
当我移动相机时,似乎代码不会捕获并显示当前帧,但会显示前一个位置的所有捕获帧,然后才会显示新帧。
因此,当我捕捉墙壁时,它会以正确的延迟显示正确的框架(墙壁本身),但是,当我将相机扭曲到我的电脑时,我首先看到墙壁的3帧,然后才看到计算机,似乎帧被卡住了。
我尝试使用videoCapture.set()函数并将FPS设置为1,我尝试将捕获方法切换为cam>> matTestingNumbers(以及根据此更改的其余主要功能)但没有任何帮助,我仍然有“卡住”帧。
BTW,这些是我在网上找到的解决方案。
我该怎么做才能解决这个问题?
谢谢Dan。
修改
我尝试按以下方式检索框架:
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int, char**)
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat frame;
namedWindow("edges",1);
for(;;)
{
cap.grab();
if (waitKey(11) >= 0)
{
cap.retrieve(frame);
imshow("edges", frame);
}
}
return 0;
}
但是,它给出了结果(当我将相机指向一个位置并按下一个键时,它显示了另一个以前捕获到另一个点的帧)。
就像你试图想象一个人而不是另一个人一样,但是当你拍到第二个人时,你会得到第一个人没有意义的照片。
然后,我尝试了以下内容:
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int, char**)
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat frame;
namedWindow("edges",1);
for(;;)
{
cap >> frame;
if (waitKey(33) >= 0)
imshow("edges", frame);
}
return 0;
}
它按预期工作。
答案 0 :(得分:0)
其中一个问题是您没有调用cv::waitKey(X)
来正确冻结 X 毫秒的窗口。摆脱usleep()
!