1. 程式人生 > >opencv3霍夫圓變換-HoughCircles函式

opencv3霍夫圓變換-HoughCircles函式

#include<iostream>
#include<opencv2/opencv.hpp>
#include<vector>

using namespace std;
using namespace cv;

int g_CannyThred = 180, g_CannyP = 0, g_CannySize = 0, g_HoughThred = 105, g_HoughThick = 9;
int g_Blue = 255, g_Green = 255, g_Red = 0;
int g_nWay = 0;
int g_nHoughLineMax = 10, g_nHoughLineMin = 50;

int g_nDp = 0;
int g_nMinDist = 5;
int g_nMinRadius = 0, g_nMaxRadius = 0;

int main()
{
	Mat srcImage = imread("1.jpg");
	imshow("【原圖】", srcImage);

	Mat grayImage;
	cvtColor(srcImage, grayImage, CV_BGR2GRAY);
	GaussianBlur(grayImage, grayImage, Size(9, 9), 2, 2);

	Mat cannyImage;
	vector<Vec3f> circles;

	namedWindow("【滾動條視窗】", 0);
	createTrackbar("dp", "【滾動條視窗】", &g_nDp, 100, 0);
	createTrackbar("MinDist", "【滾動條視窗】", &g_nMinDist, 100, 0);
	createTrackbar("CannyThred", "【滾動條視窗】", &g_CannyThred, 300, 0);
	createTrackbar("HoughThred", "【滾動條視窗】", &g_HoughThred, 255, 0);
	createTrackbar("Blue", "【滾動條視窗】", &g_Blue, 255, 0);
	createTrackbar("Green", "【滾動條視窗】", &g_Green, 255, 0);
	createTrackbar("Red", "【滾動條視窗】", &g_Red, 255, 0);
	createTrackbar("Bgr/Gray", "【滾動條視窗】", &g_nWay, 1, 0);
	createTrackbar("HoughThred", "【滾動條視窗】", &g_HoughThred, 200, 0);
	createTrackbar("MinRadius", "【滾動條視窗】", &g_nMinRadius, 100, 0);
	createTrackbar("MaxRadius", "【滾動條視窗】", &g_nMaxRadius, 100, 0);
	createTrackbar("HoughThick", "【滾動條視窗】", &g_HoughThick, 100, 0);

	char key;
	Mat dstImage;
	while (1)
	{
		HoughCircles(grayImage, circles, CV_HOUGH_GRADIENT, (double)((g_nDp + 1.5)), (double)g_nMinDist + 1
			, (double)g_CannyThred + 1, g_HoughThred + 1, g_nMinRadius, g_nMaxRadius);

		/*HoughCircles(grayImage, circles, CV_HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);*/

		//顯示線段
		for (size_t i = 0; i < circles.size(); i++)
		{
			if (g_nWay)
				grayImage.copyTo(dstImage);
			else
				srcImage.copyTo(dstImage);

			circle(dstImage, Point(cvRound(circles[i][0]), cvRound(circles[i][1])), cvRound(circles[i][2])
				, Scalar(g_Blue, g_Green, g_Red), g_HoughThick);
		}

		imshow("【處理後】", dstImage);

		key = waitKey(1);
		if (key == 27)
			break;
	}

	return 0;
}