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