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


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