Opencv的视频流包括文件视频和摄像头视频,而这两种视频流的处理方法在Opencv中是一样的。
视频的读取和显示(摄像头只需将视频名改成一个整型数)
#include "cv.h"
#include "highgui.h"
using namespace cv;
using namespace std;
int main(int argc,char *argv[])
{
VideoCapture vFile("mv.mp4"); //或使用vFile.open("mv.mp4");
if(!vFile.isOpened())
{
cout<<"Video file can not open!"<<endl;
return -1;
}
cout<<"Video imformation:"<<endl;
cout<<"Frame width:"<<vFile.get(CV_CAP_PROP_FRAME_WIDTH)<<endl;
cout<<"Frame height:"<<vFile.get(CV_CAP_PROP_FRAME_HEIGHT)<<endl;
cout<<"Frame count:"<<vFile.get(CV_CAP_PROP_FRAME_COUNT)<<endl;
cout<<"Frame fps:"<<vFile.get(CV_CAP_PROP_FPS)<<endl;
Mat frameImg;
int frameTime=int(1000./vFile.get(CV_CAP_PROP_FPS)); //粗略控制视频帧率
char c;
while(true)
{
vFile>>frameImg;//从视频流获取一帧图像,或使用vFile.read(frameImg);,又或者使用vFile.grab();vFile.retrieve(frameImg);
if (!frameImg.data)
{
cout<<"Video end!"<<endl;
break;
}
imshow("frameImg",frameImg);
c=waitKey(frameTime);
if (c==27) break;
}
vFile.release();
return 0;
}
视频的比较(程序参照官网文档),下面介绍两种方法:PSNR和SSIM
程序如下:
使用Opencv创建视频(针对文件视频)
#include "cv.h"
#include "highgui.h"
using namespace cv;
using namespace std;
int main(int argc,char *argv[])
{
VideoCapture vFile("mv0.mp4"); //或使用vFile.open("mv.mp4");
if(!vFile.isOpened())
{
cout<<"Video file can not open!"<<endl;
return -1;
}
cout<<"Video imformation:"<<endl;
cout<<"Frame width:"<<vFile.get(CV_CAP_PROP_FRAME_WIDTH)<<endl;
cout<<"Frame height:"<<vFile.get(CV_CAP_PROP_FRAME_HEIGHT)<<endl;
cout<<"Frame count:"<<vFile.get(CV_CAP_PROP_FRAME_COUNT)<<endl;
cout<<"Frame fps:"<<vFile.get(CV_CAP_PROP_FPS)<<endl;
Mat frameImg,dstImg(360,640,CV_8UC3);
int frameTime=int(1000./vFile.get(CV_CAP_PROP_FPS)); //粗略控制视频帧率
char c;
union{int fourcc;char cc[5];} vUnion;
vUnion.fourcc=static_cast<int>(vFile.get(CV_CAP_PROP_FOURCC)); //获取编码方式
vUnion.cc[4]='\0';
cout<<"Video Fourcc:"<<vUnion.cc<<endl;
VideoWriter vWriter;
vWriter.open("mv0.mp4",vUnion.fourcc,vFile.get(CV_CAP_PROP_FPS),Size(640,360),true);//修改原视频的黑边
if (!vWriter.isOpened())
{
cout<<"Video Writer Open Error!\n";
system("pause");
return -1;
}
Vec3b *s,*d;
while(true)
{
vFile>>frameImg;//从视频流获取一帧图像,或使用vFile.read(frameImg);,又或者使用vFile.grab();vFile.retrieve(frameImg);
if (!frameImg.data)
{
cout<<"Video end!"<<endl;
break;
}
for (int i=0;i<360;i++)
{
s=frameImg.ptr<Vec3b>(i);
d=dstImg.ptr<Vec3b>(i);
for (int j=0;j<640;j++)
{
d[j]=s[j];
}
}
vWriter<<dstImg; //或使用vWriter.write(dstImg);
imshow("dstImg",dstImg);
c=waitKey(frameTime/10);
if (c==27) break;
}
vFile.release();
return 0;
}
效果:Writer的后缀名设置成avi写失败,设置成mp4才行的。
摄像头视频保存
#include "cv.h"
#include "highgui.h"
using namespace cv;
using namespace std;
int main(int argc,char *argv[])
{
VideoCapture vFile(0);
if(!vFile.isOpened())
{
cout<<"Video file can not open!"<<endl;
return -1;
}
cout<<"Video imformation:"<<endl;
cout<<"Frame width:"<<vFile.get(CV_CAP_PROP_FRAME_WIDTH)<<endl;
cout<<"Frame height:"<<vFile.get(CV_CAP_PROP_FRAME_HEIGHT)<<endl;
Mat frameImg;
char c;
VideoWriter vWriter;
vWriter.open("video.avi",CV_FOURCC('M','J','P','G'),15.,Size(640,480),true);
if (!vWriter.isOpened())
{
cout<<"Video Writer Open Error!\n";
system("pause");
return -1;
}
Vec3b *s,*d;
while(true)
{
vFile>>frameImg;
if (!frameImg.data)
{
cout<<"Video end!"<<endl;
break;
}
vWriter<<frameImg;
imshow("frameImg",frameImg);
c=waitKey(15);
if (c==27) break;
}
vFile.release();
return 0;
}