You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将二维蒙版转为三维数组以实现视频与蒙版并排对比?

解决二维蒙版转三维数组的广播错误问题

问题核心

cv.inRange生成的蒙版是单通道二维数组(形状为 (H,W)),而目标分屏区域是三通道三维数组(形状为 (H,W,3)),维度不匹配导致赋值时触发广播错误。需要将二维蒙版扩展为三通道结构,每个通道填充原蒙版的像素值。

两种可行解决方法

方法1:用numpy扩展通道维度

通过np.newaxis给二维蒙版增加通道轴,再用np.repeat复制三次生成三通道数组:

_, videoCam= vid.read()
f_height,f_width,_=videoCam.shape
hsv = cv.cvtColor(videoCam, cv.COLOR_BGR2HSV)

## 生成绿色区域蒙版
mask1 = cv.inRange(hsv, (36, 0, 0), (70, 255,255))
mask1 = cv.bitwise_not(mask1)  # 修正原代码:将反转结果赋值回mask1

# 把二维蒙版转为三通道
mask_3ch = np.repeat(mask1[:, :, np.newaxis], 3, axis=2)

blank_image = np.zeros((f_height,f_width*2,3), np.uint8)

blank_image[:,0:f_width] = hsv 
blank_image[:,f_width:f_width*2] = mask_3ch  # 维度匹配,可正常赋值

cv.imshow('',blank_image)
  • 原理:np.newaxis将二维数组转为 (H,W,1),再通过np.repeat在通道轴(axis=2)复制3次,得到和目标区域一致的(H,W,3)结构。

方法2:用OpenCV颜色转换函数

利用OpenCV的灰度图转彩色图函数,自动将单通道值复制到三个颜色通道:

_, videoCam= vid.read()
f_height,f_width,_=videoCam.shape
hsv = cv.cvtColor(videoCam, cv.COLOR_BGR2HSV)

## 生成绿色区域蒙版
mask1 = cv.inRange(hsv, (36, 0, 0), (70, 255,255))
mask1 = cv.bitwise_not(mask1)

# 单通道灰度蒙版转三通道彩色格式
mask_3ch = cv.cvtColor(mask1, cv.COLOR_GRAY2BGR)

blank_image = np.zeros((f_height,f_width*2,3), np.uint8)

blank_image[:,0:f_width] = hsv 
blank_image[:,f_width:f_width*2] = mask_3ch

cv.imshow('',blank_image)
  • 原理:COLOR_GRAY2BGR会将每个灰度像素值同步到B、G、R三个通道,生成视觉效果和原蒙版一致的三通道图像。

关键注意点

原代码中cv.bitwise_not(mask1)没有将反转结果赋值给变量,蒙版不会实际反转,必须修正为mask1 = cv.bitwise_not(mask1)才会生效。

内容的提问来源于stack exchange,提问作者Flitzcore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:31:02