首次在VS2019用C++的OpenCV DNN加载Darknet模型时遇std::bad_alloc异常
解决OpenCV DNN加载Darknet模型时的std::bad_alloc异常
可能的原因及解决方案
1. 模型文件路径错误
readNetFromDarknet找不到指定的.cfg或.weights文件时,可能会触发内存分配异常(而非明确的文件不存在错误)。
- 确认
yolov4-tiny.cfg和yolov4-tiny.weights文件路径正确:- 直接使用绝对路径,比如:
cv::dnn::Net net = cv::dnn::readNetFromDarknet("D:/models/yolov4-tiny.cfg", "D:/models/yolov4-tiny.weights"); - 若用相对路径,必须将文件放在项目的输出目录下(比如Debug/Release文件夹),而非源码目录。
- 直接使用绝对路径,比如:
2. OpenCV与模型版本不兼容
不同版本的OpenCV对Darknet模型的支持有差异,yolov4-tiny这类模型对OpenCV版本有要求:
- 升级OpenCV到4.5.x及以上版本,该版本对yolov4系列模型支持更完善。
- 确保下载的模型是官方标准版本,不要使用修改过的非兼容格式。
3. 编译平台或内存问题
- 若当前用32位编译环境,立即切换到64位平台编译:32位程序最大仅能使用约2GB内存,加载模型时极易触发内存分配失败。
- 关闭系统中占用大量内存的程序,释放足够内存后重新运行项目。
4. OpenCV编译配置问题
- 确认你的OpenCV版本包含DNN模块:预编译版本默认带DNN,若自定义编译需手动勾选DNN选项。
- 保证项目的运行时库(Debug用MDd,Release用MD)与OpenCV编译时的运行时库完全一致。
调试建议
在加载模型前添加文件存在性检查,提前排查路径问题:
#include <fstream> // ... std::ifstream cfgFile("yolov4-tiny.cfg"); std::ifstream weightsFile("yolov4-tiny.weights"); if (!cfgFile.is_open()) { std::cerr << "cfg文件不存在或无法打开" << std::endl; return -1; } if (!weightsFile.is_open()) { std::cerr << "weights文件不存在或无法打开" << std::endl; return -1; } cfgFile.close(); weightsFile.close(); cv::dnn::Net net = cv::dnn::readNetFromDarknet("yolov4-tiny.cfg", "yolov4-tiny.weights");
内容的提问来源于stack exchange,提问作者Semas
相关产品推荐
相关产品推荐

