OpenCV 3.1.0中std::vector传入OutputArray参数异常求助
解决OpenCV 3.1.0中std::vector作为OutputArray参数时的垃圾数据/崩溃问题
我之前在OpenCV 3.x版本里也踩过这个OutputArray和std::vector配合的坑,你的情况大概率是OpenCV 3.1.0对std::vector的OutputArray处理存在版本bug,或者是传递空向量时的内存初始化逻辑有问题,导致函数写入了错误的内存区域,进而出现垃圾数据甚至崩溃。而cv::Mat本身有完善的内存管理机制,所以能正常运行,这也完全符合你观察到的现象。
可能的原因分析
- OpenCV 3.1.0的OutputArray在处理空std::vector时,没有正确触发向量的内存扩容逻辑,反而直接往未分配的内存地址写入数据,导致内存越界。
- 部分OpenCV函数在接收std::vector作为OutputArray时,会默认认为向量已经预分配了足够的空间,不会自动为其分配内存,这和std::vector的常规行为不符,属于版本缺陷。
可行的解决方案
1. 显式初始化std::vector的大小
在调用目标函数前,根据预期的输出结果大小提前resize你的向量。比如你预期输出大小为0,就显式把向量resize到0:
std::vector<cv::Vec4i> vec; vec.resize(0); // 显式初始化内存空间 cv::HoughLinesP(your_input_img, vec, 1, CV_PI/180, 50, 30, 10);
这样OpenCV函数写入时就会使用已分配的合法内存,不会出现垃圾数据或崩溃。
2. 升级OpenCV版本
这个bug在OpenCV 3.2.0及以后的版本中已经被官方修复了。如果你的项目允许,直接升级到3.4.x或者4.x版本,不仅能解决这个问题,还能获得更好的性能和更多新特性。
3. 用cv::Mat中转(临时方案)
如果暂时没法升级版本,也可以先用cv::Mat接收函数输出,再转成std::vector,利用cv::Mat稳定的内存管理规避问题:
cv::Mat mat_result; cv::HoughLinesP(your_input_img, mat_result, 1, CV_PI/180, 50, 30, 10); std::vector<cv::Vec4i> vec; mat_result.copyTo(vec); // 将Mat数据复制到vector中
补充说明
针对你提到的“VEC预期大小应为0”的情况,用方案1显式resize到0后,向量就能保持正确的空状态,不会被写入垃圾数据。如果是其他预期大小,只要提前resize到对应数值即可。
内容的提问来源于stack exchange,提问作者krial
相关产品推荐
相关产品推荐

