c++ OpenCV 霍夫变换检测圆 HoughCircles

c++ OpenCV 霍夫变换检测圆 HoughCircles

#include <iostream>
#include <filesystem>
#include <string>
#include <windows.h>
#include <opencv2/opencv.hpp>

namespace fs = std::filesystem;
using namespace cv;
using namespace std;

// 霍夫变换检测圆
void houghCircles()
{
	cv::Mat src;
	src = cv::imread("F:/opencv/console/x64/Debug/circle.png");

	cv::imshow("input", src);

	cv::Mat temp, gray, dst;

	//cv::bitwise_not(src, src);

	cv::medianBlur(src, temp, 3); // 中值滤波去除噪声

	cv::cvtColor(temp, gray, cv::COLOR_BGR2GRAY); // 灰度化

	// 霍夫圆检测
	std::vector circles;
	/*
	参数说明:

	cv::InputArray image:表示输入图像。
	cv::OutputArray circles:圆的参数,包含圆心坐标和圆的半径。
	int method:采用的检测方法,默认使用霍夫梯度法。
	double dp:累加器分辨率与图像分辨率的反比。dp = 1表示累加器具有与输入图像相同的分辨率。
	double minDist:标新两个圆心之间的最小距离。
	double param1 = (100.0):表示边缘检测对应的参数。对于霍夫梯度法而言,表示为传递给canny边缘检测算子的高阈值,而低阈值则为高阈值的一半。
	double param2 = (100.0):表示检测方法对应的参数。对于霍夫梯度法而言,表示在检测阶段圆心的累加器阈值。参数值越小就越可以检测出更多不存在的圆。
	int minRadius = 0:表示半径的最小值。
	int maxRadius = 0:表示半径的最大值。
	*/

	cv::HoughCircles(gray, circles, cv::HOUGH_GRADIENT, 1, 10, 100, 100, 1, 100);

	src.copyTo(dst);
	for (size_t i = 0; i < circles.size(); i++) {
		cv::Vec3f cc = circles[i]; // cc[0] -> x  cc[1] -> y  cc[2] -> r
		cv::circle(dst, cv::Point(cc[0], cc[1]), cc[2], cv::Scalar(0, 0, 255), 2, cv::LINE_AA); // 可视化圆弧 
		cv::circle(dst, cv::Point(cc[0], cc[1]), 1, cv::Scalar(0, 0, 255), 2, cv::LINE_AA); // 可视化圆心
	}
	cv::imshow("output", dst);
}

int main()
{
    // 霍夫变换检测圆
    houghCircles();

    waitKey(0);
    destroyAllWindows();
    return 0;
}

 

发表回复

您的电子邮箱地址不会被公开。