首页 > 其他分享 >一些CV的小工具代码

一些CV的小工具代码

时间:2023-04-13 21:44:31浏览次数:25  
标签:self CV start video image path 工具 代码 size

一些CV的小工具代码

切Video为images

"""
Convert each frame in a anime video to 256 x 256 images
"""
import cv2
import os
import numpy as np
import argparse
from moviepy.video.io.VideoFileClip import VideoFileClip
from tqdm import tqdm

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('--video-path', type=str, default='/home/ubuntu/Downloads/kimetsu_yaiba.mp4')
    parser.add_argument('--save-path', type=str, default='./script/test_crop')
    parser.add_argument('--max-image', type=int, default=1800)
    parser.add_argument('--start', type=int, default=0)
    parser.add_argument('--end', type=int, default=0)
    parser.add_argument('--image-size', type=int, default=256)

    return parser.parse_args()


class VideoConverter:
    def __init__(self, video_path, save_dir, max_image=1600, start=0, end=0, image_size=256):
        os.makedirs(save_dir, exist_ok=True)

        assert os.path.isfile(video_path), f'{video_path} must be a video file'

        self.save_dir = save_dir
        self.video_path = video_path
        self.max_image = max_image
        self.start = start
        self.end = end or None
        self.counter = 0
        self.image_size = image_size

    def crop_and_save(self, image):
        '''
        Crop a large image into smaller images of given size
        @Returns:
            - True if counter reach max_image
        '''

        height, width, _ = image.shape

        # Image can be divided into rows * cols sub-images
        rows = height // self.image_size
        cols = width // self.image_size

        for r in range(rows):
            for c in range(cols):
                start_x = r * self.image_size
                end_x = start_x + self.image_size
                start_y = c * self.image_size
                end_y = start_y + self.image_size
                # print(f'x: [{start_x}:{end_x}], y: [{start_y}:{end_y}]')
                sub_im = image[start_x: end_x, start_y: end_y, :]

                if np.std(sub_im) > 25.0:
                    save_path = os.path.join(self.save_dir, f'{self.counter}.jpg')
                    cv2.imwrite(save_path, sub_im)
                    self.counter += 1

                if self.counter == self.max_image:
                    return True

        return False

    def process(self):
        '''
        Process video
        '''
        video_clip = VideoFileClip(self.video_path)
        if self.start or self.end:
            video_clip = video_clip.subclip(self.start, self.end)

        video_clip = video_clip.set_fps(video_clip.fps // 10)

        total_frames = round(video_clip.fps * video_clip.duration)
        print(f'Processing video {self.video_path}, {total_frames} frames, size: {video_clip.size}')

        for frame in tqdm(video_clip.iter_frames()):
            # It's better if we resizing before crop to keep the image looks more 'scene'
            h, w, _ = frame.shape
            aspect_ratio = w / h
            ratio = h / (self.image_size * 2)
            w /= ratio
            h = w / aspect_ratio

            frame = cv2.resize(frame[...,::-1], (int(h) , int(w)))
            if self.crop_and_save(frame):
                break

        print(f'Saved {self.counter} images to {self.save_dir}')



if __name__ == '__main__':

    args = parse_args()
    converter = VideoConverter(
        args.video_path,
        args.save_path,
        max_image=args.max_image,
        start=args.start,
        end=args.end,
        image_size=args.image_size
        )

    converter.process()

标签:self,CV,start,video,image,path,工具,代码,size
From: https://www.cnblogs.com/lwp-nicol/p/17316537.html

相关文章

  • OpenCV图像模糊操作(11)
    模糊原理Smooth/Blur是图像处理中最简单和常用的操作之一使用操作的原因之一就是为了给图像预处理时候减低噪声图像噪声是指存在于图像数据中的不必要的或多余的干扰信息Smooth/Blur操作原理是数学的卷积运算,根据不同卷积运算公式,划分了多种图像滤波方式图像滤波:指的是在尽量保留......
  • apko不依赖dockerfile基于apk 包构建oci 镜像的工具
    可以方便的基于apk包进行oci镜像的构建以及发布包含的特性可重复执行同时确认二进制文件一致快速小sbom支持服务支持,基于s4安装可以通过goinstall以及docker模式运行goinstallchainguard.dev/apko@latest使用配置contents:......
  • 基于交替方向乘子法与纳什谈判的社区微网电能共享模型 代码主要做的是一个社区微网内
    基于交替方向乘子法与纳什谈判的社区微网电能共享模型主要内容:代码主要做的是一个社区微网内部产消者之间P2P电能交易与共享的问题。构建了基于合作博弈多产消者电能共享模型,在社区微网储能装置的约束下进行P2P电能交易,以社会福利最大化为目标函数,构建了P2P交易模型,并通过ADMM法......
  • 住宅空调负荷可调度潜力评估 代码主要做的是住宅空调负荷的可调度潜力评估
    住宅空调负荷可调度潜力评估摘要:代码主要做的是住宅空调负荷的可调度潜力评估,因为住宅空调负荷是一种具有一定灵活性和可控性的需求响应资源,本代码首先评估单一客户的空调可控潜力,进而发展为大规模地区的空调的需求响应潜力以及规模的评估。采用静态和动态模型参数估计的分段分......
  • Linux操作系统汇编语言基础知识(图文代码)
    1、什么是汇编语言,它在计算机语言中的地位?汇编语言是程序设计语言的基础语言,是唯一可以直接与计算机硬件打交道的语言2、汇编语言与源程序、汇编程序、汇编的关系?3、汇编语言的特点\1)汇编语言与机器指令一一对应,可充分理解计算机的操作过程汇编语言指令是机器指令的符号表......
  • 手工安装部署 openGauss3.0 一主一备(非 om 工具安装)
    手工安装部署openGauss3.0一主一备(非om工具安装)本文出处:https://www.modb.pro/db/425385一、操作系统配置(centos7.6)1.关闭防火墙systemctlstopfirewalldsystemctldisablefirewalld2.关闭selinux服务setenforce0vim/etc/selinux/configSELINUX=disabled3.关闭透明......
  • 区域综合能源系统规划模型 代码主要做的是考虑冷热电多能负荷的区域综合能源系统规划
    区域综合能源系统规划模型摘要:代码主要做的是考虑冷热电多能负荷的区域综合能源系统规划方法,基于能源集线器模型,建立了含冷热电三联供,燃气锅炉。集中式制冷站在内的区域综合能源模型,根据历史8天的多能负荷数据,以投资建设运营成本最低为目标函数,综合考虑多种约束条件,最终得出各设......
  • 盘点 8 款好用的 API 接口文档管理工具
    随着互联网的普及和发展,API 接口已经无处不在。它已经在Web应用程序、移动应用程序、云计算、物联网、人工智能等领域中得到广泛应用。例如,在金融行业中,API接口可以被用于构建支付服务、银行服务和证券交易服务等;在医疗行业中,API接口可以被用于构建病历管理系统、健康监测系统......
  • redis 工具类
    redis工具类/***Redis工具类*/@ComponentpublicclassRedisUtil{@ResourceprivateRedisTemplate<String,Object>redisTemplate;publicRedisUtil(RedisTemplate<String,Object>redisTemplate){this.redisTemplate=redisT......
  • Java | 一分钟掌握JDK命令行工具 | 2- 分类
     作者:Mars酱 声明:本文章由Mars酱编写,部分内容来源于网络,如有疑问请联系本人。 转载:欢迎转载,转载前先请联系我!JDK命令行工具分类命令行工具按照功能可以分为以下几个重要的大类:主要工具主要工具是用来完成主要工作的(废话),比如:编译、反编译、打包等等,以下是常见的:javac:您可以使用......