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

本文介绍了一段用于图像处理的代码,该代码通过椭圆拟合算法来过滤图像中的轮廓。具体而言,它使用了fitEllipse函数来计算轮廓的椭圆参数,并通过检查轮廓的像素点数量来确保椭圆拟合的有效性。为了提高准确度,代码还加入了一个条件,即只有当轮廓的长轴与短轴的比例小于2时才进行填充。

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

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);
        }
}

} 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值