برای محاسبه ضریب دایروی بودن ابتدا کاانتورها را در تصویر بدست آورده سپس مرکز ثقل هریک از کانتورها را محاسبه وبعد ار آن محاسبه فاصله هر نقطه تا مرکز ثقل و در انتها از مجموعه فواصل انحراف معیار بگیرید نقاطی که دارای انحراف از معیار کمتری باشند یعنی به شکل دایروی نزدیک هستند.
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Point massOfcenter(const vector<Point>& contour){
Moments mu = moments(contour, false);
return Point(mu.m10 / mu.m00, mu.m01 / mu.m00);
}
vector<int> getRadiuses(const vector<Point>& contour,const Point& center){
vector<int> result;
result.reserve(contour.size());
for (auto& pnt : contour)
result.push_back((int)norm(pnt - center));
return result;
}
float circularity(const vector<Point>& contour,const Point& center){
vector<int> radiuses = getRadiuses(contour, center);
Scalar me_val, std_dev_val;
meanStdDev(Mat(radiuses), me_val, std_dev_val);
return std_dev_val.val[0];
}
int _tmain(int argc, _TCHAR* argv[])
{
Mat color_img = imread("d:/test.png", 1);
Mat gray_img;
cvtColor(color_img, gray_img, CV_BGR2GRAY);
vector<vector<Point>> contours;
findContours(gray_img, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
vector<Moments> mu(contours.size());
vector<Point> mc(contours.size());
for (int i = 0; i < contours.size(); i++){
Point center = massOfcenter(contours[i]);
float circularity_cofi = circularity(contours[i], center);
stringstream ss;
ss << circularity_cofi;
putText(color_img, ss.str(), center, 1, 1, CV_RGB(255, 0, 0), 1);
}
imshow("view", color_img);
waitKey(0);
}