使用OpenCV加载Caffe模型时遇"FAILED: fs.is_open()"错误的技术求助
问题分析与解决方法
核心问题原因
- 变量未定义先调用:代码第一行就执行
cv2.imwrite('colorized_image.jpg', output),此时output还没生成,直接报NameError。 - 函数调用语法错误:
blob = cv2.dnn.blobFromImage后换行写参数,导致blob被赋值为函数对象而非执行结果,后续net.setInput(blob)会因输入类型不匹配报错。 - 色彩空间逻辑缺失:原代码直接用灰度图生成blob,但该预训练模型要求输入为Lab色彩空间的L通道,且需将模型输出的ab通道与原图像L通道合并才能生成完整彩色图。
- 输出尺寸未匹配原图:模型输出固定为224x224,未缩放回原图像尺寸,最终生成的图像大小会和原图不一致。
修正后的完整代码
import cv2 import numpy as np # 加载预训练的Caffe模型 net = cv2.dnn.readNetFromCaffe('colorization_deploy_v2.prototxt', 'colorization_release_v2.caffemodel') # 读取黑白图像,先校验是否读取成功 image = cv2.imread('bw_image.jpg') if image is None: raise ValueError("图像读取失败,请确认文件路径是否正确") # 处理单通道灰度图:转为3通道BGR,再转Lab色彩空间 if len(image.shape) == 2: image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2Lab) L_channel = lab_image[:, :, 0] # 提取亮度通道L # 生成模型输入的blob,模型要求L通道均值为50.0 blob = cv2.dnn.blobFromImage(L_channel, 1.0, (224, 224), (50.0,), swapRB=False, crop=False) net.setInput(blob) # 推理得到ab颜色通道,调整维度顺序并缩放回原图尺寸 ab_channels = net.forward()[0, :, :, :].transpose((1, 2, 0)) ab_channels = cv2.resize(ab_channels, (image.shape[1], image.shape[0])) # 合并L通道与ab通道,转BGR色彩空间得到彩色图 result_lab = np.concatenate((L_channel[:, :, np.newaxis], ab_channels), axis=2) colorized_image = cv2.cvtColor(result_lab, cv2.COLOR_Lab2BGR) # 保存最终上色后的图像 cv2.imwrite('colorized_image.jpg', colorized_image)
关键修正说明
- 调整执行顺序:把模型加载、图像读取、推理等步骤移到
imwrite之前,确保要保存的图像变量已生成。 - 修复函数调用:将
blobFromImage的参数与函数名写在同一行,正确生成模型所需的输入blob。 - 完善色彩空间处理:
- 先把单通道灰度图转为3通道BGR,再转为Lab空间提取L通道作为模型输入。
- 将模型输出的ab通道缩放回原图尺寸,再与原L通道合并,还原完整彩色图像。
- 增加图像校验:添加
image is None的判断,提前排查图像读取失败的情况。
内容的提问来源于stack exchange,提问作者Mobina
相关产品推荐
相关产品推荐

