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

使用cv.hconcat堆叠图像时出现OpenCV断言错误的求助

OpenCV图像拼接报错:cv::hconcat断言失败

我尝试读取图像并转换为不同色彩空间,拆分分量后按如下网格展示四张图像:

[ 原图 , 分量1
 分量2, 分量3 ]

但运行时出现以下错误:

File "chromaKey.py", line 64, in <module>
    img_obj.colorSpaceComponents(option,path)
File "chromaKey.py", line 31, in colorSpaceComponents
    img_2d_tile = cv.vconcat([cv.hconcat(img_list) for img_list in img_2d])
File "chromaKey.py", line 31, in <listcomp>
    img_2d_tile = cv.vconcat([cv.hconcat(img_list) for img_list in img_2d])
cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\core\src\matrix_operations.cpp:67: error: (-215:Assertion failed) src[i].dims <= 2 && src[i].rows == src[0].rows && src[i].type() == src[0].type() in function 'cv::hconcat'

我已检查四张图像的宽高维度一致,但不确定为何无法正常堆叠,以下是我的代码:

# Importing Packages
import sys
import cv2 as cv
import numpy as np

class Image_Handler:
    def __init__(self):
        pass
    def colorSpaceComponents(self,option,path):
        # reading images
        img_original = cv.imread(path)
        c1 = c2 = c3 = ''
        # Converting the images to different color-spaces and grey-scaling them
        if option == '-XYZ':
            img_converted = cv.cvtColor(img_original,cv.COLOR_BGR2XYZ)
            c1,c2,c3 = cv.split(img_converted)
        elif option == '-YCrCb':
            img_converted = cv.cvtColor(img_original,cv.COLOR_BGR2YCrCb)
            c1,c2,c3 = cv.split(img_converted)
        elif option == '-Lab':
            img_converted = cv.cvtColor(img_original,cv.COLOR_BGR2Lab)
            c1,c2,c3 = cv.split(img_converted)
        elif option == '-HSB':
            img_converted = cv.cvtColor(img_original,cv.COLOR_BGR2HSV)
            c1,c2,c3 = cv.split(img_converted)
        elif option == '-RGB':
            c1,c2,c3 = cv.split(img_original)

        # Structuring the images to tiles
        img_2d = [[img_original,c1],[c2,c3]]
        img_2d_tile = cv.vconcat([cv.hconcat(img_list) for img_list in img_2d])

        # Creating the windows
        cv.namedWindow("Stacked_Image", cv.WINDOW_NORMAL)
        cv.resizeWindow("Stacked_Image", 1280, 720)

        # Displaying the result
        cv.imshow('Stacked_Image',img_2d_tile)
        cv.waitKey(0)

        # Destroying the windows
        cv.destroyAllWindows()
        return

if __name__ == "__main__":
    # Getting the arguments given to the program
    argument_one = sys.argv[1]
    argument_two = sys.argv[2]

    # Checking the first argument, to determine if it's task 1 or task 2
    task_flag = 0
    if('-' in argument_one):
        task_flag = 1
    else:
        task_flag = 2

    # Creating an object for the class Image_handler
    img_obj = Image_Handler()

    # Calling the function according to task flag
    if task_flag == 1:
        path = str(sys.argv[2])
        option = str(sys.argv[1])
        img_obj.colorSpaceComponents(option,path)
        print('Task 01 complete')

期望拼接效果:
期望拼接效果


问题原因

报错核心是原图是3通道彩色图,拆分出的分量是单通道灰度图,两者的通道数(图像type属性)不一致,导致cv.hconcat的断言检查失败。你只检查了宽高维度,忽略了通道数这个关键参数。

解决办法

将所有单通道分量图转换为3通道格式,与原图保持一致。可以用cv.cvtColor或cv.merge实现,以下是修改后的核心代码:

方式1:直接在每个分支添加转换代码

# 以-XYZ分支为例,其余分支同理
if option == '-XYZ':
    img_converted = cv.cvtColor(img_original,cv.COLOR_BGR2XYZ)
    c1,c2,c3 = cv.split(img_converted)
    # 将单通道转为3通道BGR格式
    c1 = cv.cvtColor(c1, cv.COLOR_GRAY2BGR)
    c2 = cv.cvtColor(c2, cv.COLOR_GRAY2BGR)
    c3 = cv.cvtColor(c3, cv.COLOR_GRAY2BGR)
elif option == '-YCrCb':
    img_converted = cv.cvtColor(img_original,cv.COLOR_BGR2YCrCb)
    c1,c2,c3 = cv.split(img_converted)
    c1 = cv.cvtColor(c1, cv.COLOR_GRAY2BGR)
    c2 = cv.cvtColor(c2, cv.COLOR_GRAY2BGR)
    c3 = cv.cvtColor(c3, cv.COLOR_GRAY2BGR)
# ... 其余色彩空间分支重复上述转换逻辑
elif option == '-RGB':
    c1,c2,c3 = cv.split(img_original)
    c1 = cv.cvtColor(c1, cv.COLOR_GRAY2BGR)
    c2 = cv.cvtColor(c2, cv.COLOR_GRAY2BGR)
    c3 = cv.cvtColor(c3, cv.COLOR_GRAY2BGR)

方式2:写通用函数简化代码

# 定义通用转换函数
def to_3channel(img):
    if len(img.shape) == 2:
        return cv.cvtColor(img, cv.COLOR_GRAY2BGR)
    return img

# 在拆分分量后统一调用转换
# 以-XYZ分支为例
if option == '-XYZ':
    img_converted = cv.cvtColor(img_original,cv.COLOR_BGR2XYZ)
    c1,c2,c3 = cv.split(img_converted)
# ... 其余分支保持拆分逻辑不变

# 统一转换为3通道
c1 = to_3channel(c1)
c2 = to_3channel(c2)
c3 = to_3channel(c3)

修改后,所有用于拼接的图像都是3通道BGR格式,宽高和类型完全一致,即可正常执行拼接操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:15:32