这两天真是恼火 在vs2010上写了个寻找最大轮廓的程序,可以使用,移到2015上不行 会遇到触发一个断点什么的 ,好,那就到2012上写,还是不行,没办法,去网上
找,发现很多人都有这种情况;
double area = cv::contourArea(contours[i]);
会莫名其妙的运行几次这个语句就崩溃了,打开监视一看,哇塞,findContours(dst, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); countours中的数据大的不可想象,又继续找,终于在网上找到了原因:环境变量path中有多个opencv的变量:
D:\open\build\x86\vc10\lib;
D:\open\build\x86\vc11\lib;
D:\open\build\x86\vc12\lib;
把多余的删掉,只留下D:\open\build\x86\vc12\lib;再运行,提示缺少.dll文件,网上一查,下载.dll文件解决,再运行,完美运行。
总算解决了这个bug,不过2010和2012都用不了opencv,只能用2015学习opencv了。
顺便贴上我的寻找最大联通区域的代码。
就这样了!!!!
<span style="white-space:pre"> </span>threshold(dst,dst, 254, 255.0, CV_THRESH_BINARY);
/*Mat dst = InfraredImage;*/
/* imshow("InfraredImage", InfraredImage);*/
findContours(dst, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
double maxArea = 0;
vector<cv::Point> maxContour;
for (size_t i = 0; i < contours.size(); i++)
{
double area = cv::contourArea(contours[i]);
if (area > maxArea)
{
maxArea = area;
maxContour = contours[i];
}
}
cv::Rect maxRect;
if (size(maxContour) != 0)
maxRect = cv::boundingRect(maxContour);
else
maxRect=Rect(0, 0, 0, 0);
// 显示连通域
cv::Mat result1, result2;
InfraredImage.copyTo(result1);
InfraredImage.copyTo(result2);
for (size_t i = 0; i < contours.size(); i++)
{
cv::Rect r = cv::boundingRect(contours[i]);
cv::rectangle(result1, r, cv::Scalar(255));
}
cv::imshow("all regions", result1);
/*cv::rectangle(result2, maxRect, cv::Scalar(255));*/
cv::rectangle(InfraredImage, maxRect, cv::Scalar(255));
/*cv::imshow("largest region", result2);*/
imshow("InfraredImage", InfraredImage);