我正在尝试从我拥有的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")
答案 0 :(得分:2)
我将猜测视频主要由类似的像素组成,这些像素被阻塞在一起,从而视频已压缩到如此小的文件大小。当您将单个图像加载到阵列中时,所有压缩将消失,并且取决于视频的fps,您将拥有数千个未压缩的图像。首次加载图像时,它将被保存为dtype uint8的numpy数组,图像大小将为WIDTH * HEIGHT * N_COLOR_CHANNELS字节。将其除以255.0以在0和1之间归一化之后,dtype更改为float64,并且图像大小增加了八倍。您可以使用此信息来计算图像的预期大小。
因此,您的选择是减小图像的高度和宽度(缩小),更改为灰度,或者如果应用程序允许其使用uint8值。如果图像变化不大,并且您不需要成千上万的图像,那么您也只能保存十分之一或任何合理的值。如果您原样需要它们,但它们不适合存储在内存中,请考虑使用生成器按需加载它们。速度会变慢,但至少会运行。