问题描述:
使用Opencv3.2.0的cv::findContours函数出现如下错误,在做运动跟踪项目以及喷码识别就遇到了类似错误,没有在意;这次进行马赛克检测项目,又遇到了类似错误,有花费了一天时间,在此记录一下。
问题分析:
经查阅资料以及实验分析,得出这是因为contours变量经过cv::findContours函数,在函数内部进行了内存分配,即在opencv的dll所在的线程堆栈内,正常情况下应该由opencv内部进行内存释放,然而Opencv内部并无此释放内存函数。而在opencv外部的代码中对contours变量进行析构时,无法访问opencv的dll内部堆栈,从而导致了上图中的错误。经过实验令人感到奇怪的是,Debug版本的代码会出现上图中错误,而Release版本的代码不会出现上图中的错误,暂时未找出具体原因,待以后再进行分析。
//查找轮廓
cv::Mat hierarchy;
std::vector<std::vector<cv::Point>> contours(1000, std::vector<cv::Point>(1000));
cv::Mat resultImage = cv::Mat::zeros(matCannyFrame.size(), CV_8U);
cv::findContours(resultImage, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);//TREE:提取所有轮廓 NONE:画出轮廓所有点
另外,要想从本质上彻底解决此问题,可以修改opencv源码,加入析构std::vector<std::vector<cv::Point>>类型的函数,进行内部析构即可。