OpenCV(三十六):霍夫直线检测

news2024/12/22 20:03:54

1.检测直线的霍夫变换原理

2.检测直线函数HoughLines()

检测直线流程:

Step1:将参数空间的坐标轴离散化。

Step2:将图像中每个非0像素通过映射关系求取在参数空间通过的方格

Step3:统计参数空间内每个方格出现的次数,选取次数大于某一值的方格作为表示直线的方格

Step4:将参数空间中表示直线的方格的参数作为图像中直线的参数

void cv::HoughLines ( InputArray image

OutputArray lines,

double   rho,

double   theta,

int          threshold.

double   srn = 0,

double    stn =0,

double   min_theta = 0,

double    max_theta = CV_PI

)

参数说明:

  • image:输入的二值图像,通常是经过边缘检测后的图像。
  • lines:输出参数,包含检测到的直线的向量。
  • rho:极径参数ρ的精确度,以像素为单位。
  • theta:角度参数θ的精确度,以弧度为单位。
  • threshold:参数空间中投票阈值,用于确定检测到的直线。
  • srn、stn、min_theta、max_theta:这些参数是可选的,用于进一步细化直线检测的精度和范围。

示例代码:

void drawLine(Mat &img,//要标记直线的图像
              vector<Vec2f> lines,//检测的直线数据
              double rows,//原图像的行数(高)
              double cols,//原图像的列数(宽)
              Scalar scalar,//绘制直线的颜色
              int n//绘制直线的线宽
              ){
    Point pt1,pt2;
    for(size_t i=0;i<lines.size();i++){
        float rho=lines[i][0];//直线距离坐标原点的距离
        float theta=lines[i][1];//直线过坐标原点垂线
        double a=cos(theta);//夹角的余弦值
        double b=sin(theta);//夹角的正弦值
        double x0=a*rho,y0=b*rho;//直线与坐标原点的垂线的交点
        double length=max(rows,cols);//图像高宽的最大值
        //计算直线上的一点
        pt1.x= cvRound(x0+length*(-b));
        pt1.y= cvRound(y0+length*(a));
        //计算直线上的另一点
        pt2.x= cvRound(x0-length*(-b));
        pt2.y= cvRound(y0-length*(a));
        //两点绘制一条直线
        line(img,pt1,pt2,scalar,n);
    }
}
//霍夫直线检测
void Hough_linear_detection(Mat image){
    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    Mat edge;
    //检测边缘图像,并二值化
    Canny(gray,edge,80,180,3, false);
    //用不同的累加器进行检测直线
    vector<Vec2f> lines1,lines2;
    HoughLines(edge, lines1,1,CV_PI/180,50,0,0);
    HoughLines(edge, lines2,1,CV_PI/180,150,0,0);
    //在原图像中绘制直线
    Mat img1,img2;
    image.copyTo(img1);
    image.copyTo(img2);
    drawLine(img1,lines1,edge.rows,edge.cols,Scalar(255),2);
    drawLine(img2,lines2,edge.rows,edge.cols,Scalar(255),2);
    //显示图像
    imwrite("/sdcard/DCIM/edge.png",edge);
    imwrite("/sdcard/DCIM/img1.png",img1);
    imwrite("/sdcard/DCIM/img2.png",img2);
}

Canny算子边缘检测后图片 :

用累加器为50进行检测直线:

用累加器为150进行检测直线:

3.检测直线函数 HoughLinesP()

void cv::HoughLinesP ( InputArray   image,

OutputArray lines,

double     rho,

double    theta,

int        threshold,

double   minLineLength =0,

double   maxLineGap = 0

)

  • image:待检测直线的原图像,必须是CV_8C的单通道二值图像
  • lines:霍夫变换检测到的直线输出量,每一条直线都由4个参数进行描述,分别是直线两个端点的坐标
  • rho:以像素为单位的距离分辨率。
  • theta: 以弧度为单位的角度分辨率
  • threshold:累加器的阈值
  • minLineLength: 直线的最小长度,当检测直线的长度小于该数值时将会被剔除
  • maxLineGap:允许将同一行两个点连接起来的最大距离。

示例代码:

//霍夫直线检测
void Hough_linearP_detection(Mat image){
    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    Mat edge;
    //检测边缘图像,并二值化
    Canny(gray,edge,80,180,3, false);
    //利用渐进概率式霍夫变换提取直线
    vector<Vec4i> linesP1,linesP2;
    HoughLinesP(edge, linesP1,1,CV_PI/180,150,30,10);//两个点连接最大距离10
    HoughLinesP(edge, linesP2,1,CV_PI/180,150,30,30);//两个点连接最大距离30
    //绘制两个点连接最大距离10直线检测结果
    Mat img1;
    image.copyTo(img1);
    for(size_t i=0;i<linesP1.size();i++){
        line(img1,Point(linesP1[i][0],linesP1[i][1]),
             Point(linesP1[i][2],linesP1[i][3]),Scalar(255),3);
    }
    //绘制两个点连接最大距离30直线检测结果
    Mat img2;
    image.copyTo(img2);
    for(size_t i=0;i<linesP2.size();i++){
        line(img2,Point(linesP2[i][0],linesP2[i][1]),
             Point(linesP2[i][2],linesP2[i][3]),Scalar(255),3);
    }

    //显示图像
    imwrite("/sdcard/DCIM/img10.png",img1);
    imwrite("/sdcard/DCIM/img20.png",img2);
}

绘制两个点连接最大距离10直线检测结果:

绘制两个点连接最大距离30直线检测结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享一个python+django开发的高校学生成绩可视化分析系统源码、lw、调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

机器学习策略二——优化深度学习系统

进行误差分析 (Carrying out error analysis) 如果你希望让学习算法能够胜任人类能做的任务&#xff0c;但你的学习算法还没有达到人类的表现&#xff0c;那么人工检查一下你的算法犯的错误也许可以让你了解接下来应该做什么。这个过程称为错误分析。 假设你正在调试猫分类器…

【GO语言基础】函数

系列文章目录 【Go语言学习】ide安装与配置 【GO语言基础】前言 【GO语言基础】变量常量 【GO语言基础】数据类型 【GO语言基础】控制流 【GO语言基础】函数 文章目录 系列文章目录函数基础函数调用 GoLang API&#xff08;包&#xff09;简单介绍标准库&#xff1a;第三方库&…

【计算思维题】少儿编程 蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套

蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套 第十四届蓝桥杯省赛真题 1、要把下面4张图片重新排列成蜗牛的画像,该如何排列这些图片 A、 B、 C、 D、 答案:A 考点分析:主要考查小朋友们的观察能力空

轻松部署高颜值社区,在Ubuntu上搭建Cpolar+HYBBS论坛指南

文章目录 前言1. HYBBS网站搭建1.1 HYBBS网站安装1.2 HYBBS网站测试1.3. cpolar的安装和注册 2. 本地网页发布2.1.Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3.公网访问测试总结 前言 在国内互…

可靠又稳定些的微信管理系统

微信管理系统 --- 简单点说就是&#xff1a;微信的管理和营销系统。再通俗一些就是&#xff1a;利用微信与管理营销相结合的一种新型的办公方式。 不用下载任何软件&#xff0c;不需要多部手机&#xff0c;对手机型号没有任何要求&#xff0c;不需要刷机等等&#xff0c;并且稳…

腾讯云4核8G云服务器租用价格选轻量还是CVM?性能如何?

腾讯云4核8G云服务器可以选择轻量应用服务器或CVM云服务器标准型S5实例&#xff0c;轻量4核8G12M服务器446元一年&#xff0c;CVM S5云服务器935元一年&#xff0c;相对于云服务器CVM&#xff0c;轻量应用服务器性价比更高&#xff0c;轻量服务器CPU和CVM有区别吗&#xff1f;性…

c高级 day4

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 #!/bin/bashread -p "请输入数组:" -a arrfunction sum() {sum0for i in ${arr[*]}do((sumsumi))doneecho "数组和:"$sum }sum写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并使…

【Java】过滤器和拦截器区别

文章目录 前言1、过滤器 (Filter)2、拦截器 (Interceptor)3、我们不一样3.1、实现原理不同3.2、使用范围不同3.3、触发时机不同 4、拦截的请求范围不同5、注入Bean情况不同6、控制执行顺序不同总结 前言 准备环境 我们在项目中同时配置 拦截器 和 过滤器。 1、过滤器 (Filter…

Nginx反向代理联动Tomcat实现多实例部署、动静分离、负载均衡

文章目录 1. 配置反向代理1.1 前置准备1.2 代理服务器配置1.3 真实服务器配置1.4 客户机配置 2. Tomcat 多实例部署2.1 部署JDK2.2 设置JDK环境变量2.3 部署Tomcat服务2.4 路径启动 3. Nginx联动Tomcat实现动静分离、负载均衡3.1 基本原理3.2 前置准备3.3 配置nginx1实现四层代…

2023.9.8 基于传输层协议 UDP 和 TCP 编写网络通信程序

目录 UDP 基于 UDP 编写网络通信程序 服务器代码 客户端代码 TCP 基于 TCP 编写网络通信程序 服务器代码 客户端代码 IDEA 打开 支持多客户端模式 UDP 特点&#xff1a; 无连接性&#xff1a;发送端和接收端不需要建立连接也可相互通信&#xff0c;且每个 UDP 数据包都…

sql注入基本概念

死在山野的风里&#xff0c;活在自由的梦里 sql注入基本概念 MYSQL基本语法union合并查询2个特性&#xff1a;order by 排序三个重要的信息 Sql Server MYSQL 基本语法 登录 mysql -h ip -u user -p pass基本操作 show databases; 查看数据库crea…

串行数据发送器

框图 THR&#xff1a;发送保持寄存器 定义了两种状态&#xff1a;空&#xff0c;满数据写入端口地址&#xff1a;00H状态读出端口地址&#xff1a;00H当THR不满时&#xff0c;可以向THR写入数据 TSR&#xff1a;发送移位寄存器 一旦TSR空而THR中有数据时&#xff0c;THR中的数…

Ubuntu服务器安装Nvidia显卡驱动各类失败问题的解决方案集合

前言 给实验室服务器安装显卡驱动&#xff0c;总是遇到各种各样的问题。故而专门开一个文章记录一下遇到的各类问题。 正常安装方法 在这里安装CUDA&#xff0c;选择最新版本后根据系统配置点选即可&#xff0c;会自动生成对应的链接&#xff0c;如下图。这里选runfile&…

Mysql join用法详解

本篇文章旨在详细讲解Mysql 中join的用法&#xff0c;并附上例题。 一. left join 首先附上图 这个查询语句最根本的是要找出A表中所有的行&#xff0c; 所以如图所示&#xff0c;A表整个被涂蓝 A与B交叉的那部分可以视为ON后所跟的条件 重点是&#xff1a; 如果A表中有一条…

C#学习 - 方法的定义、调用、调试

方法 方法&#xff08;Method&#xff09;是由C/C中的函数&#xff08;Function&#xff09;发展而来的 //C语言 #include <stdio.h> int Add(int x, int y) {return x y; }//函数 int main(void) {int a 4;int b 2;int c Add(a, b);printf("%d %d %d\n&quo…

mysql 删除索引 索引长度还在,数据内存 索引内存没有减少

在我们针对数据表进行了大量删除或者删除掉某个无用的索引之后&#xff0c;该表占的数据内存或者索引并没有明显的变换&#xff0c;这是因为删除操作后在数据文件中留下碎片所致。 查看数据与索引 SELECTTABLE_NAME,concat( TRUNCATE ( data_length / 1024 / 1024, 2 ), MB …

腾讯云4核8G服务器CVM S5性能测评(CPU/流量/系统盘)

腾讯云4核8G服务器CVM标准型S5实例性能测评&#xff0c;包括CPU型号、内存、系统盘、CVM实例规格性能测评&#xff0c;腾讯云4核8G租用优惠价格表&#xff0c;腾讯云服务器网分享腾讯云4核8G服务器CVM S5性能测评和租用费用&#xff1a; 目录 腾讯云4核8G服务器CVM S5性能测评…

【C++】简单理解:将整数(浮点数)转换为字符串(string),将字符串(string)转换为整数(浮点数)方法

用stringstream类&#xff0c;口诀&#xff1a;过滤一下就转化 头文件#include<sstream> 例子&#xff1a;将整数12和浮点数12.34转化为字符串 int main() {int x 12;double d 12.34;string s;//创建一下对象strstringstream str;//过滤一下就转化str << x;st…

分享芯片行业有趣的小知识

随着拜登签署《芯片与科学家法案》&#xff0c;全球芯片争夺战进一步升温&#xff0c;我国芯片市场再次面临霸权主义的挑战。尽管困难重重&#xff0c;我们决不会停止在芯片领域的探索与发展&#xff0c;这彰显了芯片对国家的至关重要性。除了其重要性&#xff0c;芯片还有许多…