Таким образом, все зависит от того, что вы хотите сделать, поэтому будет зависеть от того, какой тип изображений вы будете обрабатывать.Прежде всего, вы всегда можете иметь 4 экземпляра класса VideoCapture, и каждый из них загружает новое видео, например:
videoTop = cv2.VideoCapture(videoTopFileName)
videoLeft = cv2.VideoCapture(videoLeftFileName)
videoRight = cv2.VideoCapture(videoRightFileName)
videoBottom = cv2.VideoCapture(videoBottomFileName)
readCorrect = True
while( readCorrect ):
readCorrect , topFrame = videoTop.read()
ret, leftFrame = videoLeft.read()
readCorrect = readCorrect and ret
ret, rightFrame = videoRight.read()
readCorrect = readCorrect and ret
ret, bottomFrame = videoBottom.read()
readCorrect = readCorrect and ret
if readCorrect :
holo = make4side(topFrame, leftFrame, rightFrame, bottomFrame )
В этом цикле вы уже можете сохранить свое изображение в VideoWriter.
Теперь самое сложное: ваши изображения не одинакового размера ... вы можете сделать что-то вроде:
import cv2
import numpy as np
# load images, in your case frames from videos
top = cv2.imread("D:\\testing\\1.jpg")
left = cv2.imread("D:\\testing\\2.jpg")
bottom = cv2.imread("D:\\testing\\3.jpg")
right = cv2.imread("D:\\testing\\4.jpg")
targetSize = (200,200)
h = targetSize[1] #height
w = targetSize[0] #width
top = cv2.resize(top, targetSize )
left = cv2.resize(left, targetSize )
bottom = cv2.resize(bottom, targetSize )
right = cv2.resize(right, targetSize )
output = np.zeros((w+h+h , w + h + h, 3), dtype="uint8")
# top
output[0:h, h:h+w] = top
# left >> rotate 90
output[h:h+w, 0:h] = np.rot90(left,1)
# right >> rotate 270
output[h:h + w, h + w:h +w +h] = np.rot90(bottom,3)
# bottom >> rotate 180
output[h+w:h+w+h, h:h+w] = np.rot90(right,2)
cv2.imshow("frame", output )
cv2.waitKey(0)import cv2
import numpy as np
# load images, in your case frames from videos
top = cv2.imread("D:\\testing\\1.jpg")
left = cv2.imread("D:\\testing\\2.jpg")
bottom = cv2.imread("D:\\testing\\3.jpg")
right = cv2.imread("D:\\testing\\4.jpg")
targetSize = (200,200)
h = targetSize[1] #height
w = targetSize[0] #width
top = cv2.resize(top, targetSize )
left = cv2.resize(left, targetSize )
bottom = cv2.resize(bottom, targetSize )
right = cv2.resize(right, targetSize )
output = np.zeros((w+h+h , w + h + h, 3), dtype="uint8")
# top
output[0:h, h:h+w] = top
# left >> rotate 90
output[h:h+w, 0:h] = np.rot90(left,1)
# right >> rotate 270
output[h:h + w, h + w:h +w +h] = np.rot90(bottom,3)
# bottom >> rotate 180
output[h+w:h+w+h, h:h+w] = np.rot90(right,2)
cv2.imshow("frame", output )
cv2.waitKey(0)
Но это создает "плохое" изображение, подобное этому:
Чтобы оно не искажалось, вы должны найти соотношение сторон и попытаться изменить их размер примерно так же.В случае, если соотношение сторон отличается, вам придется дополнить изображения.Это часть, которая зависит от вашей задачи, вы можете обрезать изображение или дополнить его.
Но в основном это то, что должно быть сделано.Я надеюсь, что это поможет вам.
Обновление:
Просто чтобы уточнить часть цикла:
readCorrect , topFrame = videoTop.read()
ret, leftFrame = videoLeft.read()
readCorrect = readCorrect and ret
В первой строке яприсваивает переменной readCorrect
логическое возвращение из read
.Затем на следующем изображении я назначил ret
и сделал логику and
с предыдущим результатом.Таким образом, вы узнаете, все ли они верны, или если ЛЮБОЙ - ложь.
Я также исправил что-то в цикле, в котором произошла ошибка (я поставил, когда не читал, правильно, и это должно быть без нет).
Еще одна вещь перед циклом, вы должны создать объект VideoWriter, вы всегда можете получить размеры каждого видео перед чтением с get
с аргументом CV_CAP_PROP_FRAME_WIDTH
и CV_CAP_PROP_FRAME_HEIGHT
, как videoTop.get(CV_CAP_PROP_FRAME_WIDTH)
.
А затем внутри цикла, особенно внутри if, после получения изображения вы можете записать его в.