OpenCV19---霍夫直线变换

十九、霍夫变换—直线

1、霍夫直线变换介绍

  • Hough Line Transform用来做直线检测
  • 前提条件—边缘检测已经完成
  • 平面空间到极坐标空间转换
  • 对于任意一条直线上的所有点来说
  • 变换到极坐标中,从[0~360]空间,可以得到r的大小
  • 属于同一条直线上点在极坐标空间(r, θ \theta θ)必然在一个点上有最强的信号出现,根据此反算到平面坐标中就可以得到直线上各点的像素坐标,从而得到直线。

笛卡尔坐标中的每一个点都对应极坐标中的一条线,极坐标中的每个点也都对应笛卡尔坐标中的一条线。 若笛卡尔坐标系的很多点在极坐标系下的曲线交于一点,那么这点在笛卡尔坐标系内表现为一条直线,这条直线包含这些很多的点。
经过求梯度提取边缘等处理操作后,非边缘处都已经为零值(因为只有在边缘处可以提取直线,这是有意义的)。这时遍历图像中每一个非零值点,将其投影至极坐标系下的一条曲线。极坐标空间中每一个点(r, θ \theta θ)处有一个累加器,有一个线经过该点,累加器加1,根据阈值(大于某一个阈值)找到所有可能的点将其反投影为笛卡尔坐标系下的可能直线,保存该直线信息(即可以确定直线的两个坐标点)。

在这里插入图片描述

2、相关API学习

  • 标准的霍夫变换cv::HoughLines从平面坐标转换到霍夫空间,最终输出( θ \theta θ, r θ r_\theta rθ)表示极坐标空间。
  • 霍夫变换直线概率cv::HoughLinesP最终输出是直线的两个点(x0,y0,x1,y1)。
  • cv::HoughLines
cv::HoughLines(
InputArray src,//输入图像,必须是8bits的灰度图像
OutputArraylines,//输出的极坐标来表示直线
double rho,//生成极坐标时候的像素扫描步长,一般取值为1
double theta,//生成极坐标时候的角度步长,一般取CV_PI/180。对于每一个点将其投影至极坐标系下,要对每一个角度求一个r值,最后要看哪一个(r,theta)值达到某一个阈值,视为可能的直线,这里的角度步长,相当于划分角度的密度
int threshold,//阈值,只有获得足够交点的极坐标点才被看成是直线
double srn = 0,//是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
double stn = 0,//是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
double min_theta = 0,//表示角度扫描范围0~180之间,默认即可
double max_theta = CV_PI
)
  • cv::HoughLinesP
cv::HoughLinesP(
InputArray src,//输入图像,必须是8bit的灰度图像
OutputArraylines,//输出的笛卡尔坐标来表示直线
double rho,//生成极坐标时候的像素扫描步长
double theta,//生成极坐标时候的角度步长,一般取CV_PI/180
int threshold,//阈值,只有获得足够交点的极坐标点才被看成是直线
double minLineLength = 0,//最小直线长度
double maxLineGap = 0//最大间隔
)

示例代码:(霍夫直线检测)

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;

int main(int argc, char* argv) {
    Mat src,src_gray ,dst;
    src = imread("添加图片路径");
    if (!src.data) {
  	cout << "could not load image..." << endl;
  	return -1; 
    }
    char INPUT_WIN[] = "input image";
    char OUTPUT_WIN[] = "output image";
    namedWindow(INPUT_WIN, WINDOW_AUTOSIZE);
    imshow(INPUT_WIN, src);
    
    Canny(src, src_gray, 150, 200);//边缘检测
    cvtColor(src_gray, dst, COLOR_GRAY2BGR);//灰度图转彩色图
    imshow("edge image", src_gray);
    
    vector<Vec4f> plines;//定义一个数组接收霍夫变换结果值。这个数组每个位置存放四个浮点数的值代表最终输出的两个点的X、Y坐标值
    HoughLinesP(src_gray, plines, 1, CV_PI / 180.0, 10, 0, 15);
    Scalar color = Scalar(0, 0, 255);
    for (size_t i = 0; i < plines.size(); i++) {//把直线画出来
 	 Vec4f hline = plines[i]; 
  	line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3, LINE_AA);
    }
    imshow(OUTPUT_WIN, dst);
    
    waitKey(0);
    return 0;
}    

最终输出结果:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值