霍夫变换圆,直线检测[微记]
大家一起用,省的麻烦!
霍夫变换检测圆
cv::Mat img = cv::imread("1.PNG", CV_LOAD_IMAGE_GRAYSCALE);
cv::Laplacian(img, img, CV_8UC1, 5);
cv::threshold(img, img, 254, 255, CV_THRESH_BINARY);
cv::imwrite("edge.png", img);
cv::Mat dst = cv::imread("edge.png");
std::vector<cv::Vec3f> circles;
HoughCircles(img, circles, CV_HOUGH_GRADIENT, 1.2, 10, 130, 38, 6, 50);
//image 为输入图像,要求是灰度图像
//circles 为输出圆向量——圆心横坐标,圆心纵坐标和圆半径
//method 为使用霍夫变换圆检测的算法,它的参数是CV_HOUGH_GRADIENT
//dp 为第一阶段所使用的霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小一致,
// dp=2时霍夫空间是输入图像空间的一半,以此类推
//minDist 为圆心之间的最小距离
//param1 Canny算子的高阈值
//param2 共有的阈值
//minRadius和maxRadius 圆半径的最小值和最大值
for(size_t i = 0; i < circles.size(); i++)
{
cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
circle( dst, center, 0, cv::Scalar(0, 255, 0), -1, 8, 0 );
circle( dst, center, radius, cv::Scalar(0, 0, 255), 1, 8, 0 );
}
cv::imshow("circles", dst);
cv::waitKey(0);
霍夫变换检测线段
cv::Mat img = cv::imread("1.PNG", CV_LOAD_IMAGE_GRAYSCALE);
cv::Laplacian(img, img, CV_8UC1, 5);
cv::threshold(img, img, 254, 255, CV_THRESH_BINARY);
cv::imwrite("edge.png", img);
cv::Mat dst = cv::imread("edge.png");
std::vector<cv::Vec4i> lines;
HoughLinesP(img, lines, 30, 2.0 * M_PI / 180.0, 20, 20.0, 3.0);
//lines:是一个vector<Vec4i>,Vec4i是一个包含4个int数据类型的结构体,[x1,y1,x2,y2],可以表示一个线段。
//rho:就是一个半径的分辨率。
//theta:角度分辨率。
//threshold:判断直线点数的阈值。
//minLineLength:线段长度阈值。
//minLineGap:线段上最近两点之间的阈值。
for(size_t i = 0; i < lines.size(); i++)
{
cv::Point p1(lines[i][0], lines[i][1]);
cv::Point p2(lines[i][2], lines[i][3]);
cv::line(dst, p1, p2, cv::Scalar(255, 255, 0), 2);
}
cv::imshow("lines", dst);
cv::waitKey(0);