用opencv打开一个视频并加特效(灰度转换、高斯滤波、canny边缘检测处理)再保存

做这个代码时只在保存转化后的视频时出现了问题,就是保存的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.

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值