标签:检测 简便 iostream 输入 距离 技术 center length imshow
霍夫线变换的原理
① 在笛卡尔坐标系中:可由参数斜率和截距(k,b)表示。
② 在极坐标系中:可由参数极经和极角(r,θ)表示。
对于霍夫线变换,我们将采用第二种方式极坐标系来表示直线,因此直线的表达式可为:
化简便可得到:
这就意味着每一对 代表一条通过点 的直线。
对于一个给定点 ,我们可以在直角坐标系中,绘出所有通过它的直线(θ 为 x 轴,r 为 y 轴)。最终我们将得到一条正弦曲线。
注意:只绘出满足下列条件的点 and 。
越多曲线交于一点,也就意味着这个交点表示的直线由更多的点组成,权重和越大。我们可以设置一个阈值,来决定多少条曲线交于一点(权重多大)我们才认为检测到了一条直线。
这就是霍夫线变换要做的.。它追踪图像中每个点对应曲线间的交点.。如果交于一点的曲线的数量超过了阈值, 那么可以认为这个交点所代表的参数对 在原图像中为一条直线。
OpenCV 实现了以下三种霍夫线变换:
void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn = 0, double stn = 0);
代码示例:
#include<opencv.hpp> #include<iostream> using namespace std; using namespace cv; int hough_value = 70; Mat src, canny_img; void hough_change(int, void*) { vector<Vec2f>lines; HoughLines(canny_img, lines, 1, CV_PI / 180.0, hough_value); RNG rngs = { 12345 }; Mat show = src.clone(); for (int i = 0; i < lines.size(); i++) { float rho = lines[i][0], theta = lines[i][1]; double sin_theta = sin(theta), cos_theta = cos(theta); double x = rho * cos_theta, y = rho * sin_theta; //以垂点为基础,将直线延长 Point pt1, pt2; pt1.x = cvRound(x + 1000 * (-sin_theta)); pt1.y = cvRound(y + 1000 * (cos_theta)); pt2.x = cvRound(x - 1000 * (-sin_theta)); pt2.y = cvRound(y - 1000 * (cos_theta)); Scalar colors = Scalar(rngs.uniform(0, 255), rngs.uniform(0, 255), rngs.uniform(0, 255)); line(show, pt1, pt2, colors, 2); } imshow("show", show); } int main() { src = imread("C:/Users/齐明洋/Desktop/1.jpg"); GaussianBlur(src, src, Size(3, 3), 0, 0); imshow("src", src); Canny(src, canny_img, 55, 110, 3); imshow("canny_img", canny_img); namedWindow("show"); createTrackbar("threshold", "show", &hough_value, 200, hough_change); hough_change(0, 0); waitKey(0); }
效果演示:
累计概率霍夫变换:HoughLinesP 函数
void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength = 0, double maxLineGap= 0);
代码示例:
效果演示:
借鉴博客:https://www.cnblogs.com/xmu-rcs-jty/p/7531814.html
opencv —— HoughLines、HoughLinesP 霍夫线变换(标准霍夫线变换、多尺度霍夫线变换、累积概率霍夫线变换)
标签:检测 简便 iostream 输入 距离 技术 center length imshow
原文地址:https://www.cnblogs.com/bjxqmy/p/12331656.html