如何使用 OpenCV、NumPy 和 Python 将彩色图像与二进制图像堆叠在一起?

时间:2021-04-25 20:16:59

标签: python numpy opencv

我正在制作一个运动检测程序,该程序首先从实时视频源中获取参考帧,然后检测程序启动时所采用的参考帧是否有任何变化。

变量:

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)))     

1 个答案:

答案 0 :(得分:0)

我们将任务分成 3 个功能:

  1. 定义一个接收图像数组的函数。如果数组是 2D 的,这意味着它是灰度的,则将其转换为 3D 并返回 3D 数组。否则,返回原始数组。

  2. 定义一个函数,该函数将接收图像数组列表,并返回图像中最大的宽度和高度。

  3. 定义一个函数,该函数将接收图像数组列表,并从原始列表中返回每个图像的图像列表,仅广播到黑色画布。黑色画布应从 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