如何将二维蒙版转为三维数组以实现视频与蒙版并排对比?
解决二维蒙版转三维数组的广播错误问题
问题核心
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
相关产品推荐
相关产品推荐

