我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于Python如何实现视频去重小工具

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于Python如何实现视频去重小工具

这篇文章主要介绍“基于Python如何实现视频去重小工具”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python如何实现视频去重小工具”文章能帮助大家解决问题。

同级目录下新建dup_video

import jsonimport osimport shutilimport cv2import imagehashfrom PIL import Imagefrom loguru import loggerfrom PySimpleGUI import popup_get_folderclass VideoDuplicate(object):    '''    返回整个视频的图片指纹列表    从1秒开始,每3秒抽帧,计算一张图像指纹    '''    def __init__(self):        self._over_length_video: list = []        self._no_video: list = []    def _video_hash(self, video_path) -> list:        '''        @param video_path -> 视频绝对路径;        '''        hash_arr = []        cap = cv2.VideoCapture(video_path)  ##打开视频文件        logger.info(f'开始抽帧【{video_path}】')        n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 视频的帧数        logger.warning(f'视频帧数:{n_frames}')        fps = cap.get(cv2.CAP_PROP_FPS)  # 视频的帧率        logger.warning(f'视频帧率:{fps}')        dur = n_frames / fps * 1000  # 视频大致总长度        cap_set = 1000        logger.warning(f'视频大约总长:{dur / 1000}')        if dur // 1000 > 11:            logger.error(f'视频时长超出规定范围【6~10】;当前时长:【{dur // 1000}】;跳过该视频;')            self._over_length_video.append(video_path)            return []        while cap_set < dur:  # 从3秒开始,每60秒抽帧,计算图像指纹。总长度-3s,是因为有的时候计算出来的长度不准。            cap.set(cv2.CAP_PROP_POS_MSEC, cap_set)            logger.debug(f'开始提取:【{cap_set // 1000}】/s的图片;')            # 返回该时间点的,图像(numpy数组),及读取是否成功            success, image_np = cap.read()            if success:                img = Image.fromarray(cv2.cvtColor(image_np, cv2.COLOR_BGR2RGB))  # 转成cv图像格式                h = str(imagehash.dhash(img))                logger.success(f'【{cap_set}/s图像指纹:【{h}】')                hash_arr.append(h)  # 图像指纹            else:                logger.error(str(cap_set / 1000))            cap_set += 1000 * 2        cap.release()  # 释放视频        return hash_arr    def start(self, base_dir):        '''        @param base_dir -> 主文件路径;        '''        data: list = []        for video in os.listdir(base_dir):            logger.debug(f'-' * 80)            name, ext = os.path.splitext(video)            if ext not in ('.mp4', '.MP4'):                logger.error(f'视频文件格式不符;【{video}】;执行跳过;')                continue            abs_video_path = os.path.join(base_dir, video)            video_hash_list = self._video_hash(abs_video_path)            if video_hash_list:                data.append({'video_abs_path': abs_video_path, 'hash': video_hash_list})        self._write_log(data)        return data    @staticmethod    def _write_log(data: list) -> None:        '''视频哈希后的值写入日志文件'''        with open(f'log.txt', 'w+', encoding='utf-8') as f:            f.write(json.dumps(data))    def __call__(self, base_dir, *args, **kwargs):        self.start(base_dir)        logger.debug(f'-----------------------------------开始比对关键帧差值感知余弦算法-----------------------------')        with open('log.txt') as f:            data = json.loads(f.read())            for i in range(0, len(data) - 1):                for j in range(i + 1, len(data)):                    if data[i]['hash'] == data[j]['hash']:                        _, filename = os.path.split(data[i]['video_abs_path'])                        logger.error(f'移动文件:【{filename}】')                        shutil.move(                            os.path.join(base_dir, filename),                            os.path.join(os.path.join(os.getcwd(), 'dup_video'), filename)                        )        logger.warning('---------------------超长视频----------------------')        for i in self._over_length_video:            _, name = os.path.split(i)            logger.error(name)def main():    path = popup_get_folder('请选择[视频去重]文件夹')    v = VideoDuplicate()    v(path)if __name__ == '__main__':    main()

方法补充

python+opencv抽取视频帧并去重

import os import sysimport cv2import globimport jsonimport numpy as npimport skimagefrom skimage import metricsimport hashlibprint(skimage.__version__)def load_json(json_file):    with open(json_file) as fp:        data = json.load(fp)    return data['outputs']def ssim_dis(im1, im2):    ssim = metrics.structural_similarity(im1, im2, data_range=255, multichannel=True)    return ssim# cv2def isdarkOrBright(grayImg, thre_dark=10, thre_bright=230):    mean = np.mean(grayImg)    if mean < thre_dark or mean > thre_bright:        return True     else:        return Falsedef get_file_md5(file_name):    """    caculate md5    : param file_name    : return md5    """    m = hashlib.md5()    with open(file_name, 'rb') as fobj:        while True:            data = fobj.read(4096)            if not data:                break            m.update(data)    return m.hexdigest()def extract_frame(video_path, save_dir, prefix, ssim_thre=0.90):    count = 0    md5set = {}    last_frame = None    cap = cv2.VideoCapture(video_path)    fps = cap.get(cv2.CAP_PROP_FPS)    index = 0    tmp_frames = []    while cap.isOpened():        frameState, frame = cap.read()        if not frameState or frame is None:            break        grayImg = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)        # if isdarkOrBright(grayImg):        #     index += 1        #     continue        assert cv2.imwrite('tmp.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 100])        md5 = get_file_md5('tmp.jpg')        if md5 in md5set:            md5set[md5] += 1            index += 1            continue        md5set[md5] = 1                save_path = os.path.join(save_dir, prefix+'_'+str(index).rjust(4, '0')+'.jpg')        if last_frame is None:            if cv2.imwrite(save_path, frame, [cv2.IMWRITE_JPEG_QUALITY, 100]):                count += 1                last_frame = frame                tmp_frames.append(frame)        else:            dis = ssim_dis(last_frame, frame)            if dis <= ssim_thre:                save_frame = tmp_frames[len(tmp_frames)//2]                if cv2.imwrite(save_path, save_frame, [cv2.IMWRITE_JPEG_QUALITY, 100]):                    count += 1                    last_frame = frame                    tmp_frames = [frame]            else:                tmp_frames.append(frame)        index += 1    cap.release()    return count                if __name__ == '__main__':    import sys    video_path = "videos/***.mp4"    video_name = video_path.split("/")[-1]    prefix = video_name[:-4]    save_imgs_dir = prefix    if not os.path.exists(save_imgs_dir):        os.mkdir(save_imgs_dir)    N = extract_frame(video_path, save_imgs_dir, prefix)    print(video_name, N)

对图片,视频,文件进行去重

import osfrom tkinter import *from tkinter import messageboximport tkinter.filedialogroot=Tk()root.title("筛选重复的视频和照片")root.geometry("500x500+500+200")def wbb():      a=[]      c={}      filename=tkinter.filedialog.askopenfilenames()                  for i in filename:            with open(i,'rb') as f:                  a.append(f.read())      for j in range(len(a)):            c[a[j]]=filename[j]      filename1=tkinter.filedialog.askdirectory()           if filename1!="":            p=1            lb1.config(text=filename1+"下的文件为:")            for h in c:                k=c[h].split(".")[-1]                with open(filename1+"/"+str(p)+"."+k,'wb') as f:                      f.write(h)                p=p+1                  for g in os.listdir(filename1):                  txt.insert(END,g+'\n')                        else:            messagebox.showinfo("提示",message ='请选择路径')frame1=Frame(root,relief=RAISED)frame1.place(relx=0.0)frame2=Frame(root,relief=GROOVE)frame2.place(relx=0.5)lb1=Label(frame1,text="等等下面会有变化?",font=('华文新魏',13))lb1.pack(fill=X)    txt=Text(frame1,width=30,height=50,font=('华文新魏',10))txt.pack(fill=X)        lb=Label(frame2,text="点我选择要进行筛选的文件:",font=('华文新魏',10))lb.pack(fill=X)                                          btn=Button(frame2,text="请选择要进行筛选的文件",fg='black',relief="raised",bd="9",command=wbb)btn.pack(fill=X)root.mainloop()

效果图

基于Python如何实现视频去重小工具

关于“基于Python如何实现视频去重小工具”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于Python如何实现视频去重小工具

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于Python如何实现视频去重小工具

这篇文章主要介绍“基于Python如何实现视频去重小工具”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python如何实现视频去重小工具”文章能帮助大家解决问题。同级目录下新建dup_video
2023-07-05

基于Python实现视频去重小工具

这篇文章主要为大家详细介绍了如何通过Python语言编写简单的视频去重小工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起尝试一下
2023-03-24

基于Python如何实现视频转字符画动漫小工具

本篇文章给大家分享的是有关基于Python如何实现视频转字符画动漫小工具,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。导语今天带大家来点儿好玩儿的东西,我想你们肯定是喜欢的!上
2023-06-22

Python如何实现视频中添加音频工具

这篇文章主要介绍Python如何实现视频中添加音频工具,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!环境依赖ffmpeg环境安装,可以参考:windows ffmpeg安装部署ffmpy安装:pip install
2023-06-21

基于Python如何实现视频分辨率转换

这篇文章主要为大家展示了“基于Python如何实现视频分辨率转换”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“基于Python如何实现视频分辨率转换”这篇文章吧。环境依赖ffmpeg环境安装,可
2023-06-22

基于Python实现文章信息统计的小工具

及时的统计可以更好的去分析读者对于内容的需求,了解文章内容的价值,以及从侧面认识自己在知识创作方面的能力。本文就来用Python制作一个文章信息统计的小工具 ,希望对大家有所帮助
2023-02-14

基于Python如何实现合并多张图片转成mp4视频

这篇文章主要介绍“基于Python如何实现合并多张图片转成mp4视频”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python如何实现合并多张图片转成mp4视频”文章能帮助大家解决问题。一、需要
2023-07-06

OpenCV基于稠密光流如何实现视频跟踪

这篇“OpenCV基于稠密光流如何实现视频跟踪”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“OpenCV基于稠密光流如何实现
2023-07-05

基于Python如何实现抢注大词的提词工具

本篇内容主要讲解“基于Python如何实现抢注大词的提词工具”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python如何实现抢注大词的提词工具”吧!假设通过爬虫获得了一个自媒体.txt想要
2023-07-05

基于Java如何实现进制转换工具类

这篇文章主要介绍了基于Java如何实现进制转换工具类的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Java如何实现进制转换工具类文章都会有所收获,下面我们一起来看看吧。背景最近有个发送短信的功能,需要在短信
2023-07-05

Python如何实现语音合成小工具

这篇文章主要讲解了“Python如何实现语音合成小工具”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python如何实现语音合成小工具”吧!TTS简介TTS(Text To Speech)是
2023-07-04

基于Python如何实现彩票小游戏

本篇内容主要讲解“基于Python如何实现彩票小游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python如何实现彩票小游戏”吧!一、游戏规则游戏里面有提前设置好的奖项,分为三个,一等奖
2023-07-05

基于Python如何实现骰子小游戏

这篇文章主要讲解了“基于Python如何实现骰子小游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于Python如何实现骰子小游戏”吧!一、环境准备 1)运行环境 开发环境:Pytho
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录