【OpenCv • c++】几何检测 —— 霍夫变换 | 霍夫直线检测 | 霍夫线变化

news2024/12/26 12:05:45

  • 🚀 个人简介:CSDN「博客新星」TOP 10 , C/C++ 领域新星创作者
  • 💟 作    者:锡兰_CC ❣️
  • 📝 专    栏:【OpenCV • c++】计算机视觉
  • 🌈 若有帮助,还请关注➕点赞➕收藏,不行的话我再努努力💪💪💪

文章目录

    • 什么是霍夫变换?
    • 霍夫变化的原理
    • 霍夫线变化
      • 标准的霍夫变换(SHT)
        • 参考代码:
      • 多尺度霍夫变化(MHT)

什么是霍夫变换?

  霍夫变化是从图像中识别几何形状的基本图像处理方法之一,应用广泛。霍夫变换用来检测图像中的直线,其原理是利用坐标空间变换将两个坐标进行相应的转换,或通过直线映射到另一坐标空间的点形成的峰值。从而把检测任意形状的问题转化为统计峰值的问题。它的优点在于分割结果的鲁棒性,它的缺点是要求知道物体边界线的解析方程。

霍夫变化的原理

  以直线检测为例,每个像素坐标点经过空间变换都编程对直线特质有贡献的统一度量。

请添加图片描述

  对于二维图像数据 f(x,y),平面坐标为 (x,y),极坐标为 (r,θ)。从坐标轴可看出公式:xcosθ+ysinθ=r

  对于图像像素平面坐标 (x,y),我们需要做的就是通过空间坐标映射关系,将图像笛卡尔坐标系转换到极坐标霍夫空间系统,这种点到曲线的映射变换称为霍夫变换。

霍夫线变化

  在许多实际的图像处理应用中,我们可以检测图像中的轮廓部分或图形,直线检测有利于分析图像中的角度及其结构特征。

  霍夫线变化是基于图像二值化的变换,利用二值化图像中的点集来确定候选直线的集合。在图像的边缘,可以用方程 f(x,p) = 0 来表示任意的曲线,其中p为曲线的参数向量,那么利用霍夫变换进行线检测算法的步骤如下:

  • 在参数 p 的范围内量化参数空间,将霍夫空间坐标 (r,θ) 初始化为 0。

  • 在阈值化后的梯度图像中,对每个图像点 (i,j) 进行遍历,对于满足参数 p,加权累计所有满足 f(x,p) = 0 的单位 S§,则 S§ = S§ + delta§。

  • 计算当前霍夫空间的累计数组 S§ 的局部最大值,那么对应的就是原始图像中 f(x,p) = 0 的解析实现。

  OpenCv 算法并没有直接将曲线提取出来,而是返回相应的**(r,θ)平面的局部最大值**,因此要对OpenCV中的函数参数接口进一步理解分析。

标准的霍夫变换(SHT)

参考代码:

void HoughLinesP(InputArray image,		
	OutputArray lines,	
	double rho,			
	double theta,			
	int threshold,		
	double minLineLength = 0,	
	double maxLineGap = 0)	

  其中,image 代表输入图像,lines代表输出线向量,每个向量由四个元素 (x1, y1, x2, y2)组成,(x1, y1)(x2, y2)为线段的终点坐标,rho代表累计像素的距离分辨率,theta代表累计弧度的角度分辨率,ehreshold代表要检测一条直线所需最少的曲线交点,minLineLength代表最小的线长度,maxLineGap代表最大的长度,用于线段连接。

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc_c.h>
#include <opencv2/imgproc/types_c.h>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;


int main() {
	cv::Mat srcImage = cv::imread("...cc.png", 0);
	if (!srcImage.data)
		return 1;
	cv::Mat edgeMat, houghMat;
	// Canny 边缘检测 二值图像
	Canny(srcImage, edgeMat, 50, 180, 3);
	cvtColor(edgeMat, houghMat, CV_GRAY2BGR);

	// 标准的霍夫变换
	vector<Vec2f> lines;
	HoughLines(edgeMat, lines, 1, CV_PI / 180, 100, 0, 0);
	for (size_t i = 0; i < lines.size(); i++)
	{
		// 根据直线参数表达式绘制相应检测结果
		float rho = lines[i][0], theta = lines[i][1];
		Point pt1, pt2;
		double a = cos(theta), b = sin(theta);
		double x0 = a * rho, y0 = b * rho;
		pt1.x = cvRound(x0 + 1000 * (-b));
		pt1.y = cvRound(y0 + 1000 * (a));
		pt2.x = cvRound(x0 - 1000 * (-b));
		pt2.y = cvRound(y0 - 1000 * (a));
		line(houghMat, pt1, pt2, Scalar(0, 0, 255), 3, CV_AA);
	}
	cv::imshow("srcImage", srcImage);
	cv::imshow("houghMat", houghMat);
	cv::waitKey();
	cv::waitKey(0);
	return 0;
}

请添加图片描述

多尺度霍夫变化(MHT)

void HoughLinesP(InputArray image,		
	OutputArray lines,	
	double rho,			
	double theta,			
	int threshold,		
	double minLineLength = 0,	
	double maxLineGap = 0)	

  其中,image 代表输入图像,lines代表输出线向量,每个向量由两个元素 (,θ)组成,(x1, y1)(x2, y2)为线段的终点坐标,rho代表累计像素的距离分辨率,theta代表累计弧度的角度分辨率,ehreshold代表要检测一条直线所需最少的曲线交点,minLineLength代表最小的线长度,maxLineGap代表最大的长度,用于线段连接。

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc_c.h>
#include <opencv2/imgproc/types_c.h>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;


int main() {
	cv::Mat srcImage = cv::imread("...cc.png", 0);
	if (!srcImage.data)
		return 1;
	cv::Mat edgeMat, houghMat;
	// Canny 边缘检测 二值图像
	Canny(srcImage, edgeMat, 50, 180, 3);
	cvtColor(edgeMat, houghMat, CV_GRAY2BGR);

	// 统计概率的霍夫变换
	vector<Vec4i> lines;
	HoughLinesP(edgeMat, lines, 1, CV_PI / 180, 50, 50, 10);
	for (size_t i = 0; i < lines.size(); i++)
	{
		Vec4i l = lines[i];
		// 绘制线检测结果
		line(houghMat, Point(l[0], l[1]),
			Point(l[2], l[3]), Scalar(0, 0, 255), 3, CV_AA);
	}
	cv::imshow("srcImage", srcImage);
	cv::imshow("houghMat", houghMat);
	cv::waitKey();
	cv::waitKey(0);
	return 0;
}

请添加图片描述其他

更多专栏订阅:

  • 👍 【开卷数据结构】
  • 💛 【备战蓝桥,冲击省一】
  • 💕   从零开始的 c++ 之旅
  • 💖 【OpenCV • c++】计算机视觉

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

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

相关文章

浅谈YUV444、YUV422、YUV420

本期将会给大家介绍YUV相关基础知识&#xff0c;同时也介绍威创网络分布式系统的卓越色彩处理技术。 1.什么是YUV色彩空间 2.YUV采样格式 3.YUV不同采样格式对图像画质的影响分析 一、什么是YUV色彩空间? YUV是视频、图片、相机等应用中常常使用的一类图像格式&#xff0c;是…

【python案例】获取IP代理数据,筛选出符合需求的IP

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 我们为什么要IP代理呢&#xff1f; 当采集数据, 批量采集数据, 请求速度过快, 网站可能会把你IP封掉 <你的网络进不去这个网站> IP代理换一个IP, 再去采集请求数据 开发环境: 解释器版本: python 3.8 代码编辑…

Vicuna:斯坦福开源一个性能相当于90%ChatGPT的聊天机器人

自从Meta公司发布LLaMA以来&#xff0c;围绕它微调和开发的模型越来越多&#xff0c;这得益于它的性能和效果&#xff0c;2023年3月份发布的草泥马&#xff08;Alpaca&#xff09;是由Meta的LLaMA 7B微调而来的全新模型&#xff0c;仅用了52k数据&#xff0c;性能约等于GPT-3.5…

欧奈尔杯柄形态选股公式,突破杯柄高点发出信号

杯柄形态是由美国著名的成长股投资大师威廉欧奈尔提出的&#xff0c;在其经典著作《笑傲股市》中有详细介绍。 根据欧奈尔在书中的描述&#xff1a; 从侧面观察其轮廓时&#xff0c;最重要的价格形态之一看起来就像是一个带柄的茶杯。杯状形态可以持续7~56周不等&#xff0c;但…

数据结构选择题(难题题解) 第五章 树

5.2 14. 法1&#xff1a;少一个叶子再多一个叶子&#xff0c;欠考虑了 选B 法2&#xff1a; 法三&#xff1a; 5.3 23.选D A. 如果是根 直接找孩子就能找到后继&#xff1b;如果是左孩子&#xff0c;有孩子就找孩子&#xff0c;无孩子&#xff0c;指针是空&#xff0c…

ROS2 msg和srv CMake编写注意事项

ROS2使用msg和srv可以参考官网&#xff1a; 工程文件cpp所包含的头文件&#xff0c;其中 cpp_pubsub_self/msg/test.hpp 为msg消息消息生成的头文件&#xff0c;具体的可以参考官网 注意事项&#xff1a; 在 ROS2 当中&#xff0c;使用 msg 和 srv 消息文件格式的时候&#…

单点登录三:添加RBAC权限校验模型功能理解及实现demo

1、RBAC权限模型 RBAC&#xff08;Role-Based Access Control&#xff09;是一种基于角色的访问控制模型&#xff0c;用于管理系统中用户的权限和访问控制。它将用户、角色和权限之间的关系进行了明确的定义&#xff0c;以实现灵活的权限管理和控制。 1.1、RBAC模型主要包括以…

这才是CSDN最系统的网络安全学习路线(建议收藏)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

异步复位同步释放

(1条消息) 芯片设计全流程知识点总结_GGbao_的博客-CSDN博客 异步复位同步释放在always语句块里为&#xff1a; 当异步复位信号到来时&#xff0c;寄存器 reg_1 会被直接拉低&#xff0c;这是不会产生问题的&#xff0c;当rstn下降沿和clk上升沿同时到来时&#xff0c;如果rstn…

EduSoho 网校系统部署

目录 一、初始化环境二、安装 Nginx三、安装 MySQL四、安装 PHP五、上线 EduSoho六、验证FAQ 一、初始化环境 1、安装wget 如果系统已安装wget,请跳过此步骤 yum install wget2、关闭防火墙/Selinux systemctl stop firewalld.service systemctl disable firewalld.service…

Win32通用控件,加载进程(PE查看器)项目初步

在本专栏上一篇文章中带领大家学习了对话框的创建&#xff0c;并且在项目中创建出了对话框。在这一篇文章中&#xff0c;我将带领大家学习Win32通用控件&#xff0c;了解_WM_NOTIFY消息&#xff0c;并且带领大家初步写出课程中加载Windows所有进程的应用程序的雏形&#xff0c;…

因为懒,我用了“低代码”打下手

目录 一、前言 二、工具介绍 三、平台特点 四、如何使用JNPF&#xff1f; 五、低代码平台的选择参考 六、总结 一、前言 「一个优秀的开发者&#xff0c;一定是会利用各种工具来提升自己的开发效率。」 前段时间&#xff0c;体验了很多国内前沿的低代码平台&#xff0c;在…

Fiddler抓包工具之Fiddler界面主菜单功能介绍

Fiddler界面主菜单功能介绍 File菜单 File菜单中的命令主要支持完成通过Fiddler来启动和停止web流量的捕获&#xff08;capture&#xff09;,也可以加载或存储捕获的流量 &#xff08;1&#xff09;Capture Traffic&#xff1a;默认勾选&#xff0c;勾选此项才可抓包&#xff…

Linux ALSA音频工具

参考&#xff1a; ALSA 音频工具 amixer、aplay、arecord Linux Alsa ALSA的配置文件 音频录制——arecord 音频播放——aplay 音频配置——amixer alsamixer与amixer的区别 alsamixer是Linux音频框架ALSA工具之一&#xff0c;用于配置音频各个参数; alsamixer是基于文本图形…

APP中有html5页面的时候,怎么进行元素定位

测试app的时候&#xff0c;我们知道可以通过UI Automator Viewer进行元素定位 但是很多app中都会内嵌h5页面&#xff0c;这个时候定位就会变成下图这样&#xff1a; 第一步&#xff1a; 在手机中打开当前app的h5界面&#xff0c;使用usb连接电脑后&#xff0c; 第二步&#x…

聚焦金融行业网络安全|安全狗亮相知虎科技生态大会

5月18日&#xff0c;知虎科技生态大会在上海顺利举办。作为国内云原生安全领导厂商&#xff0c;安全狗也受邀出席此次活动。 据悉&#xff0c;此次大会邀请了来自国内顶级安全厂商的安全专家介绍从网络安全、应用安全、业务安全、数据安全、资金安全、通信安全等六个方面全方位…

抖音账号矩阵系统源码/技术开发搭建私有化部署开源

抖音SEO矩阵系统是基于抖音平台的搜索引擎优化技术的一种系统&#xff0c;其主要作用是通过一系列的技术手段&#xff0c;提高抖音视频的曝光和排名&#xff0c;使其获得更多的流量和粉丝。在本文中&#xff0c;我们将介绍抖音SEO矩阵系统的开发技术&#xff0c;包括系统设计、…

ElasticSearch集成SpringBoot实践及数据同步

一 前言 ES 全称 Elasticsearch 是一款分布式的全文搜索引擎&#xff0c;在互联网公司中&#xff0c;这款搜索引擎一直被程序员们所推崇。常见的使用场景如ELK日志分析&#xff0c;电商APP的商品推荐&#xff0c;社交APP的同城用户推荐等等。今天结合自己平时的一些学习对它与…

分布式事务解决方案Seata-1.6.0版本Docker安装

1. 简介 为什么要安装1.6.0 版本&#xff1f; 因为低版本Seata只支持单表的DDL语句&#xff0c;只有在在1.6.0版本及以上才支持 UPDATE JOIN。 注&#xff1a;1.6.0版本与 低版本的主要区别在于配置文件格式的修改&#xff0c;一站式解决方案&#xff1a;分布式事务解决方案Sea…

有哪些好用的App云测试平台?

一、国内外6种好用app云测平台推荐&#xff08;章节末附pk图&#xff09; 1、国内云测平台 1&#xff09;Testin云测 网址&#xff1a;https://www.testin.cn/ Testin云测平台是一款基于云端的移动应用测试平台&#xff0c;为移动应用开发者和测试人员提供一站式的移动应用质…