打开视频文件或摄像头视频需要使用Opencv中的VideoCapture类,保存视频或摄像头视频到本地磁盘,需要使用Opencv中的VideoWriter类。
VideoWriter类的一个常用构造方式如下:
VideoWriter(const string& filename, int fourcc, double fps,Size frameSize, bool isColor=true);
其中fourcc代表了所使用的编码方式,如果输入-1,则会在运行时候弹出选择对话框,可以选择编码器:
filename 输出视频文件名。
fourcc为 四个字符用来表示压缩帧的codec 例如:
CV_FOURCC('P','I','M','1') = MPEG-1 codec
CV_FOURCC('M','J','P','G') = motion-jpeg codec
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') = H263 codec
CV_FOURCC('I', '2', '6', '3') = H263I codec
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
若编码器代号为 -1,则运行时会弹出一个编码器选择框.
fps 被创建视频流的帧率。frame_size 保存视频的宽和高。
isColor如果非零,编 码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。
备注:
生成文件占用空间最小的编码方式是MPEG-4.2 codec。在VideoWriter类的构造函数参数为CV_FOURCC('M', 'P', '4', '2') 。
最大的是MPEG-1 codec,对应在VideoWriter类的构造函数参数为CV_FOURCC('P','I','M','1') ,所占磁盘空间是前者的5.7倍。所以如果需要24小时全天候录制监控,可以优先使用MPEG-4.2的编解码方式。
例子:
录制摄像头视频到本地
-
#include <stdio.h>
-
#include <opencv2/core/core.hpp>
-
#include <opencv2/highgui/highgui.hpp>
-
#include <opencv2/imgproc/imgproc.hpp>
-
-
using
namespace
std;
-
using
namespace cv;
-
-
-
int main()
-
{
-
VideoCapture cap(0);
-
-
if (!cap.isOpened())
-
{
-
printf(
"open video failed!\n");
-
return
1;
-
}
-
-
Mat Frame;
-
-
//设置保存的视频帧数目
-
int frameNum =
100;
-
//保存视频的路径
-
string outputVideoPath =
"..\\test.avi";
-
//获取当前摄像头的视频信息
-
cv::Size sWH = cv::Size((
int)cap.get(CV_CAP_PROP_FRAME_WIDTH),
-
(
int)cap.get(CV_CAP_PROP_FRAME_HEIGHT));
-
VideoWriter outputVideo;
-
outputVideo.open(outputVideoPath, CV_FOURCC(
'M',
'P',
'4',
'2'),
25.0, sWH);
-
-
while (cap.isOpened() && frameNum >
0)
-
{
-
cap >> Frame;
-
if (Frame.empty())
break;
-
outputVideo << Frame;
-
frameNum--;
-
-
imshow(
"img", Frame);
-
waitKey(
10);
-
-
if (
char(waitKey(
1)) ==
'q')
break;
-
}
-
-
outputVideo.release();
-
system(
"pause");
-
}
可能遇到的问题:
1.打不开视频或摄像头
①.本地视频的输入路径有问题,例如下面所示:
string outputVideoPath = "C:\Users\Test\Testopencv\3.avi";
上述方式会因为转义符而出现问题。
正确的路径命名方式为:
-
string outputVideoPath =
"C:\\Users\\Test\\Testopencv\\3.avi";
-
string outputVideoPath =
"C:/Users/Test/Testopencv/3.avi";
②.摄像头前几帧出现空帧
解决办法:多次加载视频,cap>>Frame直至图像不为空
在open函数中第二个参数是编码格式,一定按照提供的编码格式进行填写,在应用中最好的解决方法是为-1。
2.保存文件为空
可能是后缀名的问题,尝试使用.avi。
3.保存文件打不开
可能是帧率及图像宽高设置有误
参考:
1.https://www.cnblogs.com/polly333/p/5165290.html
欢迎指正,转载请注明出处https://blog.youkuaiyun.com/qq_42189368/article/details/80663174