【问题标题】:Optimised way to generate summary of a video?生成视频摘要的优化方式?
【发布时间】:2019-09-03 10:04:35
【问题描述】:

我编写的代码能够通过跳过没有运动的帧来创建视频摘要。但是保存输出视频的时间是视频时长的 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()

【问题讨论】:

  • 如果你想保存,我不会浪费时间展示它。
  • 您应该只创建一次out - 在while True 之前。并且只在文件中写入新帧 - 并非所有帧都在非常循环中一次又一次地写入。

标签: python opencv video-streaming frames


【解决方案1】:

我拍了 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()

【讨论】:

  • 非常感谢您。它现在完全按照我的意愿工作。非常感谢您的努力和时间。
猜你喜欢
  • 2015-09-09
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
相关资源
最近更新 更多