输入图像的深度不受支持:“VDepth::contains(深度)”,其中“深度”为 4 (CV_32S)

CaR*_*532 4 python opencv image image-processing python-3.x

我正在尝试在 OpenCV 中处理一些图像。具体来说,使用以下函数交换颜色窗格。

def green_ble_swap(image)
    im_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    im_copy = np.copy(im_rgb)
    blue = im_copy[:,:,2].copy()
    green = im_copy[:,:,1].copy()
    im_copy[:,:,2] = green
    im_copy[:,:,1] = blue
    return im_copy
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误。

> Unsupported depth of input image:
>     'VDepth::contains(depth)'
> where
>     'depth' is 4 (CV_32S)
Run Code Online (Sandbox Code Playgroud)

不确定这里有什么错误。

nat*_*ncy 5

您遇到此错误是因为您尝试对 4 通道图像执行 3 通道操作。具体来说,错误来自于尝试将BGR图像转换为RGB输入图像具有透明通道的情况。正确的方法是 docv2.COLOR_BGRA2RGB而不是cv2.COLOR_BGR2RGB. 您可以就地交换蓝色和绿色通道,以cv2.split()获得BGR通道(对于 3 通道图像)和BGRA通道(4 通道图像),然后使用 Numpy 索引交换通道。cv2.IMREAD_UNCHANGED加载图像时还需要使用该标志,否则 Alpha 通道将被丢弃。例子:

输入->输出

import cv2
import numpy as np

def green_blue_swap(image):
    # 3-channel image (no transparency)
    if image.shape[2] == 3:
        b,g,r = cv2.split(image)
        image[:,:,0] = g
        image[:,:,1] = b
    # 4-channel image (with transparency)
    elif image.shape[2] == 4:
        b,g,r,a = cv2.split(image)
        image[:,:,0] = g
        image[:,:,1] = b
    return image 

# Load image
image = cv2.imread('1.png', cv2.IMREAD_UNCHANGED)
cv2.imshow('image', image)

# Swap channels
swapped = green_blue_swap(image)
cv2.imshow('swapped', swapped)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)