Преобразование видео в массив из 3 значений - PullRequest
0 голосов
/ 16 января 2020

Мне нужно написать скрипт 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. Кто-нибудь знает библиотеку, которая позволяет вам это делать? Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 16 января 2020

Вы можете использовать OpenCV, чтобы преобразовать каждый видеокадр в одномерный массив и отформатировать его по своему усмотрению с дальнейшей обработкой.

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()

Этот код будет печатать массив для каждого кадра в [RGBRGB .. .] формат. Во-первых, RGB соответствует первому пикселю и т. Д.

1 голос
/ 16 января 2020

Вы должны иметь возможность использовать 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.

...