使用的版本:
Opencv:3.4.12,release版本
VS:vs2013
示例程序如下:
void tempfunc(Mat img)
{
double thr_v;
if (img.depth() == CV_16U)
{
img.convertTo(img, CV_8U, 1.0 / 257);
}
Mat thr_m;
vector< vector< Point>> contours;
thr_v = cv::threshold(img, thr_m, 0, 255, cv::THRESH_BINARY_INV + cv::THRESH_OTSU);
cv::findContours(thr_m, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
}
异常现象:
(1)在含有调用findContours语句的函数内,程序可正常运行,但是跳出该函数时,程序异常崩溃;
(2)如果将项目属性的优化设置为禁止,可以看到,程序异常时,停留在 deallocate处,推测是在释放findContours语句使用的vector< vector< Point>> contours变量时,出现异常。
(3)若将该变量设置为全局变量,则不出现异常(因为不涉及到内存释放)
(4)该项目是VS2013,如果使用VS2015,可以正常运行。
按网友提供的办法尝试解决:
(1)变量定义时,加修饰cv::vector和cv::Point,未解决。
(2)项目-属性-配置属性-C/C++代码生成-运行库,将其改为“多线程调试(/MTd),未解决。
(3)变量的定义修改为vector< Mat> contours;未解决(当找到的的轮廓较多时,仍旧异常)
(4)变量定义修改为vector< Mat> contours(100);未解决
网友的提醒:
(1)“contours变量的vector空间 是在 opencv的库里申请的, 而自动释放是在你的代码里。虽然都叫vector, 但只要它不是在一个电脑上编译的就会有区别”
(2)“只能说vector这种东西设计得和X一样,版本不一致就兼容不了。你的代码和opencv的库编译方式不一致,就导致使用vector的释放异常。只有把opencv的源码放在工程里编译使用,才能在C++里无障碍的使用findcontour。”
猜测:
使用的opencv在编译时,可能不是选择的VS2013环境,导致编译后的dll文件在vs2013里使用出错(可能是在vs2015下编译的,所以可以在vs2015中正常使用)。
解决办法:
因本项目使用的是VS2013环境,所以确保在编译opencv时选择的是vs2013环境,将编译后的opencv文件放入工程中,上述问题得以解决。