opencv 霍夫變換檢測圓


#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;


const int kvalue = 15;//雙邊濾波鄰域大小


int main()

{


Mat src_color=imread("1.jpg");



imshow("原圖-彩色", src_color);

//聲明一個三通道圖像,像素值全為0,用來將霍夫變換檢測出的圓畫在上面

Mat dst(src_color.size(), src_color.type());

dst = Scalar::all(0);


Mat src_gray;//彩色圖像轉化成灰度圖

cvtColor(src_color, src_gray, COLOR_BGR2GRAY);

imshow("原圖-灰度", src_gray);

imwrite("src_gray.png", src_gray);


Mat bf;//對灰度圖像進行雙邊濾波

bilateralFilter(src_gray, bf, kvalue, kvalue * 2, kvalue / 2);

imshow("灰度雙邊濾波處理", bf);

imwrite("src_bf.png", bf);


vector<Vec3f> circles;//聲明一個向量,保存檢測出的圓的圓心坐標和半徑

HoughCircles(bf, circles, CV_HOUGH_GRADIENT, 1.5, 20, 130, 38, 10, 50);//霍夫變換檢測圓


cout << "x=\ty=\tr=" << endl;

for (size_t i = 0; i < circles.size(); i++)//把霍夫變換檢測出的圓畫出來

{

Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));

int radius = cvRound(circles[i][2]);


circle(dst, center, 0, Scalar(0, 255, 0), -1, 8, 0);

circle(dst, center, radius, Scalar(0, 0, 255), 1, 8, 0);


cout << cvRound(circles[i][0]) << "\t" << cvRound(circles[i][1]) << "\t"

<< cvRound(circles[i][2]) << endl;//在控制臺輸出圓心坐標和半徑



}


imshow("特征提取", dst);

imwrite("dst.png", dst);


waitKey(0);


}

0 個評論

要回覆文章請先登錄註冊