做这个代码时只在保存转化后的视频时出现了问题,就是保存的avi文件打不开,并且大小很小(所以我怀疑没有写进去)
导致出错的代码
VideoWriter writer("qinshi3.avi", CV_FOURCC('X', 'V', 'I', 'D'), FrameRate, Size(frameWidth, frameHeight));
我怀疑初始化那里没有打开文件,所以没写进去,后来参考了网上的代码,修改如下
writer.open("qinshi3.avi", -1, FrameRate, Size(frameWidth, frameHeight), true);//打开视频文件,准备写入
第一个当然也没有错,但是在此处是不行的,在剪切原视频时它是可以用的。
代码1:用opencv打开一个视频并加特效(灰度转换、高斯滤波、canny边缘检测处理)再保存边缘检测视频
#include <opencv2\opencv.hpp>
#include <cstdio>
using namespace cv;
int main()
{
//【1】读入视频
VideoCapture capture("C:\\Users\\小碗豆\\Downloads\\qinshi2.avi");
string outFlie = "C:\\Users\\小碗豆\\Downloads\\qinshi3.avi";
VideoWriter writer;
// 获取视频相关信息-帧像素宽高
int frameHeight =(int)capture.get(CV_CAP_PROP_FRAME_HEIGHT);
int frameWidth = (int)capture.get(CV_CAP_PROP_FRAME_WIDTH);
double FrameRate = capture.get(CV_CAP_PROP_FPS);
//VideoWriter writer("C:\\Users\\小碗豆\\Downloads\\qinshi3.avi", CV_FOURCC('X', 'V', 'I', 'D'), FrameRate, Size(frameWidth, frameHeight));//注意此处视频的尺寸大小要与真实的一致
writer.open(outFlie, -1, FrameRate, Size(frameWidth, frameHeight), true);
//【2】循环显示每一帧
while (1)
{
Mat frame, edges;//定义一个Mat变量,用于存储每一帧的图像
capture >> frame; //读取当前帧
//若视频播放完成,退出循环
if (frame.empty())
{
break;
}else
{
cvtColor(frame, edges, CV_BGR2GRAY);
writer<<edges;
imshow("读取视频", frame); //显示当前帧
waitKey(30); //延时30ms
}
}
capture.release();
writer.release();
return 0;
}
代码2:剪切视频
#include <opencv2\opencv.hpp>
#include <cstdio>
using namespace cv;
int main()
{
//【1】读入视频
VideoCapture capture("C:\\Users\\小碗豆\\Downloads\\qinshi.avi");
// 获取视频相关信息-帧像素宽高
int frameHeight = (int)capture.get(CV_CAP_PROP_FRAME_HEIGHT);
int frameWidth = (int)capture.get(CV_CAP_PROP_FRAME_WIDTH);
double FrameRate = capture.get(CV_CAP_PROP_FPS);
VideoWriter writer("C:\\Users\\小碗豆\\Downloads\\ICSIcut.avi", CV_FOURCC('M', 'J', 'P', 'G'), FrameRate, Size(frameWidth, frameHeight));//注意此处视频的尺寸大小要与真实的一致
//【2】循环显示每一帧
int i = 0;
while (1)
{
Mat frame;//定义一个Mat变量,用于存储每一帧的图像
capture >> frame; //读取当前帧
i++;
//若视频播放完成,退出循环
if (frame.empty())
{
break;
}
if (i>100 && i < 600)
{
writer << frame;
imshow("读取视频", frame); //显示当前帧
waitKey(30); //延时30ms
}
}
return 0;
}
使用opencv打开摄像头或视频文件,实时显示原始视频,将视频每一帧依次做灰度转换、高斯滤波、canny边缘检测处理(原始视频和这3个中间步骤处理结果分别在一个窗口显示),最后将边缘检测结果保存为一个视频avi文件。
#include<opencv2/opencv.hpp>
#include<cv.h>
using namespace cv;
using namespace std;
int main()
{
VideoCapture capture("G:\\avi\\qinshi.avi");
int num = 1;
Mat edges,edges2; //定义一个Mat变量,用于存储每一帧的图像
VideoWriter writer;
double FrameRate = capture.get(CV_CAP_PROP_FPS);// 获取视频相关信息-帧率
// 获取视频相关信息-帧像素宽高
int frameHeight = capture.get(CV_CAP_PROP_FRAME_HEIGHT);
int frameWidth = capture.get(CV_CAP_PROP_FRAME_WIDTH);
writer.open("VideoOut.avi", -1, FrameRate, Size(frameWidth, frameHeight), true);
while (1)
{
Mat frame; //定义一个Mat变量,用于存储每一帧的图像
capture >> frame; //读取当前帧
if (frame.empty())
{
break;
}
else
{
Canny(frame, edges2, 0, 30, 3);//边缘化2
writer << edges2;//保存
if (num == 1) {
cvtColor(frame, edges, CV_BGR2GRAY);//彩色转换成灰度
num = 2;
}
else if (num == 2) {
GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);//高斯模糊化
num = 3;
}
else if (num == 3) {
Canny(edges, edges, 0, 30, 3);//边缘化1
num = 1;
}
Canny(frame, edges2, 0, 30, 3);//边缘化2
writer << edges2;
imshow("原视频", frame);
imshow("三特效视频", edges); //显示当前帧
}
waitKey(30); //延时30ms
}
capture.release();
writer.release();
return 0;
}
结果
注:编译环境为vs2015.