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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:21:15