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

OpenCV4.5.5 C++下DnnSuperResImpl调用readModel报错

OpenCV dnn模块加载EDSR模型报GraphDef解析错误的修复方案

核心诱发原因

  • 模型文件无效:本地存储的EDSR模型文件体积仅200KB左右,远小于官方模型的实际体积(EDSR_x3约9.8MB、EDSR_x4约15.3MB)。该仓库的模型使用Git LFS存储,直接在网页端右键另存为、或未安装Git LFS直接拉取仓库,得到的是LFS指针文件/网页预览页的HTML文件,并非合法的TensorFlow冻结图二进制文件,无法被protobuf解析。
  • 文件名大小写不匹配:加载代码中写的是EDSR_X4.pb(X为大写),但实际磁盘文件名为EDSR_x4.pb(x为小写),开启盘符大小写敏感、或跨平台编译时会直接读取失败。
  • 版本不兼容:编译时使用的OpenCV主版本为4.5.5,但集成的opencv_contrib是4.x开发分支,两者版本不匹配会导致dnn模块的TensorFlow解析逻辑存在protobuf版本、接口定义差异,触发解析错误。

修复步骤

  • 获取正确的模型文件:安装Git LFS后重新拉取仓库,拿到完整的二进制模型文件;或在模型文件的网页预览页点击原始文件下载按钮(不要直接右键另存为预览链接),下载完成后核对文件大小,符合上述体积范围再使用。
  • 修正文件名拼写:统一代码中路径字符串和实际文件名的大小写,将EDSR_X4.pb修改为EDSR_x4.pb,避免拼写错误。
  • 重新编译匹配版本的OpenCV:将opencv_contrib源码替换为4.5.5对应版本,清空之前的CMake编译缓存后重新编译安装,保证主模块和扩展模块版本完全一致。
  • 补全模型初始化逻辑:加载模型文件后必须调用setModel方法指定模型类型和缩放系数,否则后续推理也会异常。

正确调用示例代码

#include <opencv2/dnn_superres.hpp>
#include <opencv2/imgcodecs.hpp>

int main() {
    cv::dnn_superres::DnnSuperResImpl sr;
    // 替换为你的模型实际路径,注意大小写
    sr.readModel("EDSR_x4.pb");
    // x4模型传入缩放系数4,x3模型传入3
    sr.setModel("edsr", 4);

    cv::Mat input_img = cv::imread("input.png");
    cv::Mat super_res_img;
    sr.upsample(input_img, super_res_img);
    cv::imwrite("output_x4.png", super_res_img);
    return 0;
}

内容的提问来源于stack exchange,提问作者BoKuan Liu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:00:10