如何将多个视频组合成一个视频,并使用Python设置它们的位置

如何将多个视频组合成一个视频,并使用Python设置它们的位置,python,opencv,video-processing,Python,Opencv,Video Processing,我的问题是,我有4个视频,我想将它们合并到一个视频中,并使用Python立即播放它们。每个视频都设置在全息视频的位置(例如,顶部、底部、左侧、右侧)。有什么方法可以帮助我实现这一点吗?我发现了一些与我的问题相似的相关来源,但我无法将其应用于我的问题 提前感谢您您可以通过将所有图像复制到一个黑框中来尝试将它们合并在一起。下面是一个在所有4个位置都具有相同图像的示例: import cv2 import numpy as np #loads images and gets data img = c

我的问题是,我有4个视频,我想将它们合并到一个视频中,并使用Python立即播放它们。每个视频都设置在全息视频的位置(例如,顶部、底部、左侧、右侧)。有什么方法可以帮助我实现这一点吗?我发现了一些与我的问题相似的相关来源,但我无法将其应用于我的问题


提前感谢您

您可以通过将所有图像复制到一个黑框中来尝试将它们合并在一起。下面是一个在所有4个位置都具有相同图像的示例:

import cv2
import numpy as np

#loads images and gets data
img = cv2.imread("img.png")
h,w,_ = img.shape    

# creates the resulting image with double the size and 3 channels 
output = np.zeros((h * 2, w * 2, 3), dtype="uint8")

# copies the image to the top left
output[0:h, 0:w] = img 
# copies the image to the top right
output[0:h, w:w * 2] = img 
# copies the image to the bottom left
output[h:h * 2, w:w * 2] = img 
# copies the image to the bottom right
output[h:h * 2, 0:w] = img 
您可以随时将img更改为其他内容。您还可以像这样连接它们:

top = np.hstack((img, img))
bottom = np.hstack((img, img))
result = np.vstack((top, bottom))
结果是一样的

以下是使用此代码生成的img示例:

然而,您的图像有一点不同,您将需要一个旋转,并不是完全串联,而是复制一个。这方面的一个例子如下:

# creates the resulting image with double the size and 3 channels 
output = np.zeros((w+h+h , w + h + h, 3), dtype="uint8")

# top img
output[0:h, h:h+w] = img 
# left img (rotated 90°)
output[h:h+w, 0:h] = np.rot90(img,1) 
# right img (rotated 270°)
output[h:h + w, h + w:h +w +h] = np.rot90(img,3)  
# bottom img (rotated 180°)
output[h+w:h+w+h, h:h+w] = np.rot90(img,2) 
结果是这样的:

top = np.hstack((img, img))
bottom = np.hstack((img, img))
result = np.vstack((top, bottom))

如果你使用黑色背景的图像,你或多或少会得到你所拥有的东西。您可能需要使用复制参数,但基本上可以执行以下操作:

imgToCopyTo[y1:y2, x1:x2] = imgToCopyFrom

其中y1和x1是要开始复制的左上角坐标,y2和x2是要复制到的右下角坐标。此外,y2-y1的IMGTocycopy的高度应为x2-x1的宽度(它可以大于宽度或高度,但不能小于宽度)。

您可以通过将所有图像复制到一个黑框中来尝试将它们合并在一起。下面是一个在所有4个位置都具有相同图像的示例:

import cv2
import numpy as np

#loads images and gets data
img = cv2.imread("img.png")
h,w,_ = img.shape    

# creates the resulting image with double the size and 3 channels 
output = np.zeros((h * 2, w * 2, 3), dtype="uint8")

# copies the image to the top left
output[0:h, 0:w] = img 
# copies the image to the top right
output[0:h, w:w * 2] = img 
# copies the image to the bottom left
output[h:h * 2, w:w * 2] = img 
# copies the image to the bottom right
output[h:h * 2, 0:w] = img 
您可以随时将img更改为其他内容。您还可以像这样连接它们:

top = np.hstack((img, img))
bottom = np.hstack((img, img))
result = np.vstack((top, bottom))
结果是一样的

以下是使用此代码生成的img示例:

然而,您的图像有一点不同,您将需要一个旋转,并不是完全串联,而是复制一个。这方面的一个例子如下:

# creates the resulting image with double the size and 3 channels 
output = np.zeros((w+h+h , w + h + h, 3), dtype="uint8")

# top img
output[0:h, h:h+w] = img 
# left img (rotated 90°)
output[h:h+w, 0:h] = np.rot90(img,1) 
# right img (rotated 270°)
output[h:h + w, h + w:h +w +h] = np.rot90(img,3)  
# bottom img (rotated 180°)
output[h+w:h+w+h, h:h+w] = np.rot90(img,2) 
结果是这样的:

top = np.hstack((img, img))
bottom = np.hstack((img, img))
result = np.vstack((top, bottom))

如果你使用黑色背景的图像,你或多或少会得到你所拥有的东西。您可能需要使用复制参数,但基本上可以执行以下操作:

imgToCopyTo[y1:y2, x1:x2] = imgToCopyFrom

其中y1和x1是要开始复制的左上角坐标,y2和x2是要复制到的右下角坐标。此外,y2-y1的IMGTOCopycoy的高度应为x2-x1的宽度(可以大于宽度或高度,但不能小于)。

欢迎使用StackOverflow!你应该试着发布原始的4张图片,到目前为止你尝试了什么,出了什么问题。现在的问题有点宽泛,因为它可以通过多种方式完成,这取决于您的输入和您想要尝试的内容。例如,您可以将图像与numpy连接起来,或者编写一个黑色图像并将它们复制到您想要的位置。也许turial可以启发你。我一直在尝试根据这个链接,这与我想要的相似,但我有一个错误,在代码行中缺乏理解。根据@api55,我考虑过创建一个黑色图像并将每个视频附加到该图像中的想法,但我不知道怎么做。你给我的链接帮助我了解了更多关于使用opencv编写视频的内容,但是你能提供一种方法吗(编写一个黑色图像并将它们复制到你想要的地方)。谢谢:)欢迎来到StackOverflow!你应该试着发布原始的4张图片,到目前为止你尝试了什么,出了什么问题。现在的问题有点宽泛,因为它可以通过多种方式完成,这取决于您的输入和您想要尝试的内容。例如,您可以将图像与numpy连接起来,或者编写一个黑色图像并将它们复制到您想要的位置。也许turial可以启发你。我一直在尝试根据这个链接,这与我想要的相似,但我有一个错误,在代码行中缺乏理解。根据@api55,我考虑过创建一个黑色图像并将每个视频附加到该图像中的想法,但我不知道怎么做。你给我的链接帮助我了解了更多关于使用opencv编写视频的内容,但是你能提供一种方法吗(编写一个黑色图像并将它们复制到你想要的地方)。谢谢:)因此,如果我有4个不同高度和宽度的图像,我应该首先将它们缩放为相同的大小(对于可变h和w中的相同值),然后一次读取所有图像,对吗?@Jamiewp这取决于您最后想要什么,在我的示例中,徽标的高度与宽度(428 x 378)不同,这就是为什么我在我的代码中使用了
h:h+w,h+w:h+w+h
,它混合了高度和宽度以获得正确的位置。但是,如果你需要正方形或不同的比例,你可以先调整大小,然后合并它们,只要记住,为了避免拉伸图像,保持相同的比例,然后裁剪以匹配。对不起,我真的需要帮助。因为,我想使用4个不同的视频,每个视频可能具有不同的帧分辨率,所以我不知道如何在输出中应用w和h的值,并且我真的很难对所有4个视频使用视频捕获。这是关于问题的链接,你能帮我吗?因此,如果我有4个不同高度和宽度的图像,我应该首先将它们缩放到相同的大小(对于可变h和w中的相同值),然后一次读取所有图像,对吗?@Jamiewp这取决于你最后想要什么,在我的示例中,徽标的高度与宽度不同(428 x 378),这就是为什么我在代码中使用了
h:h+w,h+w:h+w+h
,它混合了高度和宽度以获得正确的位置。但是,如果需要它们为方形或不同比例,可以先调整大小,然后合并它们,请记住,为了避免拉伸图像,请保留sa