国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

python實現(xiàn)視頻抽幀,文件批量操作,文件批量處理(數(shù)據(jù)集制作的工具箱)

這篇具有很好參考價值的文章主要介紹了python實現(xiàn)視頻抽幀,文件批量操作,文件批量處理(數(shù)據(jù)集制作的工具箱)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

數(shù)據(jù)集制作的工具箱

目錄

  1. 環(huán)境準(zhǔn)備
  2. 數(shù)據(jù)集制作
  3. 文件批量重命名
  4. 文件批量移動
  5. 將文件批量按照一定格式進(jìn)行重命名
  6. 修改xml文件內(nèi)容的方法
  7. Pathlib庫的常用接口

引言

在計算機(jī)視覺項目中,文件批量操作和文件批量預(yù)處理是必不可少的步驟。它們涉及處理大量的圖像文件,包括讀取、處理、保存和預(yù)處理。本文將介紹一些常見的技術(shù)和方法,以幫助您在計算機(jī)視覺項目中有效地進(jìn)行文件批量操作和文件批量預(yù)處理。

環(huán)境準(zhǔn)備

from pathlib import Path, PurePath
import xml.etree.ElementTree as ET
from typing import Union
import numpy as np
from tqdm import tqdm
import time
import cv2
import os

數(shù)據(jù)集制作

人工智能就是有多少人工產(chǎn)生多少智能,在計算機(jī)視覺項目中,數(shù)據(jù)集至關(guān)重要,下面是如何使用視頻抽幀技術(shù)實現(xiàn)數(shù)據(jù)集的制作。以下代碼中_videoPlay函數(shù)是實時顯示導(dǎo)入的視頻,CutVideo函數(shù)實現(xiàn)手動抽幀,在顯示時按c鍵則抽取當(dāng)前幀,按Esc鍵關(guān)閉視頻。ExtractAll函數(shù)是自動抽幀功能,frameGap參數(shù)是隔多少幀進(jìn)行自動抽取。

class ExtractImg(object):
    def __init__(self, videopath: Path, savepath: Path, delay: int = 1) -> None:
        self.spath = savepath
        self.vpath = videopath
        self.delay = delay
        cv2.namedWindow("cv", cv2.WINDOW_NORMAL)
        cv2.resizeWindow("cv", 640, 480)
        self.cap = cv2.VideoCapture(str(self.vpath))
        self._timeflag = 0
        if not savepath.exists():
            os.mkdir(Path(savepath))

    def _videoPlay(self, size: list) -> None:
        self.cap.set(3, size[0])
        self.cap.set(4, size[1])
        while self.cap.isOpened():
            ret, frame = self.cap.read()
            # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            cv2.imshow("cv", frame)
            if cv2.waitKey(self.delay) & 0xFF == ord('c'):
                cv2.imwrite(str(PurePath.joinpath(self.spath,
                                                  "{}.jpg".format(str(time.time())))), frame)
                print("保存成功")
                time.sleep(1)
            elif cv2.waitKey(self.delay) & 0xFF == 27:
                break

    def ExtractAll(self, frameGap: int = 3) -> None:
        """
        這是將視頻流中的幀全部抽出
        :frame: 跳幀
        :return:
        """
        while self.cap.isOpened():
            self._timeflag += 1

            ret, frame = self.cap.read()
            if ret:
                cv2.imshow("cv", frame)
                if self._timeflag % frameGap == 0:
                    cv2.imwrite(str(PurePath.joinpath(self.spath,
                                                      "{}.jpg".format(str(time.time())))), frame)
                    print("保存成功")
            if (cv2.waitKey(self.delay) & 0xFF == 27) or not ret:
                break
        cv2.destroyAllWindows()
        self.cap.release()
        self._timeflag = 0

    def CutVideo(self) -> None:
        """
        這是手動抽幀
        :return:
        """
        ifm = input("文件中已經(jīng)存在{}張圖片,是否有繼續(xù)添加"
                    "(Y or N):".format(len(os.listdir(self.spath))))
        if self.spath.exists() and ifm == 'Y':
            self._videoPlay(size=[640, 480])
        elif self.spath.exists() and ifm == 'N':
            return None
        else:
            print("\n請輸入Y(yes)或者N(no)")
        cv2.destroyAllWindows()
        self.cap.release()

文件批量重命名

將文件夾下的圖片進(jìn)行升序的重命名。

  def statistics(path: Union[str, Path], dstpath: Union[Path, str], count: int = 0, random: bool = False) -> None:
        """
        這是存放圖片的文件夾安升序重命名
        :param path:需要重命名的文件文件
        :param count:觀察圖片總數(shù)添加使用
        """
        assert isinstance(path, (Path, str)), print("請輸入的路徑")
        l = os.listdir(str(path))
        if not Path.exists(dstpath):
            Path.mkdir(dstpath)
        # l = sorted(l)
        print(l)
        # print(l)
        print("存在文件{}張!".format(len(l)))
        if random:
            np.random.shuffle(l)
        # print(l)
        # 將保存圖片文件中的圖片按照升序的方法重命名

        suffix = Path(l[0]).suffix
        for file in tqdm(l):
            src = PurePath.joinpath(path, file)
            dst = PurePath.joinpath(dstpath, Path(str(count + int(Path(file).stem))).with_suffix(suffix))
            os.rename(src, dst)

文件批量移動

下面的是將文件批量按照一定規(guī)則挑選出來放到目標(biāo)文件夾下。

    def choosen(src: Union[str, Path] , folder: Union[Path,str] ,dst: Union[str, Path] , suffix: str) -> None:
        """
        1.將xml/jpg文件夾中的文件名字拿出來并且在jpg/xml對應(yīng)的文件夾中將名稱相同的文件挑出來
        2.將文件夾中的文件隨取出
        :param xmlsrc:目標(biāo)xml文件
        :param imgsrc:frameImg文件
        :param dst:根據(jù)xml挑選出的img文件
        :return: None
        """
        # l = os.listdir(str(xmlsrc))
        if not isinstance(folder,Path):
            pa = Path(folder)
        if not isinstance(src,Path):
            l = Path(src)

        # parent = src.parent
        for i in l.iterdir():
            file = Path(i.name).with_suffix(suffix)
            (pa / file).rename(Path(dst) / file)

將文件批量按照一定格式進(jìn)行重命名

下面將文件按照5位數(shù)字的格式進(jìn)行重命名 1.jpg->00001.jpg

    def batchrenames(src: Union[str, Path], dst: Union[str, Path], sorted: bool = False) -> None:
        """
        進(jìn)行特定格式的重命名
        :param src:原文件
        :param dst: 存儲文件
        :param sorted: 是否已經(jīng)有順序,若有學(xué)按照1.jpg ->00001.jpg
        :return: None
        """

        d = {1: "0000",  # 這是命名格式的字典
             2: "000",
             3: "00",
             4: "0",
             5: ""}
        l = os.listdir(src)
        suffix = Path(l[0]).suffix
        l.sort(key=lambda x: int(x.split('.')[0]))
        if sorted:
            for obj in tqdm(l):
                old = PurePath.joinpath(src, obj)
                new = PurePath.joinpath(dst, d[len(obj.split('.')[0])] + obj.split('.')[0] + suffix)
                os.rename(old, new)
        else:
            # for c, i in tqdm(enumerate(l)):
            pass

修改xml文件內(nèi)容的方法

這是修改xml文件內(nèi)容的代碼。

    def revampXml(xml_path: Union[Path, str], update_content: str) -> None:
        """
        這是一個修改xml文件內(nèi)容的方法,將xml文件愛中的類別改稱另一個類別
        :param xml_path: 存放xml文件的路徑
        :param xml_dw: xpath關(guān)鍵字
        :param update_content: 更新的內(nèi)容
        :return:None
        """
        # 打開xml文檔
        if not isinstance(xml_path, Path):
            xml_path = Path(xml_path)
        for i in tqdm(xml_path.iterdir()):
            xmlfile = xml_path / f"{i}"
            doc = ET.parse(xmlfile)
            root = doc.getroot()
            # 查找修改路勁
            for obj in root.iter("object"):
                sub1 = obj.find("name")
                if sub1.text == "motorboat":
                    # 修改標(biāo)簽內(nèi)容
                    sub1.text = update_content
                    # 保存修改
                    doc.write(xmlfile)

Pathlib庫以及os庫的常用文件操作API

pathlib是 標(biāo)準(zhǔn)庫之一,用于操作文件系統(tǒng)路徑。該庫可以方便地進(jìn)行路徑的拼接、文件/目錄的創(chuàng)建、復(fù)制/移動、刪除等操作。

功能描述 pathlib操作 os及os.path操作
獲得絕對路徑 Path.resolve() os.path.abspath()
修改文件權(quán)限和時間戳 Path.chmod() os.chmod()
創(chuàng)建目錄 Path.mkdir() os.mkdir()
文件或文件夾重命名,如果路徑不同,會移動并重新命名 Path.rename() os.rename()
文件或文件夾重命名,如果路徑不同,會移動并重新命名,如果存在,則破壞現(xiàn)有目標(biāo) Path.replace() os.replace()
刪除目錄 Path.rmdir() os.rmdir()
刪除一個文件 Path.unlink() os.remove()
刪除一個文件 Path.unlink() os.unlink()
獲得當(dāng)前工作目錄 Path.cwd() os.getcwd()
判斷是否存在文件或目錄name Path.exists() os.path.exists()
返回電腦的用戶目錄 Path.home() os.path.expanduser()
檢驗給出的路徑是一個文件 Path.is_dir() os.path.isdir()
檢驗給出的路徑是一個目錄 Path.is_file() os.path.isfile()
檢驗給出的路徑是一個符號鏈接 Path.is_symlink() os.path.islink()
獲得文件屬性 Path.stat() os.stat()
判斷是否為絕對路徑 PurePath.is_absolute() os.path.isabs()
連接目錄與文件名或目錄 PurePath.joinpath() os.path.join()
返回文件名 PurePath.name os.path.basename()
返回文件路徑 PurePath.parent os.path.dirname()
判斷兩個路徑是否相同 Path.samefile() os.path.samefile()
分離文件名和擴(kuò)展名 PurePath.suffix os.path.splitext()

總結(jié)

本文介紹了計算機(jī)視覺項目中的文件批量操作與文件批量預(yù)處理技術(shù)。 掌握這些技術(shù)將使您能夠高效地處理大規(guī)模的圖像數(shù)據(jù),并為計算機(jī)視覺項目的成功實施提供強(qiáng)大的支持。

希望本文對您在計算機(jī)視覺項目中的文件批量操作與文件批量預(yù)處理有所啟發(fā)!

以下是完整代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-697055.html

# -*- coding: utf-8 -*-
# @Author  : cvYouTian
# @Software: PyCharm

from pathlib import Path, PurePath
import xml.etree.ElementTree as ET
from typing import Union
import numpy as np
# import torch
from tqdm import tqdm
import time
import cv2
import os


class ExtractImg(object):
    def __init__(self, videopath: Path, savepath: Path, delay: int = 1) -> None:
        self.spath = savepath
        self.vpath = videopath
        self.delay = delay
        cv2.namedWindow("cv", cv2.WINDOW_NORMAL)
        cv2.resizeWindow("cv", 640, 480)
        self.cap = cv2.VideoCapture(str(self.vpath))
        self._timeflag = 0
        if not savepath.exists():
            os.mkdir(Path(savepath))

    def _videoPlay(self, size: list) -> None:
        self.cap.set(3, size[0])
        self.cap.set(4, size[1])
        while self.cap.isOpened():
            ret, frame = self.cap.read()
            # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            cv2.imshow("cv", frame)
            if cv2.waitKey(self.delay) & 0xFF == ord('c'):
                cv2.imwrite(str(PurePath.joinpath(self.spath,
                                                  "{}.jpg".format(str(time.time())))), frame)
                print("保存成功")
                time.sleep(1)
            elif cv2.waitKey(self.delay) & 0xFF == 27:
                break

    def ExtractAll(self, frameGap: int = 3) -> None:
        """
        這是將視頻流中的幀全部抽出
        :frame: 跳幀
        :return:
        """
        while self.cap.isOpened():
            self._timeflag += 1

            ret, frame = self.cap.read()
            if ret:
                cv2.imshow("cv", frame)
                if self._timeflag % frameGap == 0:
                    cv2.imwrite(str(PurePath.joinpath(self.spath,
                                                      "{}.jpg".format(str(time.time())))), frame)
                    print("保存成功")
            if (cv2.waitKey(self.delay) & 0xFF == 27) or not ret:
                break
        cv2.destroyAllWindows()
        self.cap.release()
        self._timeflag = 0

    def CutVideo(self) -> None:
        """
        這是手動抽幀
        :return:
        """
        ifm = input("文件中已經(jīng)存在{}張圖片,是否有繼續(xù)添加"
                    "(Y or N):".format(len(os.listdir(self.spath))))
        if self.spath.exists() and ifm == 'Y':
            self._videoPlay(size=[640, 480])
        elif self.spath.exists() and ifm == 'N':
            return None
        else:
            print("\n請輸入Y(yes)或者N(no)")
        cv2.destroyAllWindows()
        self.cap.release()

    @staticmethod
    def statistics(path: Union[str, Path], dstpath: Union[Path, str], count: int = 5305, random: bool = False) -> None:
        """
        這是存放圖片的文件夾安升序重命名
        :param path:需要重命名的文件文件
        :param count:觀察圖片總數(shù)添加使用
        """
        assert isinstance(path, (Path, str)), print("請輸入的路徑")
        l = os.listdir(str(path))
        if not Path.exists(dstpath):
            Path.mkdir(dstpath)
        # l = sorted(l)
        print(l)
        # print(l)
        print("存在文件{}張!".format(len(l)))
        if random:
            np.random.shuffle(l)
        # print(l)
        # 將保存圖片文件中的圖片按照升序的方法重命名

        suffix = Path(l[0]).suffix
        for file in tqdm(l):
            src = PurePath.joinpath(path, file)
            dst = PurePath.joinpath(dstpath, Path(str(count + int(Path(file).stem))).with_suffix(suffix))
            os.rename(src, dst)

    @staticmethod
    def choosen(src: Union[str, Path]="/home/you/Desktop/2023海上高速目標(biāo)檢測/val", folder: Union[Path,str]="/home/you/Desktop/2023海上高速目標(biāo)檢測/annotations",dst: Union[str, Path]="/home/you/Desktop/2023海上高速目標(biāo)檢測/train", suffix: str=".xml") -> None:
        """
        1.將xml/jpg文件夾中的文件名字拿出來并且在jpg/xml對應(yīng)的文件夾中將名稱相同的文件挑出來
        2.將文件夾中的文件隨取出
        :param xmlsrc:目標(biāo)xml文件
        :param imgsrc:frameImg文件
        :param dst:根據(jù)xml挑選出的img文件
        :return: None
        """
        # l = os.listdir(str(xmlsrc))
        if not isinstance(folder,Path):
            pa = Path(folder)
        if not isinstance(src,Path):
            l = Path(src)

        # parent = src.parent
        for i in l.iterdir():
            file = Path(i.name).with_suffix(suffix)
            (pa / file).rename(Path(dst) / file)

    @staticmethod
    def batchrenames(src: Union[str, Path], dst: Union[str, Path], sorted: bool = False) -> None:
        """
        進(jìn)行特定格式的重命名
        :param src:原文件
        :param dst: 存儲文件
        :param sorted: 是否已經(jīng)有順序,若有學(xué)按照1.jpg ->00001.jpg
        :return: None
        """

        d = {1: "0000",  # 這是命名格式的字典
             2: "000",
             3: "00",
             4: "0",
             5: ""}
        l = os.listdir(src)
        suffix = Path(l[0]).suffix
        l.sort(key=lambda x: int(x.split('.')[0]))
        if sorted:
            for obj in tqdm(l):
                old = PurePath.joinpath(src, obj)
                new = PurePath.joinpath(dst, d[len(obj.split('.')[0])] + obj.split('.')[0] + suffix)
                os.rename(old, new)
        else:
            # for c, i in tqdm(enumerate(l)):
            pass

    @staticmethod
    def text(file: Union[Path, str]):
        l = []
        f = open(file)
        for i in f.readlines():
            i = i.strip()
            stem = Path(i).stem
            suffix = Path(i).suffix
            n1, n2 = int(stem) - 1, int(stem) + 1
            l.append(str(n1) + ".xml")
            l.append(str(n2) + ".xml")
        print(l)

    @staticmethod
    def revampXml(xml_path: Union[Path, str], update_content: str) -> None:
        """
        這是一個修改xml文件內(nèi)容的方法,將xml文件愛中的類別改稱另一個類別
        :param xml_path: 存放xml文件的路徑
        :param xml_dw: xpath關(guān)鍵字
        :param update_content: 更新的內(nèi)容
        :return:None
        """
        # 打開xml文檔
        if not isinstance(xml_path, Path):
            xml_path = Path(xml_path)
        for i in tqdm(xml_path.iterdir()):
            xmlfile = xml_path / f"{i}"
            doc = ET.parse(xmlfile)
            root = doc.getroot()
            # 查找修改路勁
            for obj in root.iter("object"):
                sub1 = obj.find("name")
                if sub1.text == "motorboat":
                    # 修改標(biāo)簽內(nèi)容
                    sub1.text = update_content
                    # 保存修改
                    doc.write(xmlfile)

    @staticmethod
    def movefile(folder_path: Union[Path, str], dst: Union[Path, str], suffix: str) -> None:
        """
        批量移動剪切文件
        :param folder_path: 原文件夾路徑
        :param dst: 目標(biāo)文件夾路徑
        :param suffix: 移動的文件格式/后綴
        :return:
        """
        if not isinstance(folder_path, Path):
            folder_path = Path(folder_path)
        # for i in folder_path.iterdir():
        #     if i.is_dir():
        #         ExtractImg.movefile(folder_path / i, suffix, res)
        #     else:
        #         if i.suffix == suffix:
        #             res.append(str(i))
        # # return res if suffix is None or suffix == "" else list(filter(lambda x: str(x).endswith(suffix),res))
        # return res
        for i in tqdm(folder_path.rglob(f"*{suffix}")):
            i.rename(dst / i.name)
    @staticmethod
    def convert_box(size, box):
            dw, dh = 1. / size[0], 1. / size[1]
            x, y, w, h = (box[0] + box[1]) / 2.0 - 1, (box[2] + box[3]) / 2.0 - 1, box[1] - box[0], box[3] - box[2]
            return x * dw, y * dh, w * dw, h * dh

  

if __name__ == "__main__":
    # 目標(biāo)視頻文件
    videopath = Path("videoSet/seabird6.mp4")
    # 圖片保存文件
    savepath = Path("./dataset/imgs")
    # xin = Path("./VOC6detect/imgss")
    # savepath = Path("frameSave")
    # 目標(biāo)xml文件
    # xmlpath = Path("./VOC6detect/annotations")
    # old = Path("/home/you/Desktop/dateset/20(pass)/seabird5")
    # new = Path("/home/you/Desktop/dateset/11(pass)/temp")
    # pa = Path("./labels/")
    # xin = Path()
    # renamepath = Path("/home/you/Desktop/dateset/4(pass)/a-1")
    # 實例化
    a = ExtractImg(videopath=videopath, savepath=savepath)
    a.choosen()
    # VOC2YOLO
    # a.convert_label()


    # 將幀全部抽出
    # a.ExtractAll(frameGap=8)

    # 手動抽幀
    # a.CutVideo()

    # 根據(jù)xml文選出對應(yīng)的文件
    # a.choosen(xmlsrc=xmlpath, imgsrc=savepath, dst=xin)

    # 將數(shù)字命名的圖片按照加上一個數(shù)字的方式命名
    # a.statistics(path=Path("./DATA/xml"), dstpath=Path("./DATA/t"), count=5305)

    # 對已經(jīng)有順序或者沒順序的文件進(jìn)行特定格式的重命名78.jpg -> 00078.jpg
    # a.batchrenames(src=new, dst=old, sorted=True)
    # a.text("./data1.txt")
    # 對xml文件進(jìn)行修改
    # a.revampXml(xml_path= "/home/you/Desktop/tools/dataset/annotations", update_content="speedboat")

    # 批量拿到文件夾中的某格式的文件
    # a.movefile(folder_path="/home/you/Desktop/網(wǎng)上快艇", dst=pa, suffix=".jpg")

到了這里,關(guān)于python實現(xiàn)視頻抽幀,文件批量操作,文件批量處理(數(shù)據(jù)集制作的工具箱)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Python地理數(shù)據(jù)處理 二十一:基于arcpy批量操作(三)

    實現(xiàn)將給定的 .shp 文件中的所有省份作為裁剪范圍,對給定的 .tif 文件進(jìn)行裁剪,輸出所有省份的單獨 .tif 文件: 實現(xiàn)對文件名前14個字符一樣的tif圖像進(jìn)行柵格運算求和: 如:XXXX_XXX_2003.M01_Mean、XXXX_XXX_2003.M02_Mean、XXXX_XXX_2003.M03_Mean;XXXX_XXX_2004.M01_Mean、XXXX_XXX_2004.M02_Mean、

    2024年02月01日
    瀏覽(22)
  • java如何做視頻抽幀,視頻轉(zhuǎn)圖片操作Demo

    java如何做視頻抽幀,視頻轉(zhuǎn)圖片操作Demo

    java如何做視頻抽幀,視頻轉(zhuǎn)圖片操作Demo!現(xiàn)在市面上很多客戶提成需求,希望可以把本地的視頻,抽幀(一個一個靜態(tài)的圖片)。至于為什么要抽幀,大家自己去百度查詢。我們本次僅僅討論如何使用java技術(shù),實現(xiàn)視頻的抽幀操作。 1:我們需要用到市面上一個的maven插件包。名

    2024年04月09日
    瀏覽(17)
  • javacv處理rtsp流,抽幀,轉(zhuǎn)hls流,播放視頻

    javacv處理rtsp流,抽幀,轉(zhuǎn)hls流,播放視頻

    整體項目結(jié)構(gòu): pom文件引入依賴: 1.播放視頻 video類: 效果展示: ? 2.轉(zhuǎn)換hls流 效果展示 ? 3.抽幀 效果: 工具類代碼: ?

    2024年02月13日
    瀏覽(19)
  • 使用ffmpeg從視頻文件中提取音頻文件、視頻抽幀和切割視頻

    使用ffmpeg從視頻文件中提取音頻文件、視頻抽幀和切割視頻

    目錄 ffmpeg下載 使用ffmpeg從視頻文件中提取音頻文件 批量提取文件夾下多個視頻文件的音頻 使用ffmpeg從視頻文件中提取視頻幀 使用ffmpeg將按固定時長將視頻切割成多個小片段 將分割得到的視頻存放在新建文件夾下(這個我運行的時候好像有點問題,音頻文件沒有存放在新建

    2023年04月08日
    瀏覽(25)
  • 視頻抽幀實現(xiàn)

    一、基本概念理解 一個視頻由視頻幀構(gòu)成,每一幀在肉眼可見是一張圖片成像 1、視頻幀 幀的類型: 幀的類型主要參考 視頻抽幀處理 I幀,Intra Picture,內(nèi)編碼幀,也就是關(guān)鍵幀。擁有完整的圖像信息。I幀不需要依賴前后幀信息,可獨立進(jìn)行解碼。 P幀,predictive-frame,前向預(yù)

    2024年02月16日
    瀏覽(21)
  • PyQt實現(xiàn)視頻抽幀顯示

    PyQt實現(xiàn)視頻抽幀顯示 導(dǎo)入必要的庫。 創(chuàng)建一個QTimer對象,用于循環(huán)讀取視頻幀并進(jìn)行抽幀。 定義show_frame函數(shù),該函數(shù)將讀取視頻幀并將其顯示在PyQt窗口中。

    2024年02月07日
    瀏覽(34)
  • java實現(xiàn)視頻抽幀以及獲取其他視頻信息

    1.在pom.xml文件中導(dǎo)入jar包 2.創(chuàng)建工具類FetchVideoFrameUtil,復(fù)制以下代碼 文章引用出處:https://cloud.tencent.com/developer/article/1655887,并在原有基礎(chǔ)上做了優(yōu)化

    2024年02月12日
    瀏覽(16)
  • Python文件操作和異常處理:高效處理數(shù)據(jù)的利器

    Python文件操作和異常處理:高效處理數(shù)據(jù)的利器

    重溫Python,適合新手搭建知識體系,也適合大佬的溫故知新~ 1.1 文件操作和異常處理對于編程的重要性 文件操作和異常處理對于編程非常重要。它們使得我們能夠處理文件數(shù)據(jù)、持久化數(shù)據(jù)、導(dǎo)入和導(dǎo)出數(shù)據(jù),并且能夠優(yōu)雅地處理和解決錯誤,提高程序的可靠性和穩(wěn)定性。

    2024年01月23日
    瀏覽(29)
  • 【Python入門教程】基于OpenCV視頻分解成圖片+圖片組合成視頻(視頻抽幀組幀)

    ? ? ? ? 在人工智能爆火的今天,深度學(xué)習(xí)被廣泛應(yīng)用于各個領(lǐng)域。深度學(xué)習(xí)的模型訓(xùn)練離不開大量的樣本庫。我之前分享過【Python爬蟲】批量爬取網(wǎng)頁的圖片制作數(shù)據(jù)集,今天跟大家分享一下如何使用OpenCV庫對視頻進(jìn)行抽幀,從而增加樣本圖片的數(shù)量。正好也順便分享一下

    2024年02月04日
    瀏覽(29)
  • Vue 3 + ffmpeg + wasm 實現(xiàn)前端視頻剪輯、音頻剪輯、音波展示、視頻抽幀、gif抽幀、幀播放器、字幕、貼圖、時間軸、素材軌道

    預(yù)覽 www.bilibili.com/video/BV1YT411Y7YJ 技術(shù)棧: ?? Vue 3、Vue-Router 4、Vite、pnpm、esbuild、TypeScript ?? Pinia 狀態(tài)管理 ?? Tailwind 原子css集成 ?? ffmpeg、wasm 底層音視頻處理集成 功能 多軌道時間軸,支持幀縮放,時間縮放 支持多種類型軌道的添加刪除 多功能軌道調(diào)節(jié),支持音視頻軌

    2024年02月11日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包