当前位置: 首页 > news >正文

c++视觉处理---霍夫变换

霍夫直线变换的函数

HoughLines 是OpenCV库中用于执行霍夫直线变换的函数。霍夫直线变换用于检测图像中的直线。下面是该函数的基本用法:

cv::HoughLines(image, lines, rho, theta, threshold);
  • image: 输入的二值图像,通常是通过边缘检测算法生成的。
  • lines: 存储检测到的直线的容器。
  • rho: 霍夫空间中的距离分辨率。通常设置为像素。
  • theta: 霍夫空间中的角度分辨率。通常设置为弧度。
  • threshold: 用于判断直线是否检测成功的阈值。只有当投票数大于等于此阈值时,才会被认为检测到一条直线。

cv::HoughLines 函数将在输入图像上执行霍夫直线变换,识别直线,并将检测到的直线的参数 (ρ, θ) 存储在 lines 容器中。每个检测到的直线都由 (ρ, θ) 表示,其中 ρ 是距离原点的距离,θ 是直线的角度。您可以在 lines 容器中访问这些参数。

以下是一个使用 cv::HoughLines 的简单示例:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace std;
using namespace cv;
#include <fstream>
using namespace cv; //包含cv命名空间
#include <opencv2/core/core.hpp>//----------------- 【main()函数】--------------------------
// 描述: 控制台应用程序的入口函数, 我们的程序从这里开始
//
int main()
{//【1】载入原始图和 Mat变量定义Mat srcImage = imread("113.jpg"); //工程目录下应该有一张名为1. jpg的素材图Mat midImage, dstImage;//临时变量和目标图的定义//【2】进行边缘检测和转化为灰度图Canny(srcImage, midImage, 50, 200, 3);//进行一此 canny边缘检测cvtColor(midImage, dstImage, CV_GRAY2BGR);//转化边缘检测后的图为灰度图//【3】进行霍夫线变换vector<Vec2f> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合HoughLines(midImage, lines, 1, CV_PI/180, 150, 0, 0 );//【4】依次在图中绘制出每条线段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));//此句代码的OpenCV2版为://line( dstImage, pt1, pt2, Scalar(55,100,195), 1, CV_AA);//此句代码的 OpenCV3版为:line(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, LINE_AA);}//【5】显示原始图imshow("【原始图】", srcImage);//【6】边缘检测后的图imshow("【边缘检测后的图】", midImage);//【7】显示效果图imshow("【效果图】", dstImage);waitKey(0);return 0;
}

在这里插入图片描述

累计概率霍夫变换: HoughLinesP()函数

cv::HoughLinesP 是OpenCV库中用于执行概率霍夫直线变换(Probabilistic Hough Line Transform)的函数。概率霍夫直线变换与传统霍夫直线变换不同,它不需要计算每个像素的直线参数 (ρ, θ),而是通过连接边缘点的局部段来检测线段。这可以显著提高速度,特别是在处理大型图像时。

以下是 cv::HoughLinesP 函数的基本用法:

cv::HoughLinesP(image, lines, rho, theta, threshold, minLineLength, maxLineGap);
  • image: 输入的二值图像,通常是通过边缘检测算法生成的。
  • lines: 存储检测到的直线段的容器。
  • rho: 霍夫空间中的距离分辨率。通常设置为像素。
  • theta: 霍夫空间中的角度分辨率。通常设置为弧度。
  • threshold: 用于判断线段是否检测成功的阈值。只有当线段上的点数大于等于此阈值时,才会被接受。
  • minLineLength: 最小线段长度。任何短于此长度的线段都会被忽略。
  • maxLineGap: 允许将同一线段的两个线段断开的最大距离。

cv::HoughLinesP 函数将在输入图像上执行概率霍夫直线变换,识别线段,并将检测到的线段的起始点和终止点存储在 lines 容器中。

以下是一个简单的示例,演示如何使用 cv::HoughLinesP 检测线段:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace std;
using namespace cv;
#include <iostream>
#include <fstream>
using namespace cv; //包含cv命名空间
#include <opencv2/core/core.hpp>
//--【main()函数】 -//- -------- ---- -------------
// 描述: 控制台应用程序的入口函数, 我们的程序从这里开始
//.
int main()
{//【1】载入原始图和Mat变量定义Mat srcImage = imread("113.jpg"); //工程目录下应该有一张名为1. jpg的素材图Mat midImage, dstImage;//临时变量和目标图的定义//【2】进行边缘检测和转化为灰度图Canny(srcImage, midImage, 50, 200, 3);//进行一此 canny边缘检测cvtColor(midImage, dstImage, COLOR_GRAY2BGR);//转化边缘检测后的图为灰度图//【3】进行霍夫线变换vector<Vec4i> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合HoughLinesP(midImage, lines, 1, CV_PI/180, 80, 50, 10 );//【4】依次在图中绘制出每条线段for (size_t i = 0; i < lines.size(); i++){Vec4i l = lines[i];line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186, 88, 255), 1, LINE_AA);//此句代码的OpenCV2版为://line( dstImage, Point(1[0], 1[1]), Point(1[2], 1[3]),Scalar(186,88,255), 1, CV_AA);//此句代码的OpenCV3版为:}//【5】显示原始图imshow("【原始图】", srcImage);//【6】边缘检测后的图imshow("【边缘检测后的图】", midImage);//【7】显示效果图imshow("【效果图】", dstImage);waitKey(0);return 0;
}

这个示例加载了经过边缘检测的图像,然后使用 cv::HoughLinesP 函数检测线段,并在图像上绘制检测到的线段。请确保在 cv::HoughLinesP 函数中适当调整距离分辨率、角度分辨率、阈值、最小线段长度和最大线段断开距离以获得最佳的结果。
在这里插入图片描述

霍夫圆变换的函数:cv::HoughCircles

cv::HoughCircles 是OpenCV库中用于执行霍夫圆变换的函数。霍夫圆变换用于检测图像中的圆。以下是 cv::HoughCircles 函数的基本用法:

cv::HoughCircles(image, circles, cv::HOUGH_GRADIENT, dp, minDist, param1, param2, minRadius, maxRadius);
  • image: 输入的灰度图像,通常是通过边缘检测和预处理生成的。
  • circles: 存储检测到的圆的容器。
  • method: 用于检测圆的方法,通常使用 cv::HOUGH_GRADIENT
  • dp: 累加器分辨率与图像分辨率的比例。通常设置为1。
  • minDist: 检测到的圆之间的最小距离。
  • param1: Canny边缘检测的高阈值。
  • param2: 累加器阈值,用于确定检测到的圆。
  • minRadius: 允许的最小圆半径。
  • maxRadius: 允许的最大圆半径。

cv::HoughCircles 函数将在输入图像上执行霍夫圆变换,识别圆,并将检测到的圆的圆心坐标和半径存储在 circles 容器中。

以下是一个简单的示例,演示如何使用 cv::HoughCircles 检测圆:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace std;
using namespace cv;
#include <iostream>
#include <fstream>
using namespace cv; //包含cv命名空间
#include <opencv2/core/core.hpp>
//----【main()函数】------ -------- -
// 描述: 控制台应用程序的入口函数, 我们的程序从这里开始
int main()
{//【1】载入原始图、Mat 变量定义Mat srcImage = imread("2144.jpg"); //工程目录下应该有一张名为1. jpg的素材图Mat midImage, dstImage;//临时变量和目标图的定义//【2】显示原始图imshow("【原始图】", srcImage);//【3】转为灰度图并进行图像平滑cvtColor(srcImage, midImage, COLOR_BGR2GRAY);//转化边缘检测后的图为灰度图GaussianBlur(midImage, midImage, Size(9, 9), 2, 2);//【4】进行霍夫圆变换vector<Vec3f> circles;HoughCircles(midImage, circles, HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);//【5】依次在图中绘制出圆for (size_t i = 0; i < circles.size(); i++){//参数定义Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));int radius = cvRound(circles[i][2]);//绘制圆心circle(srcImage, center, 3, Scalar(0, 255, 0), -1, 8, 0);//绘制圆轮廓circle(srcImage, center, radius, Scalar(155, 50, 255), 3, 8, 0);}//【6】显示效果图imshow("【效果图】", srcImage);waitKey(0);return 0;
}

相关文章:

c++视觉处理---霍夫变换

霍夫直线变换的函数 HoughLines 是OpenCV库中用于执行霍夫直线变换的函数。霍夫直线变换用于检测图像中的直线。下面是该函数的基本用法&#xff1a; cv::HoughLines(image, lines, rho, theta, threshold);image: 输入的二值图像&#xff0c;通常是通过边缘检测算法生成的。…...

el-table 边框颜色修改 简单有效!

废话不多说&#xff0c;直接上图 &#xff08;1&#xff09;修改前的图如下&#xff1a; 以上是elementUI原组件自带的样式 &#xff08;2&#xff09;下面是修改后的边框图如下&#xff1a; 源码如下&#xff1a; <el-table :data"jctableData" border size…...

Zabbix第二部分:基于Proxy分布式部署实现Web监控和Zabbix HA集群的搭建

代理和高可用 一、基于zabbix-proxy的分布式监控1.1 分布式监控的作用1.2 数据流向1.3 构成组件 二、部署zabbix代理服务器Step1 前置准备Step2 设置 zabbix 的下载源&#xff0c;安装 zabbix-proxyStep3 部署数据库并将zabbix相关文件导入Step4 修改zabbix-proxy的配置文件&am…...

JumpServer rce深入剖析

影响范围 JumpServer < v2.6.2 JumpServer < v2.5.4 JumpServer < v2.4.5 JumpServer v1.5.9 修复链接及参考 修改了一处代码&#xff1a; Git History 增加了一处鉴权 def connect(self):user self.scope["user"]if user.is_authenticated and …...

EasyExcel导入/导出Excel文件

EasyExcel导入/导出Excel文件简单写法 1、导入依赖 2、创建简单导入、导出demo 3、创建类 继承AnalysisEventListener&#xff08;导入Excel监听解析表格数据&#xff09; 4、创建类 基于注解 自定义Excel导出模版 1、导入EasyExcel依赖 <!--导入EasyExcel…...

力扣(LeetCode)2512. 奖励最顶尖的K名学生(C++)

优先队列哈希集合反向思维(或自定义排序) 模拟&#xff0c;请直接看算法思路&#xff1a; 两个哈希集合S1和S2, S1存正面词汇&#xff0c;S2存负面词汇&#xff1b;一个优先队列pq&#xff0c;pq存{score, id}键值对&#xff0c;即学生分数-学生id。 算法流程&#xff1a; 初…...

CubeMX+BabyOS 使用方法

MCU&#xff1a;STM32G030F 编译器&#xff1a;MDK 托管工具&#xff1a;Sourcetree CubeMX创建工程 BabyOS克隆 添加子模块 git submodule add https://gitee.com/notrynohigh/BabyOS.git BabyOS 切换dev 分支 查看当前分支 git branch -a 切换本地分支到dev git che…...

OpenResty安装-(基于Nginx的高性能Web平台,可在Nginx端编码业务)

文章目录 安装OpenResty1.安装1&#xff09;安装开发库2&#xff09;安装OpenResty仓库3&#xff09;安装OpenResty4&#xff09;安装opm工具5&#xff09;目录结构6&#xff09;配置nginx的环境变量 2.启动和运行3.备注 安装OpenResty 1.安装 首先你的Linux虚拟机必须联网 …...

算法-DFS+记忆化/动态规划-不同路径 II

算法-DFS记忆化/动态规划-不同路径 II 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/unique-paths-ii 1.2 题目描述 2 DFS记忆化 2.1 思路 注意题意&#xff0c;每次要么往右&#xff0c;要么往下走&#xff0c;也就是说不能走回头路。但是仍有可能走到之前已经…...

黑盒测试方法:原理+实战

目录 一、如何设计测试用例 二、黑盒测试常用方法 1、基于需求进行测试用例的设计 2、等价类 3、边界值 4、判定表分析法&#xff08;因果分析法&#xff09; 5、正交表 6、场景设计法 三、案例补充 1、使用Fiddler模拟弱网 2、针对一个接口该如何测试 一、如何设计测试…...

SQLite事务处理

语法 BEGIN TRANSACTION; COMMIT TRANSACTION; &#xff08;或END TRANSACTION;&#xff09; ROLLBACK TRANSACTION; 事务处理 除了一些PRAGMA语句以外&#xff0c;其它访问数据库的语句会自动启动事务处理&#xff0c;并且在结束时自动提交。 通过上一节的命令可以手动控制…...

Java中CountDownLatch使用场景

在Java的并发API中&#xff0c;CountDownLatch是一个同步器&#xff0c;它允许一个或多个线程等待一组操作完成。 如果您正在开发一个服务器应用程序&#xff0c;该应用程序在开始处理请求之前需要初始化各种资源。这些资源可能是这样的&#xff1a; 加载配置文件建立数据库连…...

漏刻有时数据可视化Echarts组件开发(41)svg格式地图应用

1.定义SVG文件 var svg ;2.注册地图函数 Echarts.registerMap是Echarts图表库中用于注册地图的函数。它可以将第三方地图或自定义地图数据与Echarts进行集成&#xff0c;使用Echarts的API进行绘制。使用方法如下&#xff1a; echarts.registerMap(mapName, geoJson) 参数map…...

firefox的主题文件位置在哪?记录以防遗忘

这篇文章写点轻松的 最近找到了一个自己喜欢的firefox主题,很想把主题的背景图片找到,所以找了下主题文件所在位置 我的firefox版本:版本: 118.0.1 (64 位)主题名称: Sora Kawai 我的位置在 C:\Users\mizuhokaga\AppData\Roaming\Mozilla\Firefox\Profiles\w0e4e24v.default…...

Vuex获取、修改参数值及异步数据处理

14天阅读挑战赛 学不可以已... 目录 一、Vuex简介 1.1 vuex介绍 1.2 vuex核心 二、Vuex使用 2.1 Vuex安装 2.2 创建store模块 2.3 创建vuex的store实例并注册上面引入的各大模块 三、使用Vuex获取、修改值案例 3.1 创建两个菜单组件 3.2 配置路由 3.3 模拟菜单数据 …...

【 OpenGauss源码学习 —— 列存储(autoanalyze)(二)】

列存储&#xff08;autoanalyze&#xff09;&#xff08;二&#xff09; 概述PgStat_StatTabEntry 结构体pgstat_count_heap_insert 与 pgstat_count_cu_insert 函数CStoreInsert::BatchInsertCommon 函数pgstat_count_cu_update 函数pgstat_count_cu_delete 函数pgstat_count_…...

使用postman 调用 Webservice 接口

1. 先在浏览器地址栏 访问你的webService地址 地址格式: http://127.0.0.1:8092/xxxx/ws(这个自己的决定)/xxxxXccv?wsdl 2. post man POST 访问wwebService接口 地址格式: http://127.0.0.1:8092/xxxx/ws(这个自己的决定)/xxxxXccv <soapenv:Envelope xmlns:soapenv…...

程序员Google插件推荐

文章目录 AdBlock (广告拦截插件)SuperCopy 超级复制Octotree (github增强工具)GitZip for github (github增强工具)JSON-handleSimpleExtManager(管理谷歌插件)OneTab (标签页合并)PostWoman(接口调试)篡改猴 (Tampermonkey)FeHelper(前端助手) AdBlock (广告拦截插件) ☆ 拦截…...

机器学习中常见的监督学习方法和非监督学习方法有哪些。

问题描述&#xff1a;最近面试某些公司算法岗&#xff0c;看到一道简答题&#xff0c;让你举例熟悉的监督学习方法和非监督学习方法。 问题解答&#xff1a; 监督学习方法常见的比较多&#xff1a; 线性回归&#xff08;Linear Regression&#xff09;&#xff1a; 用于回归问…...

UEFI基础——测试用例Hello Word

Hello 测试用例 硬件环境&#xff1a;龙芯ls3a6000平台 软件环境&#xff1a;龙芯uefi固件 GUID获取网址&#xff1a;https://guidgen.com 一、创建工程 mkdir TextPkg/三个文件 Hello.c 、 Hello.inf 、HelloPkg.dsc 1.1 Hello.c /** fileThe application to print hello …...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...