示例代码:
/************************************************************************
* @ Creator:OYXL
* @ Project Creation time:2018/5/24
* @ Function:OpenCV录制视频
* @ Attention:需要按ESC才能完整录制视频,直接停止调试录制的视频是没有时间的
************************************************************************/
#include "opencv2/opencv.hpp"
int main()
{
//VideoCapture类对象,用于打开视频和摄像头
cv::VideoCapture capture;
//VideoWriter类对象,用于录像
cv::VideoWriter recordVideo;
capture.open(0);
recordVideo.open("201956.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, cv::Size(640, 480), true);
cv::Mat frame;
while (capture.isOpened())
{
capture >> frame;
recordVideo << frame;
imshow("录制视频", frame);
//ESC退出
if (cv::waitKey(25) == 27)
{
break;
}
}
capture.release();
//需要释放
recordVideo.release();
return 0;
}
代码解析
00 VideoWriter类(用于录制视频的类和VideoCapture类一样)
class CV_EXPORTS_W VideoWriter
{
public:
CV_WRAP VideoWriter();
CV_WRAP VideoWriter(const string& filename, int fourcc, double fps,
Size frameSize, bool isColor=true);
virtual ~VideoWriter();
CV_WRAP virtual bool open(const string& filename, int fourcc, double fps,
Size frameSize, bool isColor=true);
CV_WRAP virtual bool isOpened() const;
CV_WRAP virtual void release();
virtual VideoWriter& operator << (const Mat& image);
CV_WRAP virtual void write(const Mat& image);
protected:
Ptr<CvVideoWriter> writer;
};
VideoWriter类在OpenCV的highgui.hpp里面,像上面看到的一样包含了:open()函数、isOpened()函数、release()函数、write()函数,还有一个VideoWriter& operator << (const Mat& image);
01 创建VideoWriter类对象
VideoWriter m_SkyWrite; //<VideoWriter类对象,用于录像
02 初始化录像
bool open(const string& filename, int fourcc, double fps,
Size frameSize, bool isColor=true);
参数:
filename:保存视频的路径名
fourcc:录制视频的格式
OpenCV提供的格式是未经过压缩的,个人感觉录制的视频是有损失的,没有原视频效果好,目前支持的格式如下:
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
fps:录制视频的帧率(1秒多少帧)
frameSize:录制视频图片的尺寸大小(需要跟原图像保持一致)
isColor:bool类型的,一般默认为true,彩色
03 录制视频(逐帧写入)
m_SkyWrite<<frame;
或者
m_SkyWrite.write(frame);
04 释放对象(最好要释放对象,不然可能录制的视频是没有时间的)
m_SkyWrite.release();
05 操作
用上面这段代码,由于加了个按键控制视频录制,所以需要按下ESC才能完成视频录制