天天看點

OpenCV 應用fitEllipse函數一種異常問題分析

想要求得一個圖像中輪廓的橢圓拟合 代碼如下:

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

}            

複制

處理部分圖檔時發現異常:

OpenCV 應用fitEllipse函數一種異常問題分析

調試程式時發現:某個輪廓内的像素點個數隻有四個

OpenCV 應用fitEllipse函數一種異常問題分析

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

}            

複制