OpenCV从摄像头获取帧并写入视频文件
程序员文章站
2022-05-16 14:01:57
...
//注意的是,视频文件所在的路径需要存在,例如D:libo_output/output.avi这个目录需要存在。
//要正确打开视频文件,计算机必须安装有对应的解码器,否则VideoCapture没法理解视频格式
//经过测试发现,openCV不能正常读取mp4文件的总帧数和总帧率,opencv能正常读取AVI问件的总帧数和帧率
//显示中用waitKey,即方便控制退出显示循环,又使imshow不会因为两次之间时间过短而显示不出图像
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include
#include
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap(0);
VideoWriter wri;
//将从设备或文件获得的帧写入指定的视频文件中
string outFile = "../libo_output/output.avi";
//获得帧的宽高并在控制台显示
int frameWidth, frameHeight;
frameWidth = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));
frameHeight = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
//cout << "总帧数:" << cap.get(CV_CAP_PROP_FRAME_COUNT)<<endl;//若读入为视频文件,可以输出视频文件总帧数
cout << "帧宽:" << frameWidth << "像素" << endl;
cout << "帧高:" << frameHeight << "像素" << endl;
Size frameSize(frameWidth, frameHeight); //Size(x,y)型,或用Size frameSize = Size((int)cap.get(CV_CAP_PROP_FRAME_WIDTH),(int)cap.get(CV_CAP_PROP_FRAME_HEIGHT));
//获得设备或文件原始帧率,并在控制台显示
double frameRate = cap.get(CV_CAP_PROP_FPS);
cout << "原始帧率:" << frameRate << "fps" << endl;//****注意***:当读出帧率为0时,最好不作为wri.open()的帧率设置参数,可以手动设置一个double值
//打开要写入的视频文件,准备写入!编解码方式参数设置为-1,表示代码运行时会弹出对话框,手动选择编解码方式
//当读出帧率为0时,可改为wri.open(outFile, -1, 25.0, frameSize, true);25.0对应的形参影响生产的文件的播放速度
wri.open(outFile, -1, 10.0, frameSize, true);
//wri.open(outFile, -1, frameRate, frameSize, true);//true代表彩色输出!
if (!wri.isOpened())
{
cout << "写视频对象问件预打开操作失败" << endl;
return -2;
}
//打开摄像头或者视频文件
cap.open(0);//打开ID为0的摄像头文件,打开视频文件为,型如:cap.open("test_02.wmv");
//检验必不可少!
if (!cap.isOpened())
{
cout << "打开失败!请检查设备ID或读入文件路径";
return -1;
}
Mat frame;
namedWindow("USB设备图像采集", 1);//自适应设备图像大小
//在窗口显示图像和写入图像到之前打开的新文件!注意:显示帧率不同于设备帧率或者读入的视频文件原始帧率
bool stopDisplay = false;//是否继续显示的控制标志位,也可用if加break控制
int count = 0;
while (!stopDisplay)
{
if (!cap.read(frame))//尝试读取下一帧
break;//检验确实读到了图像数据到Mat对象的数据缓冲区,或用if(!frame.empty())
imshow("USB设备图像采集", frame);
//写入此帧到定义的视频文件
wri << frame;//或者wri.write(frame);
count++;
//退出while循环的开关控制
if (waitKey(40) > 0)//单击**GUI活动窗口,按任意键,即满足if条件,终止循环
stopDisplay = true;
}
cout << "写入输出的视频文件总帧数:" << count << endl;
//释放对象
waitKey(0);
cap.release();
wri.release();
return 0;
}
下一篇: 夏季手脚冰凉 艾灸五个穴位即可