Python 将视频转换为3值数组

Python 将视频转换为3值数组,python,python-3.x,list,video,rgb,Python,Python 3.x,List,Video,Rgb,我需要编写一个Python脚本,将视频转换为json数组。最终产品如下所示: // first frame: arr1 = [(251, 135, 0), (127, 5, 860), etc] arr2 = [(251, 135, 0), (127, 5, 860), etc] arr3 = [(251, 135, 0), (127, 5, 860), etc] 每个阵列表示视频的单个帧,而每个子阵列表示视频的一个像素,存储在RGB值中。有人知道允许你这么做的图书馆吗?任何帮助都将不胜感激

我需要编写一个Python脚本,将视频转换为json数组。最终产品如下所示:

// first frame:
arr1 = [(251, 135, 0), (127, 5, 860), etc]
arr2 = [(251, 135, 0), (127, 5, 860), etc]
arr3 = [(251, 135, 0), (127, 5, 860), etc]


每个阵列表示视频的单个帧,而每个子阵列表示视频的一个像素,存储在RGB值中。有人知道允许你这么做的图书馆吗?任何帮助都将不胜感激

您应该能够使用OpenCV处理文件。例如,此代码处理我的一个320x180视频,并以您想要的格式大致打印每个帧中的前几个像素:

# Open up and get first frame (if any).

import cv2
cap = cv2.VideoCapture("/home/pax/test320x180.mp4")
okay, frame = cap.read()
fnum = 0
print(f'# Video appears to be {len(frame[0])} x {len(frame)}')

# Process each frame.

while okay:
    fnum += 1
    sep = ' ['
    print(f'arr{fnum} =', end='')
    limit = 3
    for row in frame:
        for pixel in row:
            print(f'{sep}({pixel[0]}, {pixel[1]}, {pixel[2]})', end='')
            sep = ', '
            limit -= 1
            if limit == 0: break
        if limit == 0: break
    if limit == 0: print(', ...', end='')
    print(']')
    okay, frame = cap.read()
其输出为:

# Video appears to be 320 x 180
arr1 = [(0, 0, 0), (0, 0, 0), (0, 0, 0), ...]
arr2 = [(157, 130, 73), (194, 167, 110), (192, 170, 100), ...]
arr3 = [(157, 130, 73), (194, 167, 110), (192, 170, 100), ...]
arr4 = [(157, 130, 73), (194, 167, 110), (192, 170, 100), ...]
arr5 = [(157, 130, 73), (194, 167, 110), (192, 170, 100), ...]
arr6 = [(157, 130, 73), (194, 167, 110), (192, 170, 100), ...]
arr7 = [(159, 129, 73), (196, 166, 110), (194, 169, 100), ...]
arr8 = [(159, 129, 73), (196, 166, 110), (194, 169, 100), ...]
arr9 = [(159, 129, 73), (196, 166, 110), (194, 169, 100), ...]
arr10 = [(159, 129, 73), (196, 166, 110), (194, 169, 100), ...]
:
arr887 = [(227, 199, 179), (230, 202, 182), (228, 204, 186), ...]
arr888 = [(227, 199, 179), (230, 202, 182), (228, 204, 186), ...]
arr889 = [(227, 201, 181), (229, 203, 183), (229, 205, 187), ...]
arr890 = [(225, 199, 179), (228, 202, 182), (228, 204, 186), ...]
arr891 = [(225, 199, 179), (228, 202, 182), (228, 204, 186), ...]

如果您愿意忍受检查整个文件(或者一旦您满意像素是正确的),只需删除包含
limit
变量的所有行。

您应该能够使用OpenCV处理文件。例如,此代码处理我的一个320x180视频,并以您想要的格式大致打印每个帧中的前几个像素:

# Open up and get first frame (if any).

import cv2
cap = cv2.VideoCapture("/home/pax/test320x180.mp4")
okay, frame = cap.read()
fnum = 0
print(f'# Video appears to be {len(frame[0])} x {len(frame)}')

# Process each frame.

while okay:
    fnum += 1
    sep = ' ['
    print(f'arr{fnum} =', end='')
    limit = 3
    for row in frame:
        for pixel in row:
            print(f'{sep}({pixel[0]}, {pixel[1]}, {pixel[2]})', end='')
            sep = ', '
            limit -= 1
            if limit == 0: break
        if limit == 0: break
    if limit == 0: print(', ...', end='')
    print(']')
    okay, frame = cap.read()
其输出为:

# Video appears to be 320 x 180
arr1 = [(0, 0, 0), (0, 0, 0), (0, 0, 0), ...]
arr2 = [(157, 130, 73), (194, 167, 110), (192, 170, 100), ...]
arr3 = [(157, 130, 73), (194, 167, 110), (192, 170, 100), ...]
arr4 = [(157, 130, 73), (194, 167, 110), (192, 170, 100), ...]
arr5 = [(157, 130, 73), (194, 167, 110), (192, 170, 100), ...]
arr6 = [(157, 130, 73), (194, 167, 110), (192, 170, 100), ...]
arr7 = [(159, 129, 73), (196, 166, 110), (194, 169, 100), ...]
arr8 = [(159, 129, 73), (196, 166, 110), (194, 169, 100), ...]
arr9 = [(159, 129, 73), (196, 166, 110), (194, 169, 100), ...]
arr10 = [(159, 129, 73), (196, 166, 110), (194, 169, 100), ...]
:
arr887 = [(227, 199, 179), (230, 202, 182), (228, 204, 186), ...]
arr888 = [(227, 199, 179), (230, 202, 182), (228, 204, 186), ...]
arr889 = [(227, 201, 181), (229, 203, 183), (229, 205, 187), ...]
arr890 = [(225, 199, 179), (228, 202, 182), (228, 204, 186), ...]
arr891 = [(225, 199, 179), (228, 202, 182), (228, 204, 186), ...]

如果您愿意检查整个文件(或者一旦您满意像素是正确的),只需删除包含
limit
变量的所有行。

您可以使用OpenCV将每个视频帧转换为1D数组,并通过进一步处理将其格式化

import cv2

cap = cv2.VideoCapture('numbers.mp4')

while (cap.isOpened()):
    # Get a video frame
    hasFrame, frame = cap.read()


    if hasFrame == True:
        ## Convert BGR to RGB
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        print(frame.ravel())

        #print(frame.shape)
        #print(len(frame.ravel()))
        #print(frame[0][1])

    else:
        break

cap.release()

此代码将以[R G B R G B…]格式为每个帧打印一个数组。首先,RGB对应于第一个像素,依此类推。

您可以使用OpenCV将每个视频帧转换为1D数组,并对其进行进一步处理,使其符合您的喜好

import cv2

cap = cv2.VideoCapture('numbers.mp4')

while (cap.isOpened()):
    # Get a video frame
    hasFrame, frame = cap.read()


    if hasFrame == True:
        ## Convert BGR to RGB
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        print(frame.ravel())

        #print(frame.shape)
        #print(len(frame.ravel()))
        #print(frame[0][1])

    else:
        break

cap.release()

此代码将以[R G B R G B…]格式为每个帧打印一个数组。首先,RGB对应于第一个像素,依此类推。

哇,这将是一个很大的源文件:-)完全!我计划让实际的视频本身更像160 x 90(像素),只有几秒钟长,所以它应该只是1920 x 1080或天堂禁止的4K中使用的大小的一小部分。哇,这将是一个大的源文件:-)完全!我计划实际的视频本身更像是160 x 90(像素),只有几秒钟长,所以它应该只是1920 x 1080或天堂禁止的4K中使用的大小的一小部分。我收到了各种各样的错误,在删除第7行之后,脚本不会打印您提到的任何输出。当然,我确实将目录和视频更改为我自己的。@Aaron,检查第一个
cap.read()
返回的内容(在
OK
中)。可能是CV不支持您的视频文件。@Aaron,mp4是一种容器格式,我相信嵌入的编解码器可以是任意的。不管怎样,只要检查
read()
结果,就可以很容易地确定OpenCV是否支持它。我收到了各种错误,在删除第7行之后,脚本不会打印您提到的任何输出。当然,我确实将目录和视频更改为我自己的。@Aaron,检查第一个
cap.read()
返回的内容(在
OK
中)。可能是CV不支持您的视频文件。@Aaron,mp4是一种容器格式,我相信嵌入的编解码器可以是任意的。不管怎样,只要检查
read()
结果,就可以很容易地查看OpenCV是否支持它。