您可以尝试以下操作:
- 对图像进行阈值处理
- 获取最大轮廓
- 找到包围此轮廓的最小面积圆
一旦找到中心和半径,注册就会变得更容易。如果快照之间的半径不同,则必须将所有圆形调整为预定义大小,并在注册阶段相应地调整中心。
我在OpenCV和C++中尝试了这个。
Mat im = imread(INPUT_FOLDER_PATH + string("SoFi_400_20141023_163450.jpg"));
Mat gray;
cvtColor(im, gray, CV_BGR2GRAY);
Mat bw;
threshold(gray, bw, 0, 255, CV_THRESH_BINARY|CV_THRESH_OTSU);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(bw, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
for(int idx = 0; idx >= 0; idx = hierarchy[idx][0])
{
Point2f center;
float radius;
minEnclosingCircle(contours[idx], center, radius);
cout << idx << " (" << center.x << ", " << center.y << ") : " << radius << endl;
circle(im, Point(center.x, center.y), radius, Scalar(0, 255, 255), 2);
}
imshow("", im);
waitKey();
一些结果:
![enter image description here](https://istack.dev59.com/xy9ye.webp)