python - 用于生成视频摘要的优化方法?

标签 python opencv video-streaming frames

我编写的代码能够通过不动的跳过帧来创建视频摘要。但是保存输出视频要花费视频持续时间的10倍以上。因此,任何人都可以帮助我在代码中进行一些更改。这不是系统配置的问题。即使在i7 GPU系统中,我也尝试过。

import cv2
import imutils

vs = cv2.VideoCapture("example_01.mp4")
fgbg = cv2.createBackgroundSubtractorMOG2()
pathOut = "output.mp4"



frame_array = []

while True:
    ret,frame = vs.read()
    forig = frame.copy()
    height,width,layers = frame.shape
    size = (width,height)

    blurred = cv2.GaussianBlur(frame, (11, 11), 0)
    gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
    mask = fgbg.apply(gray)
    mask = cv2.erode(mask, None, iterations=2)
    mask = cv2.dilate(mask, None, iterations=2)
    cnts = cv2.findContours(mask.copy(), 
cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    cv2.imshow('mask',mask)



    for c in cnts:
        area = cv2.contourArea(c)


    if area > 2000:
        frame_array.append(frame)



    out = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'MPEG'), 20, 
size)
    for i in range(len(frame_array)):
        out.write(frame_array[i])

    out.release()


    cv2.imshow("Frame", frame)
    key = cv2.waitKey(25)

    if key == ord("q"):
        break
vs.release()
cv2.destroyAllWindows()

最佳答案

我拍了18秒的电影,您的代码在旧计算机上工作了很多分钟,并且速度变慢,所以最终我杀死了它,但没有得到输出电影。

这段代码大约需要57秒才能完成。如果我不显示窗口,则需要39秒。

我只打开一次out。我没有将frame附加到frame_array,而是直接将此一帧写入文件。

import cv2
import imutils
import time

vs = cv2.VideoCapture("Wideo/1-sierpinski-carpet-turtle.mp4")
fgbg = cv2.createBackgroundSubtractorMOG2()
pathOut = "output.mp4"

out = None

start = time.time()

while True:
    ret, frame = vs.read()

    if frame is None:
        break

    forig = frame.copy()
    height, width, layers = frame.shape
    size = (width, height)

    if not out:
        out = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'MPEG'), 20, size)

    blurred = cv2.GaussianBlur(frame, (11, 11), 0)
    gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
    mask = fgbg.apply(gray)
    mask = cv2.erode(mask, None, iterations=2)
    mask = cv2.dilate(mask, None, iterations=2)
    cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    cv2.imshow('mask',mask)

    for c in cnts:
        area = cv2.contourArea(c)
        if area > 2000:
           out.write(frame)
           break # don't check other areas

    cv2.imshow("Frame", frame)
    key = cv2.waitKey(25)

    if key == ord("q"):
        break

end = time.time()
print("time:", end-start)

out.release()
vs.release()
cv2.destroyAllWindows()

您的代码一次又一次打开文件,并一次又一次地写入所有帧-因此,它在我的计算机上速度变慢。您最终只能在循环后编写一次。
import cv2
import imutils
import time

vs = cv2.VideoCapture("Wideo/1-sierpinski-carpet-turtle.mp4")
fgbg = cv2.createBackgroundSubtractorMOG2()
pathOut = "output.mp4"

frame_array = []

start = time.time()

while True:
    ret, frame = vs.read()

    if frame is None:
        break

    forig = frame.copy()
    height, width, layers = frame.shape
    size = (width, height)

    blurred = cv2.GaussianBlur(frame, (11, 11), 0)
    gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
    mask = fgbg.apply(gray)
    mask = cv2.erode(mask, None, iterations=2)
    mask = cv2.dilate(mask, None, iterations=2)
    cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    cv2.imshow('mask',mask)

    for c in cnts:
        area = cv2.contourArea(c)
        if area > 2000:
            frame_array.append(frame)
            break

    cv2.imshow("Frame", frame)
    key = cv2.waitKey(25)

    if key == ord("q"):
        break

# --- after loop ---

out = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'MPEG'), 20, size)
for frame in frame_array:
   out.write(frame)
out.release()

end = time.time()
print("time:", end-start)

vs.release()
cv2.destroyAllWindows()

关于python - 用于生成视频摘要的优化方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57769415/

相关文章:

python - 带有 python 2 的 Ubuntu

python - 在python中,有没有一种简单的方法可以将带逗号的数字转换为整数,然后再返回带逗号的数字?

python - Python中如何使用VIPS进行逻辑运算和逻辑索引?

android - 为视频流实现 float View

actionscript-3 - 如何在OSMF中加载ByteArray FLV?

Python下载具有交替变量的图像

python - 如何在 Python 包中安全地 "fake"模块

c# Opencvsharp 3 camcorder capture on windows 窗体

python-3.x - 图像未保存在打开的简历写入功能中

c# - 在 C# 中的视频上绘制矩形