تشخیص میزان دایروی بودن ماسک - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تشخیص میزان دایروی بودن ماسک

+3 امتیاز

سلام.

به تصویر زیر نگاه کنید.آیا روشی وجود داره که میزان دایروی بودن هر یک از blob ها را محاسبه کرد؟

 

c++, opencv, الگوریتم, ریاضی, پردازش تصویر

 

سوال شده شهریور 5, 1393  بوسیله ی مریم اکرمی (امتیاز 482)   26 55 66
ویرایش شده دی 30, 1393 بوسیله ی haniye sarbazi
اگه تو صفحه یه دایره و یه شکل غیر دایره ای داشته باشیم که محیطشون برابر باشه، مساحت دایره همیشه بزرگ تر از مساحت اون یکی شکله... شاید بتونی از نسبت مساحت به محیط در تشخیص میزان دایروی بودن استفاده کنی...

1 پاسخ

+3 امتیاز
 
بهترین پاسخ

برای محاسبه ضریب دایروی بودن ابتدا کاانتورها را در تصویر بدست آورده سپس مرکز ثقل هریک از کانتورها را محاسبه وبعد ار آن محاسبه فاصله هر نقطه تا مرکز ثقل و در انتها از مجموعه فواصل انحراف معیار بگیرید نقاطی که دارای انحراف از معیار کمتری باشند یعنی به شکل دایروی نزدیک هستند.

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

c++, opencv, الگوریتم, ریاضی, پردازش تصویر

پاسخ داده شده شهریور 6, 1393 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
ویرایش شده دی 30, 1393 بوسیله ی haniye sarbazi
...