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

OpenCV C++调用readNetFromONNX无法读取Qt资源中ONNX文件

解决OpenCV无法读取Qt资源路径下ONNX模型的问题

问题分析

你使用Qt资源路径:/yolo/yolov8n.onnx调用cv::dnn::readNetFromONNX时出现读取失败错误,核心原因是OpenCV的文件读取函数不识别Qt特有的资源路径格式——:/开头的路径是Qt框架内部解析的资源标识,OpenCV直接调用系统文件IO无法访问这些资源。

解决方案

1. 先验证模型文件本身的有效性

先绕过Qt资源,直接用本地文件路径测试,确认模型文件没有损坏:

  • 将yolov8n.onnx放到程序的运行目录下(比如Debug/Release文件夹)
  • 修改加载代码为:
cv::dnn::Net net = cv::dnn::readNetFromONNX("./yolov8n.onnx");

如果能成功加载,说明模型文件本身没问题,问题出在Qt资源路径的处理上。

2. 将Qt资源文件导出为本地临时文件

因为OpenCV无法直接读取Qt资源,需要把资源中的模型文件复制到本地临时目录,再用临时路径加载:

// 从Qt资源复制模型到临时文件
QFile resourceFile(":/yolo/yolov8n.onnx");
QString tempPath = QDir::tempPath() + "/yolov8n_temp.onnx";

if (resourceFile.open(QIODevice::ReadOnly)) {
    QFile tempFile(tempPath);
    if (tempFile.open(QIODevice::WriteOnly)) {
        tempFile.write(resourceFile.readAll());
        tempFile.close();
    }
    resourceFile.close();
}

// 用临时文件路径加载模型
cv::dnn::Net net = cv::dnn::readNetFromONNX(tempPath.toStdString());

// 程序结束后可以删除临时文件(可选)
QFile::remove(tempPath);

3. 检查Qt资源配置是否正确

  • 确认.qrc资源文件中已正确添加模型:
    <RCC>
        <qresource prefix="/">
            <file>yolo/yolov8n.onnx</file>
        </qresource>
    </RCC>
    
  • 确保资源文件已添加到Qt项目的编译列表中,在.pro文件里有RESOURCES += your_resource.qrc

4. 升级OpenCV版本(可选)

你当前使用的是OpenCV 4.5.5-dev,YOLOv8的ONNX模型可能包含一些低版本OpenCV不支持的算子,升级到4.6.0及以上版本,不仅能提升模型兼容性,也可能解决部分文件读取相关的隐性问题。

内容的提问来源于stack exchange,提问作者akif tarakcı

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:25:01