平均剩余帧的颜色

问题描述 投票:0回答:1

我看过很多图像,其中包含每帧的平均颜色,所以我自己尝试过。

此代码将平均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,则这些最后的帧将不被处理。如何处理那些框架?

python numpy cv2
1个回答
0
投票

[我刚刚在else处添加了此代码,该代码检查是否有剩余帧,还检查frames数组是否有内容,然后将内容追加到image数组。

if framesremain > 0 and len(frames) > 0:
            image[:,[framespos]] = np.average(frames, axis=0)
            framesprocessed += framesremain
            print("%s/%s" %(framesprocessed,fcount))
© www.soinside.com 2019 - 2024. All rights reserved.