1

几天前,我从未使用过 OpenCV 或做过任何视频处理。我被要求根据一些用户输入计算叠加视频,并构建一个新视频,其中包含以 AVI 格式下载的叠加。本质上,我们的目标是有一个表单,输入 3 个图像(图标、屏幕截图 #1、屏幕截图 #1)和 3 个文本输入,并用它们覆盖原始视频。这是视频的链接。播放视频时,您会注意到开头 iPhone 中心的图标被拉伸和拉动。我一直在迭代测试 OpenCV 方法,逐帧分解视频并对每个视频进行处理,然后重建(显然,这可能是使用 OpenCV 成功重建视频并进行编辑的唯一方法,但无论如何)。 视频是我覆盖了一个来回移动的彩色圆圈。

# the method I've been using
import cv2 as cv
import numpy as np
cap = cv.VideoCapture('the_vid.avi')
flag, frame = cap.read()
width = np.size(frame,1)
height = np.size(frame,0)
writer = cv.VideoWriter('output.avi', cv.VideoWriter_fourcc('I','4','2','0'), fps=35, (width,height), 1)

while True:
    flag, frame = cap.read()
    if flag == 0:
        break
    x = width/2
    y = height/2
    # add a line or circle or something
                    origin radius
    cv.circle(frame, (x,y), 20, (0,0,255), -1)
    # write our new frame
    writer.write(frame)

现在我们得到了这个非常大的未压缩 AVI 文件的输出,可以使用 ffmpeg 进行压缩

ffmpeg -i output.avi -vcodec msmpeg4v2 compressed_output.avi

好的,这就是我用来重建此视频的方法,从该方法中我看不到可以拍摄静态图像并将其拉伸,就像前 90 帧左右显示的那样。我看到的唯一另一种可能性可能是在做类似下面的事情。如果你能告诉我是否有办法实现这个很棒的伪代码,我认为这将非常困难:

# example for the first image and first few seconds of video only

first_image = cv.imread('user_uploaded_icon.png')
flag, first_frame = cap.read()

# section of the frame that contains the original icon
the_section = algorithm_to_get_array_of_original_icon_in_first_frame(first_frame)
rows, cols = the_section.shape

# somehow find the array within the first image that is the same size as the_section
# containing JUST the icon
icon = array_of_icon(first_image)

# build a blank image with the size of the original icon in the current frame

blank_image = np.zeros((rows,cols,3),np.uint8)

for i in xrange(row):
    for j in xrange(col):
        blank_image[i,j] = icon[i,j]

似乎它可能不起作用的事实是 first_frame 中的 the_section 将被拉伸到与静态图像不同的尺寸......所以我不确定是否有任何可行的方法来处理这个问题。我感谢所有提前节省时间的帮助。

4

0 回答 0