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

