想要求得一個圖像中輪廓的橢圓拟合 代碼如下:
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);
}
}
複制
處理部分圖檔時發現異常:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcuEmZmZDNyATZzAzNjZ2NwITZ3EjNzQmN5IjMzYWOwEDZvwlMyUzN0ETMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
調試程式時發現:某個輪廓内的像素點個數隻有四個
說明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);
}
}
}
複制