使用opencv把视频转图片以及图片模糊问题

代码如下:

# -*- coding: utf-8 -*-#
# Author:       weiz
# Date:         2019/11/26 10:22
# Name:         main
# Description:
import os
import cv2
import shutil


def video2images(video_p_n, img_p, dst_folder, index):
    video = cv2.VideoCapture()
    if not video.open(video_p_n):
        print("can not open the video")
        exit(1)
    count = 1
    while True:
        _, frame = video.read()
        if frame is None:
            break
        if count % dst_folder == 0:
            save_path = "{}_{:>05d}.png".format(dst_folder, index)
            save_path = img_p + '/' + save_path
            cv2.imwrite(save_path, frame, (cv2.IMWRITE_PNG_COMPRESSION, 0))
            index += 1
        count += 1
    video.release()
    # 打印出所提取帧的总数/以及原本视频总帧数
    print("Totally save {:d}/{:d} pics".format((index-1), count))



if __name__ == '__main__':
    videoPath = "./video"       # 视频存放的文件夹
    genImages = "./images"      # 最后图片保存的位置
    EXTRACT_FREQUENCY = 10      # 帧提取频率
    print("workSpace:{}".format(os.getcwd()))
    videoName = os.listdir(videoPath)
    if os.path.exists(genImages):
        shutil.rmtree(genImages)  # 删除原来的图片库,以防混乱
        print("Old images deleted!")
    os.mkdir(genImages)
    for name in videoName:
        imglib = genImages + '/' + name[:-4]
        os.mkdir(imglib)
        video_p_n = videoPath + '/' + name
        video2images(video_p_n, imglib, EXTRACT_FREQUENCY, 1)

源视频大小为:633.4MB

视频转不同格式图片的情况:

 

生成图片的格式 生成图片总大小 单幅图片大小 生成时设置的参数
jpg 551.1MB 286.9KB 95(jpg默认的参数)
png 1.8GB 913.7KB 3(png默认的参数)
png 11.2GB 6.2MB 0(png图片压缩率最小)
bmp 11.2GB 6.2MB

说明:

  1. 只要是jpg格式的图片就会压缩,在opencv中图片压缩后的质量参数为0到100,默认是95。
  2. png格式比jpg格式会好,属于高质量的图片保存格式。opencv中压缩等级从0到9,默认是3,压缩速度最快。
  3. bmp格式的图片是无损图片格式,但占用的磁盘内存会比较大。没有找到与bmp格式设置相关的说明及参数。
  4. 视频转成jpg格式的图片,图片的像素与源视频中的像素会有所不同。如果用视频和转成图片后分别用于训练、识别等任务,可能会造成不一样的结果。这点需要注意。
  5. 一般生成默认的png图片就够用,即:压缩等级为3。
  6. 生成图片总大小也与视频转图片时的提取率有关。上面的代码提取率是每10张提取一张。

opencv官网说明

 

# !/usr/bin/env Python3
# -*- coding: utf-8 -*-
# @Author      : weiz
# @FILE        : video2image.py
# @Time        : 2020/7/29 10:41
# @Description : 将视频分割为图片
import os
import cv2
import shutil

def checkFileExist(fileName, isCreate=None):
    """
    检测当前工作目录下fileName文件是否存在,并根据isCreate是否创建
    :param fileName:文件夹名字
    :param isCreate:是否创建
    :return:不存在返回false,存在或者创建返回true
    """
    if isCreate == True:
        isCreate = True
    else:
        isCreate = False
    if os.path.exists(fileName):
        return True
    else:
        if isCreate:
            os.mkdir(fileName)
            print("the path:{} is builded!".format(fileName))
            return True
        else:
            return False

def video2image():
    """
    视频分割为图片
    :return:
    """
    if not checkFileExist(videoPath):
        print("The {} is not exist!".format(videoPath))
        return

    if isClearImagePath:
        if checkFileExist(imagePath):
            shutil.rmtree(imagePath)        # 删除原来的图片库,以防混乱
            print("Old {} deleted!".format(imagePath))
        checkFileExist(imagePath, True)
    else:
        if not checkFileExist(imagePath, True):
            print("The {} is not exist!".format(imagePath))
            return

    videoNames = os.listdir(videoPath)
    for videoName in videoNames:
        name, suffix = videoName.split(".")
        imagePath_sub = imagePath + "/" + name   # imagePath的子目录
        os.mkdir(imagePath_sub)
        videoRoot = videoPath + "/" + videoName  # 视频的绝对路径
        cap = cv2.VideoCapture(videoRoot)
        ret, frame = cap.read()
        frameNum = 1
        imageNumName = 0
        print(videoRoot)
        while(True):
            ret, frame = cap.read()
            if not ret:
                break
            if frameNum % gap == 0:
                # 图片的保存路径
                savePath = imagePath_sub + "/" + name + "_" + "{:0>6d}".format(imageNumName) + ".png"
                imageNumName = imageNumName + 1
                cv2.imwrite(savePath, frame)
            frameNum = frameNum + 1



videoPath = "D:/DataSet/toolsData/videos"
imagePath = "D:/DataSet/toolsData/images"
gap = 10
isClearImagePath = True
if __name__ == "__main__":
    video2image()

 

你可能感兴趣的:(opencv,数据处理)