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

