图像分割之轮廓拟合
基于opencv的图像拟合
包括 最小圆拟合、椭圆拟合、矩形拟合
下面展示一些 代码
。
void fitting(Mat &Src, Mat &Dst, int type)
{
int types = 0;
types = type;
//type 1:最小圆拟合,type 2:椭圆拟合,type 3:矩形拟合
vector< vector<Point> > contours;
vector<Vec4i> hiearachy;
Mat src_cp = Src;
findContours(src_cp, contours, hiearachy, RETR_LIST, CHAIN_APPROX_NONE);
if (types == 1)//得到最小的圆
{
vector<Point2f> circleCenters(contours.size());//存储圆心点集
vector<float> circleRadius(contours.size());//存储半径点集
for (int i = 0; i < contours.size(); i++)
{
minEnclosingCircle(contours[i], circleCenters[i], circleRadius[i]);
circle(Dst, circleCenters[i], circleRadius[i] , Scalar(0), 3, 8);
cout << "圆得半径" << circleRadius[i] << endl;
}
}
if (types == 2)//得到最小拟合椭圆
{
for (int i = 0; i < contours.size(); i++)
{
Mat pointsf;
Mat(contours[i]).convertTo(pointsf, CV_32F);
RotatedRect box = fitEllipse(pointsf);
if (MAX(box.size.width, box.size.height) > MIN(box.size.width, box.size.height) * 8)
continue;
//绘制椭圆
ellipse(Dst, box, Scalar(0, 0, 255), 1, CV_AA);
}
}
if (types == 3)//得到最小拟合矩形
{
for (int i = 0; i < contours.size(); i++)
{
RotatedRect rect = minAreaRect(contours[i]);
Point2f P[4];
rect.points(P);
for (int j = 0; j <= 3; j++)
{
line(Dst, P[j], P[(j + 1) % 4], Scalar(255), 3);
}
}
}
}