吃饱没事做之——将视频提取出边框,然后再生成视频

吃饱没事做之——将视频提取出边框,然后再生成视频,第1张

看了一个B站的视频之后,那是将视频的边框提取出来之后,对其进行再生成视频文件。

然后就在想,用opencv实现好像很简单,然后在网上查略资料之后,对其进行打代码

贴代码,注释都在上面了。

#include "opencv2/opencv.hpp"
#include 
#include "opencv2/highgui/highgui.hpp"


using namespace std;
using namespace cv;

Mat picture_cl(Mat& image);
void v_i_v(string video,string path);

int main( int argc, char** argv )
{
    v_i_v(argv[1],argv[2]);
	waitKey(0);
    return 0;
}


/***
 * 将图片压缩到原本的0.7倍
 * 将图片二值化
 * 并用canny方法把边框提取出来
 * argv  图片路径
 * path  处理完成的图片路径
***/
void picture_c(string argv,string path,int num)
{
    Mat image;
    char temp_file [10];
    vector<vector<cv::Point>> contours;
    vector<cv::Vec4i> hierarchy;
    string filename;

    image = imread( argv, 1 );
    cv::resize(image,image,cv::Size(0,0), 0.7, 0.7);

    cvtColor(image, image, cv::COLOR_RGB2GRAY);
    Canny(image, image, 60, 90, 3, false);

    sprintf(temp_file,"%06d",num);
    filename = temp_file;
    filename = path+filename+".jpg"; 
    imwrite(filename,image);
}



/***
 * 将图片压缩到原本的0.7倍
 * 将图片二值化
 * 并用canny方法把边框提取出来
 * 并返回
 * image  将处理的图片
***/
Mat picture_cl(Mat& image)
{

    cv::resize(image,image,cv::Size(0,0), 0.7, 0.7);
    cvtColor(image, image, cv::COLOR_RGB2GRAY);
    Canny(image, image, 70, 90, 3, false);
    return image;  
}


/***
 * 用来将视频转化为图片,再将图片转化为视频
 * video 转 image 转 video
 * 简称v_i_v
 * 
 * videocapture  打开视频,将视频转化为图片用
 * videowrite    用来将图片输入进去做成视频
 * 
 * video  视频地址
 * path   制作成的视频地址
***/
void v_i_v(string video,string path)
{
    Mat frame;
	int num=1;
	string filename;
	char  temp_file[10];

    VideoCapture capture(video);
	if(!capture.isOpened())
	{
		cerr<<"Failed to open a video"<<endl;
	}

    capture>>frame;
    if(!frame.empty())
        picture_cl(frame);
    

    int fourcc    = VideoWriter::fourcc('D','I','V','X'); //编解码类型
	double fps    = capture.get(CAP_PROP_FPS);  //每秒的帧数
	bool iscolor  = true;
	cv::Size size(frame.cols,frame.rows);
	//int frameWidth = frame.cols; //帧宽度
	//int frameHeight= frame.rows; //帧高度
	VideoWriter Writer;
	
	Writer = VideoWriter(path,fourcc,fps,size,false);
    
	cout << size << endl;

	Writer.write(frame);`在这里插入代码片`
 
	for(;;)
	{
		capture>>frame;
		if(frame.empty())
			break;
        picture_cl(frame);
		Writer.write(frame);
	}
	capture.release();
    Writer.release();
}

CMakeList.txt

cmake_minimum_required(VERSION 3.5)

# 项目名称
PROJECT(main)

# 二进制文件
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY)

# 引入 OpenCV 包
find_package(OpenCV REQUIRED)

# 头文件
include_directories(${OpenCV_INCLUDE_DIRS})


message(STATUS "OpenCV library status:")
message(STATUS "    config: ${OpenCV_DIR}")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

# 可执行文件和源文件
add_executable(main main.cpp)

# 库文件
link_directories(${OpenCV_LIBRARY_DIRS})
target_link_libraries(main ${OpenCV_LIBS})

之后这里是:样例视频 https://www.bilibili.com/video/BV1D3411M7Ef/?vd_source=b8f5fd5fbdb3be90a6b34af2481290e3

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1498146.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存