OpenCV拉普拉斯金字塔重建报错:尺寸不匹配问题求助
问题分析与解决方案
错误原因
你遇到的cv::pyrUp_断言错误,本质是目标尺寸不符合OpenCVpyrUp的要求。该断言的核心逻辑是:
目标尺寸的宽/高与原尺寸宽/高的2倍之差的绝对值,必须等于目标尺寸宽/高的奇偶性(即差值只能是0或1,对应目标尺寸为偶数或奇数)
你的问题出在图像堆叠后的尺寸无法满足这个规则:
- 原图像的
height=200不是2的整数次幂倍数(比如你构建了6层金字塔,2^6=64,200无法被64整除),导致每次pyrDown后会出现非严格2倍的尺寸(比如第4次pyrDown后height变为13,第5次变为7)。 - 你将4张图像的拉普拉斯层垂直堆叠,把单张图像的尺寸差异放大了4倍:比如单张第5层拉普拉斯的height是7,堆叠后变为28;而单张第4层拉普拉斯的height是13,堆叠后变为52。
- 重建时,你尝试将28height的图像
pyrUp到52height:28*2=56,52与56的差是4,52是偶数(52%2=0),4≠0,直接触发断言错误。
解决方案
方案1:调整原图像尺寸为2的整数次幂倍数(推荐)
确保原图像的宽和高都是2n的倍数(n为金字塔层数,这里你用了6层,所以n=6,26=64),这样每次pyrDown和pyrUp的尺寸都是严格的2倍关系,不会出现奇数尺寸,堆叠后的尺寸也能完美匹配pyrUp的要求。
修改代码开头的宽高定义:
width = 768 # 768 = 64*12,64是2^6 height = 192 # 192 = 64*3
方案2:重建时动态匹配尺寸(兼容非2次幂尺寸)
如果无法修改原图像尺寸,可以先让pyrUp使用默认放大2倍的尺寸,再将拉普拉斯层resize到该尺寸后相加(会损失少量精度,但能解决错误):
修改#Reconstructed Faces部分的代码:
#Reconstructed Faces faces_reconstructed = faces_pyramid[0] for i in range(1, 6): # 先执行pyrUp,使用默认放大2倍的尺寸 faces_reconstructed = cv2.pyrUp(faces_reconstructed) # 将当前拉普拉斯层resize到pyrUp后的尺寸 target_size = (faces_reconstructed.shape[1], faces_reconstructed.shape[0]) current_laplacian = cv2.resize(faces_pyramid[i], target_size) # 相加合并 faces_reconstructed = cv2.add(current_laplacian, faces_reconstructed)
额外的小错误修复
你的代码最后一行cv2.imshow("Faces", faces)中的faces变量未定义,应该改为facestack:
cv2.imshow("Faces", facestack)
内容的提问来源于stack exchange,提问作者Luis Michael Luethi
相关产品推荐
相关产品推荐

