int max = m.size();//max=10240
int n = 3;
int cout = 10000;
srand(time(NULL));
//开始找轮廓距离圆心的距离,再跟对应的半径比较
Point2f bj;//将轮廓中的坐标循环放到BJ中
int sum = 0;//记录满足坐标的个数
vector mb;//将满足的坐标放到mb中
float b, b1;
vector v1(3);
for (int i = 0; i < cout; i++)//count为得到的三个点的个数,也就是圆的个数,此处count设为10000
{
//vector v1(3);
for (int i = 0; i < n; i++)//此循环为随机得到在m里面的三个点集
{
int u = rand() % max;
v1[i] = m[u];//m为得到的轮廓的坐标集
}
IsPointInALine(v1[0], v1[1], v1[2]);//判断三点是否可以构成圆,是,返回true,不是,返回false
FindCircle(v1[0], v1[1], v1[2], centre, radius);//得出三点的圆心坐标与半径
sum = 0;
if (!((IsPointInALine(v1[0], v1[1], v1[2]))&&(70<radius<80)&&(54<radius<60)))
continue;//三点是否组成圆,是,则找与该圆心距离为其半径的点
for (int j = 0; j < max; j++)//max为m点集的个数m.size()
{
bj = m[j];
b1 = (float)(sqrt((bj.x - centre.x)*(bj.x - centre.x) + (bj.y - centre.y)*(bj.y - centre.y)));
b = fabs(b1 - radius);
if (b <= 1)
sum += 1;
float zc;
zc = 4/3*PI*radius;
if (sum>zc)
{
mb.push_back(Point3f(centre.x, centre.y, radius));
circle(image, centre, radius, Scalar(155, 50,255));
break;
}
}
}