opencv_ex21-灰階圖像可調式邊緣檢測Canny、圖像複製clone()、圖像複製copyTo(…)、偵測圓HoughCircles、畫圓circle、畫筆顏色變數Scalar

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;
}

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *