OpenCV 应用fitEllipse函数一种异常问题分析

来源:互联网 发布:安东尼·霍普金斯 知乎 编辑:程序博客网 时间:2024/06/05 07:19

想要求得一个图像中轮廓的椭圆拟合 代码如下:

for(int k = 0; k < (int)threecontours.size(); k++)         { RotatedRect rRect = fitEllipse(threecontours.at(k)); double majorAxis = rRect.size.height > rRect.size.width ? rRect.size.height : rRect.size.width;double minorAxis = rRect.size.height > rRect.size.width ? rRect.size.width : rRect.size.height;float rate = majorAxis/minorAxis;    if (rate<2)   //滤除长短轴小于2的轮廓    {    drawContours(g_EllipseFilter, threecontours, k, Scalar(0), CV_FILLED);}} 

处理部分图片时发现异常:
这里写图片描述
调试程序时发现:某个轮廓内的像素点个数只有四个
这里写图片描述
说明fitEllipse函数要求轮廓的像素点个数大于等于5个,可以将代码修改为:

for(int k = 0; k < (int)threecontours.size(); k++)    //查找轮廓      {if (int(threecontours.at(k).size()) <=6){drawContours(g_EllipseFilter, threecontours, k, Scalar(0), CV_FILLED);}else{RotatedRect rRect = fitEllipse(threecontours.at(k)); double majorAxis = rRect.size.height > rRect.size.width ? rRect.size.height : rRect.size.width;double minorAxis = rRect.size.height > rRect.size.width ? rRect.size.width : rRect.size.height;float rate = majorAxis/minorAxis;                if (rate<2)   //滤除长短轴小于2的轮廓            {    drawContours(g_EllipseFilter, threecontours, k, Scalar(0), CV_FILLED);        }}} 
2 0