支持常见的视频格式:mp4 avi flash 甚至是 rtsp 实时流
每帧间隔超过 300ms 人眼就会认定为两张独立的图像,FPS 15 帧 20 帧 是可以接受的,最低甚至可以接受 5帧
代码
#include "../common/common.hpp"
void main(int argc, char** argv)
{
//VideoCapture capture(0);
VideoCapture capture;
capture.open(getCVImagesPath("videos/sample.mp4"));
double fps = capture.get(CV_CAP_PROP_FPS); // 获取视频帧率
double frameWidth = capture.get(CV_CAP_PROP_FRAME_WIDTH); // 获取视频帧的宽高
double frameHeight = capture.get(CV_CAP_PROP_FRAME_HEIGHT);
cout << "fps=" << fps << ", frameWidth=" << frameWidth << ", frameHeight=" << frameHeight << endl;
VideoWriter writer;
/*
bool open( // 打开要写的视频
const String& filename, // 要写入的路径
int apiPreference,
// 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,则运行时会弹出一个编码器选择框(实际运行,没有对话框,直接写入了, writer传.mp4自动识别了?)
int fourcc,
double fps, // 被创建视频流的帧率
Size frameSize, // 视频流的大小
bool isColor = true // 如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)
);
*/
writer.open(getCVImagesPath("videos/_mywrite.mp4"), CV_FOURCC('D', 'I', 'V', 'X'), fps==0 ? 15 : fps, Size(frameWidth, frameHeight), true);
Mat frame, gray, binary;
while (capture.read(frame))
{
cvtColor(frame, gray, COLOR_BGR2GRAY);
threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
bitwise_not(frame, frame);
imshow("src6-2", frame);
writer.write(frame); // 写入每一帧,写入的视频的帧率与原视频的一致,算法的耗时与下面的waitKey的时长不会影响帧率
if (waitKey(40) == 27) break;
}
capture.release();
writer.release(); // 释放资源
waitKey(0);
}
效果图