OpenCV长视频截短

为什么不用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++)

由于才粗学浅,这程序没有很流畅,需要一直摁回车键才能一直运行


#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
void getAllFiles(string path, vector<string>& files);
typedef std::vector<std::string>  StringList;
StringList splitstr(const std::string& str, char tag);

int main()
{
    string DATA_DIR = "C:/Users/大喵喵/Desktop/input";
    vector<string> files;

    char * DistAll = (char*)"AllFiles.txt";
    getAllFiles(DATA_DIR, files);
    int size = files.size();
    int  FaiNum = 0;
    cout << size << endl;
    for (int k = 0; k < size; k++)
    {
        cout << files[k] << endl;
        vector<string> name;
        name = splitstr(files[k], '/');
        cout << name[name.size()-1] << endl;
        string imgsName= name[name.size() - 1].substr(0, name[name.size() - 1].length() - 4);
        cout << imgsName << endl;
        VideoCapture capture(files[k]);
        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/大喵喵/Desktop/refFrames/"+imgsName + ii + ".jpg";
            imwrite(path, img);
            waitKey(1);
        }
        system("path");
        getchar();
    }

    return 0;
}

void getAllFiles(string path, vector<string>& files)
{

    intptr_t hFile = 0;

    struct _finddata_t fileinfo;
    string p;
    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);
        _findclose(hFile);
    }
}

StringList splitstr(const std::string& str, char tag)
{
    StringList  li;
    std::string subStr;

    for (size_t i = 0; i < str.length(); i++)
    {
        if (tag == str[i])
        {
            if (!subStr.empty())
            {
                li.push_back(subStr);
                subStr.clear();
            }
        }
        else
        {
            subStr.push_back(str[i]);
        }
    }

    if (!subStr.empty())
    {
        li.push_back(subStr);
    }

    return li;
}

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

把图片合成视频,图片放在文件夹里面,命名格式应该为:1.jpg,2.jpg,3.jpg…

目前只有MP4格式成功了,其他的没有试


#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);

                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;
    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);
        _findclose(hFile);
    }
}

4.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()

5.opencv多帧合成定长视频(python)

import cv2
import os
import natsort

def images_to_video():
    fps = 25  # 帧率
    num_frames = 15
    img_array = []
    img_width = 960
    img_height = 540
    path = "C:/Users/wwy/Desktop/TSRWGAN/mydata/imgs/"

    names = natsort.natsorted(os.listdir(path),alg = natsort.ns.PATH)
    #print(names)
    for file_name in names:
        #print(name)
    #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(names) / num_frames )
    k = 0;
    for w in range(1,video_num):
        out = cv2.VideoWriter("C:/Users/wwy/Desktop/TSRWGAN/mydata/video15fs/"+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()

Original: https://blog.csdn.net/Cream_Cicilian/article/details/124398396
Author: 一只大喵喵
Title: OpenCV长视频截短

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/703841/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球