如何缩小AVI文件中的数据集输出

时间:2019-12-12 21:09:48

标签: python opencv

我正在尝试从我拥有的avi文件创建数据集,我知道我在某个地方犯了一个错误。

我拥有的Avi文件为1,827 KB(4:17),但是运行代码将帧转换为数字数组后,我现在有了一个1,850,401 KB的文件。对我来说,这似乎有点大。

如何减小数据集的大小/哪里出了问题?

# Program To Read video 
# and Extract Frames 
import cv2 
import numpy as np
import time

# Function to extract frames 
def FrameCapture(path): 

    # Path to video file 
    vidObj = cv2.VideoCapture(path) 

    # Used as counter variable 
    count = 0

    # checks whether frames were extracted 
    success = 1

    newDataSet = []
    try:
        while success: 

            # vidObj object calls read 
            # function extract frames 
            success, image = vidObj.read()

            img_reverted = cv2.bitwise_not(image)
            new_img = img_reverted / 255.0

            newDataSet.append(new_img)
            #new_img >> "frame%d.txt" % count
            # Saves the frames with frame-count 
            #cv2.imwrite("frame%d.jpg" % count, image) 

            count += 1
    except:
        timestr = time.strftime("%Y%m%d-%H%M%S")
        np.save("DataSet" + timestr , newDataSet)

# Driver Code 
if __name__ == '__main__': 

    # Calling the function 
    FrameCapture("20191212-150041output.avi") 

1 个答案:

答案 0 :(得分:2)

我将猜测视频主要由类似的像素组成,这些像素被阻塞在一起,从而视频已压缩到如此小的文件大小。当您将单个图像加载到阵列中时,所有压缩将消失,并且取决于视频的fps,您将拥有数千个未压缩的图像。首次加载图像时,它将被保存为dtype uint8的numpy数组,图像大小将为WIDTH * HEIGHT * N_COLOR_CHANNELS字节。将其除以255.0以在0和1之间归一化之后,dtype更改为float64,并且图像大小增加了八倍。您可以使用此信息来计算图像的预期大小。

因此,您的选择是减小图像的高度和宽度(缩小),更改为灰度,或者如果应用程序允许其使用uint8值。如果图像变化不大,并且您不需要成千上万的图像,那么您也只能保存十分之一或任何合理的值。如果您原样需要它们,但它们不适合存储在内存中,请考虑使用生成器按需加载它们。速度会变慢,但至少会运行。