想要求得一个图像中轮廓的椭圆拟合 代码如下:
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);
}
}
}

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

被折叠的 条评论
为什么被折叠?



