概述
opencv操作摄像头和视频都需要用VideoCapture类;话不多说吧,内容都在代码和注释里(Qt+opencv3);
1、打开摄像头并修改保存
//1.打开摄像头
void VideoOpen()
{
//下面的代码在mian函数里或用其他函数调用即可
/*VideoCapture结构体,保存图像信息,open()参数为int index(0为默认摄像头),读入摄像头视频,
open()参数为路径,读入视频文件*/
VideoCapture cap(0); // 打开摄像头0
if (!cap.isOpened())
// 异常处理
{
QMessageBox mesg;
mesg.about(NULL,"提示","摄像头打开失败");
waitKey(1000);
}
double width = cap.get(CV_CAP_PROP_FRAME_WIDTH);
//帧宽度
double height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //帧高度
double frameRate = cap.get(CV_CAP_PROP_FPS);
//帧率 x frames/s
double totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT); //总帧数
//输出视频相关参数信息
qDebug()<<"视频宽度="<<width;
qDebug()<<"视频高度="<<height;
qDebug()<<"视频总帧数="<<totalFrames;
qDebug()<<"帧率="<<frameRate;
Size size0 = Size(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
VideoWriter writer("D:\opecvVIdeo.avi", //文件名
-1, //编解码器,写入视频前需安装对应的编解码器。这里填-1,不指定编解码方式,程序运行时会跳出窗口让我们选择
cap.get(CV_CAP_PROP_FPS),//播放帧率
size0,//帧尺寸,生成视频尺寸需与读取视频尺寸一致,若不一致,则写入的视频会出错。
false);/*是否创建彩色视频,生成视频是否支持彩色应与构造函数设置一致
因为后面进行candy检测,每一帧都变成了黑白二值图像,所以这里应填false
如果填true,则写入的视频会出错
*/
while (1)
{
Mat frame;
bool bSuccess = cap.read(frame); // 获取一帧
if (!bSuccess) //异常处理
{
QMessageBox mesg;
mesg.about(NULL,"提示","Cannot read a frame from video stream");
break;
}
cvtColor(frame, frame, CV_BGR2GRAY );//Canny边缘检测需要灰度图像
Canny(frame, frame, 50, 100); //Canny 边缘检测
writer<<frame;
//写入帧方法一
imshow("MyVideo", frame); //显示获取到的视频帧
if (waitKey(30) == 27) //按键退出
{
QMessageBox mesg;
mesg.about(NULL,"信息","退出摄像");
break;
}
}
waitKey(10);
cap.release();
}
效果如下:
2.读取视频文件并修改:
//2.读取并修改视频文件
void AVIopen()
{
//
VideoCapture cap("http:/.avi");//也可以是网络视频,不过很少网站时avi格式的
//
VideoCapture cap;
//读取视频方法二
//
cap.open("E:\2.avi");
//下面的代码在mian函数里或用其他函数调用即可,我是加了按钮调用;
/*VideoCapture结构体,保存图像信息,open()参数为int index(0为默认摄像头),读入摄像头视频,
open()参数为路径,读入视频文件*/
VideoCapture cap("D:\1.avi"); // 打开摄像头0
if (!cap.isOpened())
// 异常处理
{
QMessageBox mesg;
mesg.about(NULL,"提示","摄像头打开失败");
waitKey(1000);
}
/创建一个视频格式并写入
//VideoCapture的get方法返回指定视频类的相关参数信息
double width = cap.get(CV_CAP_PROP_FRAME_WIDTH);
//帧宽度
double height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //帧高度
double frameRate = cap.get(CV_CAP_PROP_FPS);
//帧率 x frames/s
double totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT); //总帧数
//输出视频相关参数信息
qDebug()<<"视频宽度="<<width;
qDebug()<<"视频高度="<<height;
qDebug()<<"视频总帧数="<<totalFrames;
qDebug()<<"帧率="<<frameRate;
Size size0 = Size(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
//VideoWriter类的构造函数
//VideoWriter writer("E:\out.avi", CV_FOURCC('X', 'V', 'I', 'D'), 20, size0, true);
VideoWriter writer("D:\out.avi", //文件名
-1, //编解码器,写入视频前需安装对应的编解码器。这里填-1,不指定编解码方式,程序运行时会跳出窗口让我们选择
cap.get(CV_CAP_PROP_FPS),//播放帧率
size0,//帧尺寸,生成视频尺寸需与读取视频尺寸一致,若不一致,则写入的视频会出错。
false);/*是否创建彩色视频,生成视频是否支持彩色应与构造函数设置一致
因为后面进行candy检测,每一帧都变成了黑白二值图像,所以这里应填false
如果填true,则写入的视频会出错
*/
while (1)
{
Mat frame;
bool bSuccess = cap.read(frame); // 获取一帧
if (!bSuccess) //异常处理
{
QMessageBox mesg;
mesg.about(NULL,"提示","视频结束");
break;
}
cvtColor(frame, frame, CV_BGR2GRAY );//Canny边缘检测需要灰度图像
Canny(frame, frame, 50, 100); //Canny 边缘检测
imshow("MyVideo", frame); //显示获取到的视频帧
//
writer<<frame;
//写入帧方法一
//writer.write(frame); //写入帧方法二
/
if (waitKey(30) == 27) //按键退出
{
QMessageBox mesg;
mesg.about(NULL,"信息","退出摄像");
break;
}
}
waitKey(10);
cap.release();
}
效果如下,左边是opencv读取,右边原图:
3.视频分解,将avi视频每一帧都单独保存为一张图片:
void AVIseparate()//3.视频文件分解
{
Mat frame;
char outfile[50];
VideoCapture cap("D:\1.avi"); //创建VideoCapture类读视频
if(!cap.isOpened())
//判断是否成功打开视频
return;
int totalFrame = cap.get(CV_CAP_PROP_FRAME_COUNT); //VideoCapture类的get方法获取视频总帧数
for(int i = 1; i<=totalFrame; i++)
//for循环totalFrame次
{
cap>>frame;
//读取每一帧
if(frame.empty())
//判断帧异常
break;
sprintf(outfile, "D:\allframe\%d.bmp", i); //利用sprintf格式化图片名
imwrite(outfile, frame);
//保存每一帧到目标地址
imshow("video", frame);
waitKey(15);
}
cap.release();
destroyAllWindows();
QMessageBox mesg;
mesg.about(NULL,"信息","视频分解完毕");
}
效果如下:
4.将有序图片合成视频,注意图片大小和类型要一样,我合成的就是上面分解的视频:
void AVIcombine()//4.有序图片合成
{
//创建VideoWriter类写视频到本地,要确定好size,不然不能够合成
VideoWriter writer("D:\out2.avi", CV_FOURCC('X', 'V', 'I', 'D'), 20, Size(640, 480), true);
//VideoCapture cap;
char filename[50];
Mat frame;
for(int i = 1; i<200; i++)
{
sprintf(filename, "D:\allframe\%d.bmp", i);
frame = imread(filename);
//读图片的方法(一句就行)
if(frame.empty())
//检测帧异常
break;
writer<<frame;
//写入帧
}
//
qDebug()<<"视频合成完毕"<<endl;
destroyAllWindows();
QMessageBox mesg;
mesg.about(NULL,"信息","视频合成完毕");
}
然后出现如下文件:
最后
以上就是负责唇膏为你收集整理的【opencv学习之十七】摄像头及视频操作VideoCapture的全部内容,希望文章能够帮你解决【opencv学习之十七】摄像头及视频操作VideoCapture所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复