Moviepy: Как читать фильмы в оттенках серого кадр за кадром?

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

Я хочу прочитать фильм в оттенках серого (я сделал его с использованием изображений в оттенках серого) - кадр за кадром, используя moviepy. Для дальнейшей обработки мне нужны кадры в оттенках серого. Вот мой код:

clip = VideoFileClip('movie.mp4') 
count =1
for frames in clip.iter_frames():
    print frames.shape
    count+=1
print count

Формы рамы оказались (360 л, 480 л, 3 л), хотя я ожидал (360 л, 480 л). И это меня озадачивает. Есть ли способ получить «ожидаемую» форму? Идеи Python OpenCV тоже могут работать, но я бы предпочел moviepy.


person GKS    schedule 11.01.2017    source источник
comment
Это просто возвращает вам массив пикселей? т.е. у вас есть высота 360, ширина 480 и 3 канала (вероятно, RGB)   -  person EdChum    schedule 11.01.2017
comment
@EdChum: Да, он возвращает кадры RGB. Но я хочу рамки в оттенках серого   -  person GKS    schedule 11.01.2017
comment
Я не знаю о moviepy, но вы можете преобразовать RGB в HSL и взять только компонент L (яркость) с чем-то вроде docs.python.org/2/library/colorsys.html . Если ваш кадр находится в массиве numpy, вы также можете использовать: stackoverflow.com/questions/15278323/. Наконец, если изображения уже имеют оттенки серого, возможно, одно и то же значение содержится в трех каналах. В этом случае вы можете просто взять первый канал и проигнорировать остальные (проверить, какие значения на самом деле содержат данные).   -  person jjmontes    schedule 11.01.2017
comment
вы хотите использовать cvtColor см. связанный заголовок: stackoverflow.com/questions/7461075/   -  person EdChum    schedule 11.01.2017
comment
Если в moviepy нет ничего для этого, вы можете умножить 3 цветовых канала на соответствующие значения, например: gray = 0.2126* frame[:,:,0] + 0.7152*frame[:,:,1] + 0.0722*frame[:,:,2]. Таким образом, вы можете избежать использования другой библиотеки только для этой задачи.   -  person Miki    schedule 11.01.2017
comment
@jjmontes Все каналы разные. Я сделал l0=frames[:,:,0] l1=frames[:,:,1], а sum(sum(l0-l1)) дает 62059   -  person GKS    schedule 11.01.2017
comment
Я рекомендую сглаживание Флойда-Стейнберга, чтобы получить серый цвет.   -  person Marichyasana    schedule 11.01.2017


Ответы (1)


Если вы имеете дело с видео и изображениями, OpenCV — ваш друг:

import cv2
from moviepy.editor import VideoFileClip

clip = VideoFileClip('movie.mp4') 
count =1
for frames in clip.iter_frames():
    gray_frames = cv2.cvtColor(frames, cv2.COLOR_RGB2GRAY)
    print frames.shape
    print gray_frames.shape
    count+=1
print count
person richar8086    schedule 12.03.2017