OpenCV长视频截短

OpenCV长视频截短,第1张

OpenCV长视频截短
    • 1.opencv读取视频帧并保存
    • 2.opencv多帧合成视频(c++)
    • 3.opencv多帧合成视频(python)
    • 4.opencv多帧合成定长视频(python)

为什么不用pr,剪映,PotPlayer呢?我手残,我不会
还有用这些去搞一条就15帧,1s不到的视频,真是杀鸡用牛刀

1.opencv读取视频帧并保存

将长视频打散成一帧一帧的

#include 
#include

using namespace std;
using namespace cv;

int main()
{
	VideoCapture capture("C:/Users/wwy/Desktop/test.mp4");//视频路径
	int i = 0;
	while (1)
	{
		i++;
		Mat img;
		capture >> img;
		if (img.empty()) {
			printf("播放完成\n");
			break;
		}
		imshow("res", img);//显示图片
		string ii = std::to_string(i);
		string path = "C:/Users/wwy/Desktop/111/" + ii+ ".jpg";//保存路径
		imwrite(path,img);
		waitKey(1);
	}

	waitKey(0);
	system("path");
	getchar();
	return 0;
}


2.opencv多帧合成视频(c++)

把图片合成视频,图片放在文件夹里面,命名格式应该为:1.jpg,2.jpg,3.jpg…
目前只有MP4格式成功了,其他的没有试

// TestForOnlyC++.cpp : 定义控制台应用程序的入口点。
//

/*
为了保证视频帧顺序,对图片命名要有顺序逻辑,对于本代码,图片命名格式需要为1.jpg、2.jpg...
*/

#include 
#include 
#include 
#include 
#include 
#include
#include 

using namespace std;
using namespace cv;
void getAllFiles(string path, vector<string>& files);
//测试
int main()
{
	int frames = 15;//一条视频多少帧
	string DATA_DIR = "C:/Users/wwy/Desktop/111/";//图片所在文件夹

	vector<string> files;
	char * DistAll = (char*)"AllFiles.txt";
	getAllFiles(DATA_DIR, files);//所有文件与文件夹的路径都输出
	int size = files.size();
	cout << "图片一共"<<size <<"张"<< endl;
	int videoNum = size / frames;
	int MaxFrame = videoNum * (frames-1);
	cout << "可以制作" << videoNum << "条视频" << endl;
	
	int video_wight = 480;
	int video_hight = 320;
	


	for (int i = 1; i < videoNum + 1; i++) {
		cv::VideoWriter Writer;
		string i_string= to_string(i);
		string filepath = "C:/Users/wwy/Desktop/111/1/"+i_string+".mp4";
		Writer.open(filepath, VideoWriter::fourcc('M', 'P', '4', '2'), 25, Size(video_wight, video_hight), 1);
		if (!Writer.isOpened())
		{
			cout << "无法保存视频" << endl;
		}
		else {
			for (int cou = frames*i-(frames-1); cou < frames * i+1&& MaxFrame; cou++)
			{
				string ii = to_string(cou);
				string path = DATA_DIR + ii + ".jpg";
				Mat src = imread(path);
				resize(src, src, Size(video_wight, video_hight), 0, 0, INTER_LINEAR);
				//imshow("res", src);//显示图片
				cout << path << endl;
				Writer.write(src);//输出视频
			}
			cout << "保存成功" << endl;
		}
		Writer.release();
	}
	waitKey(0);
	return 0;
}

void getAllFiles(string path, vector<string>& files)
{
	//文件句柄  
	intptr_t hFile = 0;
	//文件信息  
	struct _finddata_t fileinfo;  //很少用的文件信息读取结构
	string p;  //string类很有意思的一个赋值函数:assign(),有很多重载版本
	if ((hFile = _findfirst(p.assign(path).append("\*").c_str(), &fileinfo)) != -1)
	{
		do
		{
			if ((fileinfo.attrib &  _A_SUBDIR))  //判断是否为文件夹
			{
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
				{
					files.push_back(p.assign(path).append("/").append(fileinfo.name));//保存文件夹名字
					getAllFiles(p.assign(path).append("/").append(fileinfo.name), files);//递归当前文件夹
				}
			}
			else    //文件处理
			{
				files.push_back(p.assign(path).append("/").append(fileinfo.name));//文件名
			}
		} while (_findnext(hFile, &fileinfo) == 0);  //寻找下一个,成功返回0,否则-1
		_findclose(hFile);
	}
}

3.opencv多帧合成视频(python)
import cv2
import os


def images_to_video():
    fps = 25  # 帧率
    num_frames = 500
    img_array = []
    img_width = 320
    img_height = 240
    path = "/home/user/WWY/results/test_results0/test/"
    imglist = os.listdir(path)
    print(imglist)
    imglist.sort(key=lambda x: int(x[0:-4]))
    print(imglist)
    #imgt=cv2.imread("/home/user/WWY/results/test_results0/test/8.png")
    #cv2.imshow("1",imgt)
    #cv2.waitKey(0)
    for file_name in os.listdir(path):
        img = cv2.imread(path + file_name)
        dim=(img_width,img_height)
        resized=cv2.resize(img,dim,interpolation=cv2.INTER_AREA)
        print(path + file_name)
        if img is None:
            print(file_name + " is non-existent!")
            continue
        img_array.append(resized)

    out = cv2.VideoWriter('demo_1.avi', cv2.VideoWriter_fourcc(*'XVID'), fps, (img_width, img_height))
    #out = cv2.VideoWriter('demo_people.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (img_width, img_height))

    for i in range(len(img_array)):
        out.write(img_array[i])
    out.release()


def main():
    images_to_video()


if __name__ == "__main__":
    main()


4.opencv多帧合成定长视频(python)
import cv2
import os


def images_to_video():
    fps = 25  # 帧率
    num_frames = 15
    img_array = []
    img_width = 320
    img_height = 240
    path = "C:/Users/wwy/Desktop/111/"
    imglist = os.listdir(path)
   # print(imglist)
    imglist.sort(key=lambda x: int(x[0:-4]))
    print(len(imglist))



    for file_name in os.listdir(path):
        img = cv2.imread(path + file_name)
        dim=(img_width,img_height)
        resized=cv2.resize(img,dim,interpolation=cv2.INTER_AREA)
        if img is None:
            print(file_name + " is non-existent!")
            continue
        img_array.append(resized)


    #out = cv2.VideoWriter('demo_people.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (img_width, img_height))
    video_num = int(len(imglist) / num_frames - 1)
    k = 0;
    for w in range(1,video_num):
        out = cv2.VideoWriter(str(w)+'.avi', cv2.VideoWriter_fourcc(*'XVID'), fps, (img_width, img_height))
        for i in range(k,k+num_frames):
            out.write(img_array[i])
        out.release()
        k = k+num_frames
        print(k)

def main():
    images_to_video()


if __name__ == "__main__":
    main()




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

原文地址: https://outofmemory.cn/langs/757207.html

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

发表评论

登录后才能评论

评论列表(0条)

保存