使用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
相关产品推荐
相关产品推荐

