opencv_ex21-灰階圖像可調式邊緣檢測Canny、圖像複製clone()、圖像複製copyTo(…)、偵測圓HoughCircles、畫圓circle、畫筆顏色變數Scalar
opencv_ex21-灰階圖像可調式邊緣檢測Canny、圖像複製clone()、圖像複製copyTo(…)、偵測圓HoughCircles、畫圓circle、畫筆顏色變數Scalar
GITHUB: https://github.com/jash-git/CPP_opencv249_ex
OpenCV 偵測圓
void HoughCircles(InputArray image, OutputArray circles, int method, double dp, double minDist, double param1=100, doubleparam2=100, int minRadius=0, int maxRadius=0)
image:輸入圖,8位元單通道圖。
circles:以vector< Vec3f >記錄所有圓的資訊,每個Vec3f紀錄一個圓的資訊,包含3個浮點數資料,分別表示x、y、radius。
method:偵測圓的方法,目前只能使用CV_HOUGH_GRADIENT。
dp:偵測解析度倒數比例,假設dp=1,偵測圖和輸入圖尺寸相同,假設dp=2,偵測圖長和寬皆為輸入圖的一半。
minDist:圓彼此間的最短距離,太小的話可能會把鄰近的幾個圓視為一個,太大的話可能會錯過某些圓。
param1:圓偵測內部會呼叫Canny()尋找邊界,param1就是Canny()的高閾值,低閾值自動設為此值的一半。
param2:計數閾值,超過此值的圓才會存入circles。-調整重要參數
minRadius:最小的圓半徑。
maxRadius:最大的圓半徑。
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/ml/ml.hpp> #include <iostream> #include <cstdio> #include <sys/timeb.h> #if defined(WIN32) #define TIMEB _timeb #define ftime _ftime typedef __int64 TIME_T; #else #define TIMEB timeb typedef long long TIME_T; #endif using namespace cv; using namespace std; Mat src;//input image void Pause() { printf("Press Enter key to continue..."); fgetc(stdin); } int main() { Mat input; input = imread("hough02.png"); if (!input.data) { printf("could not load image...\n"); } else { src=input.clone(); char INPUT_TITLE[] = "input image"; char OUTPUT_TITLE[] = "hough circle demo"; namedWindow(INPUT_TITLE, CV_WINDOW_AUTOSIZE); namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE); imshow(INPUT_TITLE, src); Mat src_gray,dst; Canny(src, src_gray, 150, 200); imshow("edge image", src_gray); /* OpenCV 偵測圓 void HoughCircles(InputArray image, OutputArray circles, int method, double dp, double minDist, double param1=100, doubleparam2=100, int minRadius=0, int maxRadius=0) image:輸入圖,8位元單通道圖。 circles:以vector< Vec3f >記錄所有圓的資訊,每個Vec3f紀錄一個圓的資訊,包含3個浮點數資料,分別表示x、y、radius。 method:偵測圓的方法,目前只能使用CV_HOUGH_GRADIENT。 dp:偵測解析度倒數比例,假設dp=1,偵測圖和輸入圖尺寸相同,假設dp=2,偵測圖長和寬皆為輸入圖的一半。 minDist:圓彼此間的最短距離,太小的話可能會把鄰近的幾個圓視為一個,太大的話可能會錯過某些圓。 param1:圓偵測內部會呼叫Canny()尋找邊界,param1就是Canny()的高閾值,低閾值自動設為此值的一半。 param2:計數閾值,超過此值的圓才會存入circles。-調整重要參數 minRadius:最小的圓半徑。 maxRadius:最大的圓半徑。 */ vector<Vec3f> pcircles; HoughCircles(src_gray, pcircles, CV_HOUGH_GRADIENT, 1, 3, 100, 23, 5, 50); src.copyTo(dst); for (size_t i = 0; i < pcircles.size(); i++) { Vec3f cc = pcircles[i]; circle(dst, Point(cc[0], cc[1]), cc[2], Scalar(0, 0, 255), 2, CV_AA);//圓周 circle(dst, Point(cc[0], cc[1]), 2, Scalar(198, 23, 155), 2, CV_AA);//圓心 } imshow(OUTPUT_TITLE, dst); } waitKey(0); Pause(); return 0; }