计算机系统应用教程网站

网站首页 > 技术文章 正文

零基础学习Opencv-第10节-读写视频

btikc 2024-09-30 13:12:46 技术文章 12 ℃ 0 评论

图像文件可以根据其后缀名知道图像文件的数据结构,但是视频文件后缀名不能说明其数据结构。视频文件能否正常打开,关键是你是否有编码器的解码器

所谓编码器就是指视频文件的压缩算法

所谓解码器就是视频文件的解压缩算法

1、读视频--VideoCapture

视频来源包括两种:(1)读取视频文件;(2)打开摄像头读取实时视频数据。

案例:

读取视频,并每30s读取一帧,对该帧进行边缘检测

int test8() {

//打开摄像头

//VideoCapture cap(0);

//读取视频

VideoCapture cap("C:\\Users\\86188\\Desktop\\swa.mp4");

//检查是否打开成功

if (!cap.isOpened())

{

cerr << "Can not open a camera or file" << endl;

return -1;

}

Mat result;

Mat frame;

//创建一个用于显示的窗口

namedWindow("result",1);

for (;;)

{

//将视频每一帧保存到frame

cap >> frame;

if (frame.empty())

break;

//将得到的图像转化成灰度图

cvtColor(frame, result, COLOR_RGB2GRAY);//COLOR_BGR2GRAY

//显示原图

imshow("原图",frame);

//提取边缘

Canny(result,result,85,150,3);

//显示

imshow("result",result);

if (waitKey(30) >= 0)

break;

}

//退出时会自动释放 cap 中占用资源

return 0;

}

效果如下:


2、写视频--VideoWriter::write()函数

关键是要设置一些参数,包括:文件名,编解码器,帧率,宽度,高度。

三种编解码器的选择(不同OPencv版本函数略有不同)

CV_FOURCC('M','J','P','G')、CV_FOURCC('X','V','I','D')、CV_FOURCC('D','I','V','X')

写视频其实就是将一幅图像写成一个视频文件,所以视频的像素大小必须跟写入图像一样

案例,

int test9() {

Size s(300, 600);//定义视频的宽度和高度

//创建writer,并指定FOURCC及FPS等参数

VideoWriter writer = VideoWriter("C:\\Users\\86188\\Desktop\\myVideo.avi",

VideoWriter::fourcc('M', 'J', 'P', 'G'), 25, s);//opencv4中CV_FOURCC改成fourcc

//检查是否创建成功

if (!writer.isOpened())

{

cerr << "Can not create video file.\n" << endl;

return -1;

}

//视频帧

Mat frame(s, CV_8UC3);//定义三通道图像

for (int i = 0; i < 100; i++)

{

//将图像置为黑色

frame = Scalar::all(0);

//将整数 i 转为 i 字符串类型

char text[128];

snprintf(text, sizeof(text), "%d", i);

//将数字绘到画面上

putText(frame, text, Point(s.width / 3, s.height / 3),

FONT_HERSHEY_SCRIPT_SIMPLEX, 3,

Scalar(0, 0, 255), 3, 8);

//将图像写入视频

writer << frame;

}

//退出程序时会自动关闭视频文件

//上面视频写完了。我们再读取一下,并展示一下效果

VideoCapture myVdieo ("C:\\Users\\86188\\Desktop\\myVideo.avi");

namedWindow("myVideo", 1);

Mat temp;

for (;;)

{

myVdieo >> temp;

if (temp.empty())

break;

imshow("myVideo", temp);

}

//突出程序时候会自动关闭视频文件。或者使用下面进行释放

//myVdieo.release();

return 0;

}


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表