Mat src_img, binary_img, dst_img;
int main()
{
src_img = imread("D:\\LessonWork\\yuan\\1.png", IMREAD_GRAYSCALE);
//灰度讀取,在讀入影像的同時進行色彩轉換,這可以提高運行速度并減少記憶體的使用
if (src_img.empty())
{
printf("could not load the image...\n");
return -1;
}
imshow("原圖", src_img);
// 影像二值化
threshold(src_img, binary_img, 0, 255, THRESH_BINARY | THRESH_OTSU);
imshow("二值影像", binary_img);
// 形態學操作
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1)); // 構建形態學操作的結構元
morphologyEx(binary_img, dst_img, MORPH_CLOSE, kernel, Point(-1, -1)); //閉操作
imshow("閉操作", dst_img);
kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1)); // 構建形態學操作的結構元
morphologyEx(dst_img, dst_img, MORPH_OPEN, kernel, Point(-1, -1)); //開操作
imshow("開操作", dst_img);
// 尋找輪廓
vector<vector<Point>> contours;
vector<Vec4i> hireachy;
findContours(dst_img, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());
Mat result_img = Mat::zeros(src_img.size(), CV_8UC3); // 創建與原圖同大小的黑色背景
Point circle_center; //定義圓心坐標
for (auto t = 0; t < contours.size(); ++t)
{
// 面積過濾
double area = contourArea(contours[t]); //計算點集所圍區域的面積
if (area < 100) //曬選出輪廓面積大于100的輪廓
continue;
// 橫縱比過濾
Rect rect = boundingRect(contours[t]); // 求點集的最小直立外包矩形
float ratio = float(rect.width) / float(rect.height); //求出寬高比
if (ratio < 1.1 && ratio > 0.9) //因為圓的外接直立矩形肯定近似于一個正方形,因此寬高比接近1.0
{
drawContours(result_img, contours, t, Scalar(0, 0, 255), -1, 8, Mat(), 0, Point()); //在黑色背景圖上畫出圓
printf("圓的面積: %f\n", area);
double arc_length = arcLength(contours[t], true); //計算點集所圍區域的周長
printf("圓的周長 : %f\n", arc_length);
int x = rect.x + rect.width / 2;
int y = rect.y + rect.height / 2;
circle_center = Point(x, y); //得到圓心坐標
cout << "圓心坐標:" << "寬" << circle_center.x << " " << "高" << circle_center.y << endl;
circle(result_img, circle_center, 2, Scalar(0, 255, 255), 2, 8, 0);
}
}
imshow("結果", result_img);
Mat circle_img = src_img.clone();
cvtColor(circle_img, circle_img, COLOR_GRAY2BGR); //灰度圖轉化為彩色圖
circle(circle_img, circle_center, 2, Scalar(0, 0, 255), 2, 8, 0); //在原圖上畫出圓心
imshow("最終結果", circle_img);
waitKey(0);
return 0;
}
為啥這個只能在原圖上畫出一個圓心呀,我剛學這個
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/283675.html
標籤:圖形處理/算法
