Средний цвет оставшихся кадров - PullRequest
0 голосов
/ 30 сентября 2019

Я видел много изображений, где он содержит средний цвет каждого кадра, поэтому я попробовал это сам.

Этот код будет усреднять цвет x количества кадров в зависимости от FPS видео.

import cv2
import numpy as np


cap = cv2.VideoCapture("video.mp4")

fcount = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
duration = fcount/fps

image = np.zeros((500, round(fcount/fps), 3), np.uint8)

print("FPS: %s, COUNT %s, DURATION %s" %(fps,fcount,duration))

frames = []

framespos = 0
framesprocessed = 0

framesremain = fcount % fps

while True:
    flag,frame = cap.read()
    if flag:
        avg_color_per_row = np.average(frame, axis=0)
        avg_colors = np.average(avg_color_per_row, axis=0)
        avg_color_int = np.array(avg_colors, dtype=np.uint8)
        frames.append(avg_color_int)
        if len(frames) == fps:
            image[:,[framespos]] = np.average(frames, axis=0)
            framespos += 1
            framesprocessed += fps
            print("%s/%s" %(framesprocessed,fcount))
            frames.clear()
    else:
        cv2.imwrite('averages.png',image)
        print("TOTAL FRAMES: %s, PROCESSED FRAMES %s, UNPROCESSED FRAMES %s" %(fcount,framesprocessed,fcount%fps))
        cap.release()
        break

Это напишет что-то вроде этого:

barcode

Этот код работает нормально, но он не будет обрабатывать все кадры. Если fcount % fps > 0, последние кадры не будут обработаны. Как я могу обработать эти кадры?

1 Ответ

0 голосов
/ 01 октября 2019

Я только что добавил этот код в else, который проверяет, есть ли оставшиеся кадры, а также проверяет наличие содержимого в массиве frames, затем добавляет содержимое в массив image.

if framesremain > 0 and len(frames) > 0:
    image[:,[framespos]] = np.average(frames, axis=0)
    framesprocessed += framesremain
    print("%s/%s" %(framesprocessed,fcount))
...