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

2024-10-03 23:25:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个运动检测程序,它首先从一个实时视频源获取一个参考帧,并检测程序启动时参考帧是否有任何变化

变量:

REFRAME=3维图像,即程序启动时从网络摄像头提要中获取的彩色帧。(静止图像是网络摄像头捕获的第一帧)

myFrame=三维视频源,反映网络摄像头的实时视频源(直接来自网络摄像头的实际实时视频源)

diffFrame=二维二进制视频馈送,显示当前视频馈送与启动程序时的参考图像帧之间的差异。(黑白视频源)

threshFrame=二维二进制视频馈送,显示diffFrame视频直播馈送的阈值格式。(不同格式的黑白视频源)

我的目标是使用vstack以4x4格式将所有4帧堆叠在一起,因为我已成功地将三维和二维图像水平堆叠在一起。目前,我有一个问题,因为他们的尺寸差异堆叠的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)))     

Tags: 图像程序网络视频格式np二进制差异
1条回答
网友
1楼 · 发布于 2024-10-03 23:25:52

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

  1. 定义将接收图像数组的函数。如果阵列是二维的,表示它是灰度的,则将其转换为三维并返回三维阵列。否则,返回原始数组

  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

相关问题 更多 >