Opencv3從頭開始(七)霍夫線、霍夫圓檢測

Opencv3從頭開始(七)霍夫線、霍夫圓檢測

霍夫線變換\標準霍夫線、多尺度霍夫線、累計概率霍夫線

標準霍夫線

	Mat image_stard=image.clone();
    vector<Vec2f> lines_stard;
    //line包含rho和theta
    HoughLines(image_canny,lines_stard,1,CV_PI/180,100,1,1);
    for(size_t i = 0;i<lines_stard.size();i++){
        float rho=lines_stard[i][0],theta=lines_stard[i][1];
        Point p1, p2;
		double p_x = cos(theta)*rho, p_y = sin(theta)*rho;
		p1.x = cvRound(p_x + 1000*(-sin(theta)));
		p1.y = cvRound(p_y + 1000*(cos(theta)));
		p2.x = cvRound(p_x - 1000*(-sin(theta)));
		p2.y = cvRound(p_y - 1000*(cos(theta)));
		line( image_stard, p1, p2, Scalar(0,0,255), 1, CV_AA);
    }
    imshow("標準霍夫線檢測",image_stard);

在這裏插入圖片描述
累計概率霍夫線

 //累計概率霍夫變換
    Mat image_line=image.clone();
    vector<Vec4i> lines;
	HoughLinesP(image_canny, lines, 1, CV_PI/180, 80, 50, 10 );
	for( size_t i = 0; i < lines.size(); i++ )
	{
		Vec4i l = lines[i];
		line( image_line, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,255,0), 1, CV_AA);
	}
    imshow("累計霍夫線檢測",image_line);

在這裏插入圖片描述
霍夫圓檢測
第五個參數:檢測圓最小距離
最後兩個參數:最小最大圓

//霍夫圓檢測
    Mat image_circle=image.clone();
    vector<Vec3f> circles;
	HoughCircles( image_canny, circles, CV_HOUGH_GRADIENT,1, 100, 40, 40, 200, 1000 );
	for( size_t i = 0; i < circles.size(); i++ )
	{
		Vec3f c = circles[i];
        circle(image_circle, Point(c[0], c[1]), c[2], Scalar(0, 0, 255), 2, LINE_AA);
		circle(image_circle, Point(c[0], c[1]), 2, Scalar(0, 255, 0), 2, LINE_AA);
	}
    imshow("霍夫圓檢測",image_circle);

在這裏插入圖片描述

在這裏插入圖片描述代碼如下:

/*
霍夫變換、霍夫線圓檢測
*/

#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>

using namespace std;
using namespace cv;

int main(int argc, char* argv[]){
    Mat image=imread("鐘錶.jpg");
    Mat image_gray,image_thre,image_canny;
    //二值化
    cvtColor(image,image_gray,COLOR_BGR2GRAY);
    threshold(image_gray,image_thre,125,255,THRESH_BINARY);
    imshow("鐘錶",image);
    imshow("鐘錶黑白",image_thre);
    Canny(image_thre,image_canny,125,200);
    imshow("鐘錶邊緣",image_canny);
    //霍夫線變換
        //標準霍夫變換
        //多尺度霍夫變換
    Mat image_stard=image.clone();
    vector<Vec2f> lines_stard;
    //line包含rho和theta
    HoughLines(image_canny,lines_stard,1,CV_PI/180,100,1,1);
    for(size_t i = 0;i<lines_stard.size();i++){
        float rho=lines_stard[i][0],theta=lines_stard[i][1];
        Point p1, p2;
		double p_x = cos(theta)*rho, p_y = sin(theta)*rho;
		p1.x = cvRound(p_x + 1000*(-sin(theta)));
		p1.y = cvRound(p_y + 1000*(cos(theta)));
		p2.x = cvRound(p_x - 1000*(-sin(theta)));
		p2.y = cvRound(p_y - 1000*(cos(theta)));
		line( image_stard, p1, p2, Scalar(0,0,255), 1, CV_AA);
    }
    imshow("標準霍夫線檢測",image_stard);

        //累計概率霍夫變換
    Mat image_line=image.clone();
    vector<Vec4i> lines;
	HoughLinesP(image_canny, lines, 1, CV_PI/180, 80, 50, 10 );
	for( size_t i = 0; i < lines.size(); i++ )
	{
		Vec4i l = lines[i];
		line( image_line, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,255,0), 1, CV_AA);
	}
    imshow("累計霍夫線檢測",image_line);

    //霍夫圓檢測
    Mat image_circle=image.clone();
    vector<Vec3f> circles;
	HoughCircles( image_canny, circles, CV_HOUGH_GRADIENT,1, 100, 40, 40, 200, 1000 );
	for( size_t i = 0; i < circles.size(); i++ )
	{
		Vec3f c = circles[i];
        circle(image_circle, Point(c[0], c[1]), c[2], Scalar(0, 0, 255), 2, LINE_AA);
		circle(image_circle, Point(c[0], c[1]), 2, Scalar(0, 255, 0), 2, LINE_AA);
	}
    imshow("霍夫圓檢測",image_circle);

    waitKey(0);
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章