我正在制作一个运动检测程序,该程序首先从实时视频源中获取参考帧,然后检测程序启动时所采用的参考帧是否有任何变化。
变量:
refFrame = 3 维图像,这是您在程序启动时从网络摄像头馈送中获得的彩色帧。 (静止图像,即网络摄像头捕获的第一帧)
myFrame = 3 维视频源,反映网络摄像头的实时视频源(直接来自网络摄像头的实际实时视频源)
diffFrame = 2 维二进制视频源,显示当前视频源与启动程序时所用参考图像帧的差异。 (黑白视频源)
threshFrame = 2 维二进制视频源,显示 diffFrame 的视频实时源的阈值格式。 (不同格式的黑白视频源)
我的目标是使用 vstack 以 4x4 格式将所有 4 帧堆叠在一起,因为我已经成功地将 3 维和 2 维图像水平堆叠在一起。目前,由于尺寸差异,我在堆叠 4 张图像时遇到问题。我怎么可能把这 4 张图片叠在一起?
# stack 'em
picsStack1 = np.hstack((refFrame,myFrame))
picsStack2 = np.hstack((diffFrame,threshFrame))
# show video frame
cv.imshow('Hidden Cam',np.vstack((picsStack1, picsStack2)))
答案 0 :(得分:0)
我们将任务分成 3 个功能:
定义一个接收图像数组的函数。如果数组是 2D 的,这意味着它是灰度的,则将其转换为 3D 并返回 3D 数组。否则,返回原始数组。
定义一个函数,该函数将接收图像数组列表,并返回图像中最大的宽度和高度。
定义一个函数,该函数将接收图像数组列表,并从原始列表中返回每个图像的图像列表,仅广播到黑色画布。黑色画布应从 canvas_size
函数获取其尺寸。
代码可能如下所示:
import cv2
import numpy as np
def convert_channels(img):
if img.ndim == 2:
return cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
return img
def canvas_size(imgs):
h_max = 0
w_max = 0
for img in imgs:
h, w, _ = img.shape
if h > h_max:
h_max = h
if w > w_max:
w_max = w
return w_max, h_max
def padded_imgs(imgs):
max_w, max_h = canvas_size(imgs)
imgs_new = []
for img in map(convert_channels, imgs):
h, w, _ = img.shape
canvas = np.zeros((max_h, max_w, 3)).astype("uint8")
canvas[:h, :w] = img
imgs_new.append(canvas)
return imgs_new
while True:
# Your code here
refFrame, myFrame, diffFrame, threshFrame = padded_imgs([refFrame, myFrame, diffFrame, threshFrame])
picsStack1 = np.hstack((refFrame, myFrame))
picsStack2 = np.hstack((diffFrame, threshFrame))
cv.imshow('Hidden Cam',np.vstack((picsStack1, picsStack2)))
# Your code here