Opencv(C++)笔记--霍夫变换检测直线、霍夫变换检测圆

news2025/1/22 15:02:35

目录

1--原理

2--Opencv API

3--实例代码

4--霍夫变换检测圆


1--原理

        具体原理可参考 博客1 和 视频讲解1;

        霍夫变换检测直线的核心思想是:在笛卡尔坐标系下,一条直线(两个点(x1, y1)和(x2, y2)确定一条直线)可以变换为霍夫空间中的一个点(r, θ),由霍夫空间的一个点表示笛卡尔坐标系的一条直线

        对于图像中的直线而言,其由许多个像素点组成;而笛卡尔坐标系中的像素点可以映射为霍夫空间中的一条直线(因为一个像素点可以组成无数条直线,每一条直线对应霍夫空间的一个点),即霍夫空间的一条直线,对应笛卡尔坐标系的一个点

        对于霍夫空间中的每一条直线,其存在交点,霍夫空间的多条直线相交于一个交点,这个交点对应于笛卡尔坐标系下的一条直线,通过在霍夫空间中检测交点的个数确定交点的坐标(r, θ),可以检测笛卡尔坐标系下的直线。

2--Opencv API

3--实例代码

         进行霍夫变换直线检测时,通常配合 Canny边缘检测算法 进行,先对图片进行边缘检测,再进行直线检测;

# include <opencv2/opencv.hpp>
# include <cstdio>
# include <iostream>

int main(int argc, char** argv){
    cv::Mat src;
    src = cv::imread("C:/Users/Liujinfu/Desktop/opencv_bilibili/test_1218.jpg");
    if (src.empty()){
        printf("could not load image..\n");
        return -1;
    }
    cv::imshow("input", src);
    
    cv::Mat canny, dst;
    cv::Canny(src, canny, 150, 200); // 配合canny算法使用
    cv::cvtColor(canny, dst, cv::COLOR_GRAY2BGR); //灰度图转换为彩色图
    cv::imshow("edge", canny);

    std::vector<cv::Vec4f> plines;
    cv::HoughLinesP(canny, plines, 1, CV_PI / 180.0, 5, 0, 10);
    cv::Scalar color = cv::Scalar(0, 0, 255);
    for(size_t i = 0; i < plines.size(); i++){
        cv::Vec4f hline = plines[i];
        cv::line(dst, cv::Point(hline[0], hline[1]), cv::Point(hline[2], hline[3]), color, 3, cv::LINE_AA);
    }
    cv::imshow("output", dst);
    
    cv::waitKey(0);
    return 0;
}

4--霍夫变换检测圆

① 原理建议参考视频讲解2;

② Opencv API

参数说明:

cv::InputArray image:表示输入图像;

cv::OutputArray circles:圆的参数,包含圆心坐标和圆的半径;

int method:采用的检测方法,默认使用霍夫梯度法;

double dp:累加器分辨率与图像分辨率的反比。dp=1表示累加器具有与输入图像相同的分辨率。

double minDist:标新两个圆心之间的最小距离;

double param1 = (100.0):表示边缘检测对应的参数。对于霍夫梯度法而言,表示为传递给canny边缘检测算子的高阈值,而低阈值则为高阈值的一半;

double param2 = (100.0):表示检测方法对应的参数。对于霍夫梯度法而言,表示在检测阶段圆心的累加器阈值。参数值越小就越可以检测出更多不存在的圆;反之,检测出的圆一般都很完美;

int minRadius = 0:表示半径的最小值;

int maxRadius = 0:表示半径的最大值;

③ 代码实例

# include <opencv2/opencv.hpp>
# include <cstdio>
# include <iostream>

int main(int argc, char** argv){
    cv::Mat src;
    src = cv::imread("C:/Users/Liujinfu/Desktop/opencv_bilibili/test_1221.jpg");
    if (src.empty()){
        printf("could not load image..\n");
        return -1;
    }
    cv::imshow("input", src);
    
    cv::Mat temp, gray, dst;
    
    cv::medianBlur(src, temp, 3); // 中值滤波去除噪声
    cv::cvtColor(temp, gray, cv::COLOR_BGR2GRAY); // 灰度化

    // 霍夫圆检测
    std::vector<cv::Vec3f> pcircles;
    cv::HoughCircles(gray, pcircles, cv::HOUGH_GRADIENT, 1, 20, 100, 100, 1, 100);

    src.copyTo(dst);
    for(size_t i = 0; i < pcircles.size(); i++){
        cv::Vec3f cc = pcircles[i]; // cc[0] -> x  cc[1] -> y  cc[2] -> r
        cv::circle(dst, cv::Point(cc[0], cc[1]), cc[2], cv::Scalar(0, 0, 255), 2, cv::LINE_AA); // 可视化圆弧 
        cv::circle(dst, cv::Point(cc[0], cc[1]), 1, cv::Scalar(255, 0, 0), 2, cv::LINE_AA); // 可视化圆心
    }
    cv::imshow("output", dst);

    cv::waitKey(0);
    return 0;
}

 

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

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

相关文章

行业权威来揭秘,商用PC为什么首选12代酷睿

第12代酷睿处理器可以提供更卓越的性能&#xff0c;凭借架构先进性让商用台式机和笔记本电脑为用户带来更好的体验&#xff0c;帮助企业和员工效率倍增。 作者|九月 来源| PConline 想要让办公效率进一步提升&#xff0c;一台强大的PC设备是必不可少的生产力和内容创作工…

有什么适合零基础的人做的副业兼职

互联网上有很多套路。这是不可预防的。只要你敢贪婪&#xff0c;你就会陷入别人设计的陷阱。在业余时间做兼职应该是很多人的梦想&#xff0c;因为他们可以在有限的时间内赚更多的钱。很多人不知道的是&#xff0c;其实我们赚钱的渠道很多:比如网上发文章.短视频直播.我们媒体、…

基于SpringBoot+Mybatis框架的私人影院预约系统(附源码,包含数据库文件)

基于SpringBootMybatis框架的私人影院预约系统&#xff0c;附源码&#xff0c;包含数据库文件。 非常完整的一个项目&#xff0c;希望能对大家有帮助哈。 本系统的完整源码以及数据库文件都在文章结尾处&#xff0c;大家自行获取即可。 项目简介 该项目设计了基于SpringBoo…

Spring MVC—Spring MVC概述

文章目录Java web的发展历史一.Model I和Model II1.Model I开发模式2.Model II开发模式二. MVC模式SpringMVC 的工作原理和流程springmvc 的拦截器Spring和SpringMVC的区别————————————————————————————————Java web的发展历史 一.Model I和M…

VS Code debug调试时无法查看变量内容【已解决】

问题场景&#xff1a;新换成的vscode编译软件&#xff0c;但是在debug调试时发现与QtCreator不同&#xff0c;无法直接查看变量&#xff0c;显示的都是地址或其他。 比如&#xff1a;QString或QStringList无法查看具体的内容&#xff0c;正常是这样显示的&#xff0c;反正我不…

Linux神器——vim

目录 一、vim基本概念 二、vim基本操作 三、vim正常模式命令集 四、vim末行模式命令集 五、vim操作总结 六、vim界面配置 vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而…

上班15年后,普通程序员能实现财富自由吗?

对于职业生涯还没有开挂的普通程序员来说&#xff0c;有可能实现财务自由吗&#xff1f; 先来说下财务自由的最低标准 北上广深&#xff1a;身价3000万&#xff0c;含房产1000万、现金2000万。 杭州、南京、成都等二线城市&#xff1a;身价1500万&#xff0c;含500万房产、现…

集成底座双K8S集群扩展升级方案

集成底座方案是应用于企业信息化建设的集成整合阶段&#xff0c;通过建立统一、标准、柔性、可复用、可扩展的IT架构&#xff0c;解决企业信息化建设过程中缺乏整体规划、集成整合难度大、安全管控不到位等问题&#xff0c;强化企业信息化的架构建设、集成整合、数据治理、安全…

某鱼兼职并不是那么好做,钱也不是漫天要价

文章目录一、背景二、雇主的期望2.1、jinja2代码三、题主的期望3.1、删除功能3.2、前端体现3.3、留言列表实现降序3.4、效果显示四、总结一、背景 上周某鱼推送过来的单子多到题主应接不暇&#xff0c;不得已拒绝了几单&#xff0c;但是接下来的单子呢又不那么顺利&#xff0c;…

提速3.7倍!何恺明团队再发新作,更快更高效的FLIP模型:通过Masking扩展语言-图像预训练(附论文原文下载)

原创/文 BFT机器人 研究论文地址&#xff1a;https://arxiv.org/abs/2212.00794 计算机视觉和深度学习领域大神何恺明携团队再发新作&#xff01;论文围绕近来火热的CLIP&#xff08;Contrastive Language-Image Pre-Training&#xff09;模型展开研究&#xff0c;并提出了一种…

Python怎么进行时区的转换

pytz 是一个用于处理时区的 Python 库,它为 Python 提供了对时区的支持。 它提供了大量的时区信息&#xff0c;包括时区名称、偏移量、是否使用夏令时等。你可以使用 pytz 库来处理本地时间、UTC 时间和其他时区之间的转换。 它提供了许多函数来帮助你处理时区相关的信息。 …

C++之多态(中篇)(最全总结)

这里接上面C之多态&#xff08;上篇&#xff09; 本篇目录4.多态的原理4.2 多态的原理4.3 C 11 override和final4.4 重载、重写&#xff08;覆盖&#xff09;、隐藏&#xff08;重定义&#xff09;的对比 &#xff08;函数之间的关系&#xff09;5.抽象类5.1概念5.2接口继承和实…

三、基于kubeadm安装kubernetes1.25集群第二篇

在上一篇中我们已经安装kubernetes要求做了服务器初始化&#xff0c;看这篇之前&#xff0c;建议先看下上篇&#xff1a;https://blog.csdn.net/u011837804/article/details/128350651 那我们正式开始kubernetes1.26集群安装 1、每台机器安装docker20.10.22 docker的安装细节…

数据结构训练营4

开启蓝桥杯备战计划&#xff0c;每日练习算法一题&#xff01;&#xff01;坚持下去&#xff0c;想必下一年的蓝桥杯将会有你&#xff01;&#xff01;笔者是在力扣上面进行的刷题&#xff01;&#xff01;由于是第一次刷题&#xff01;找到的题目也不咋样&#xff01;所以&…

itop-imx8m开发板gstreamer日志级别设置

gst 的日志等级分为 none(0)error(1) warning(2) info(3) debug(4) log(5)。默认 gst 的日志等级为 1&#xff0c;即 error 打印&#xff0c;出错时会打印。 1&#xff09;全局日志级别设置 如果需要更高级别打印&#xff0c;修改环境变量 GST_DEBUG 即可。如需要 warning 级别…

基于python的transform行人车辆识别

Transformer是一种神经网络体系结构&#xff0c;由于它能够有效地处理顺序数据中的长期依赖性&#xff0c;因此在自然语言处理(NLP)任务中受到欢迎。它还被应用于各种其他任务&#xff0c;包括图像分类、对象检测和语音识别。 在车辆和行人识别方面&#xff0c;transformer可用…

浅谈安科瑞电能预付费系统在大电力客户中的设计及应用分析

摘 要 随着我国供电企业的不断发展&#xff0c;而用电模式也在不断改革&#xff0c;预付费技术在气、电等部门得到普遍的使用&#xff0c;本文主要针对预付费系统在大电力客户中的使用情况进行分析&#xff0c;提高用电用户的缴费率&#xff0c;有效的避免了客户恶意偷窃电行…

【小5聊】Winform从指定服务器下载文件的方式

在一些实际项目中&#xff0c;我们往往需要上传一些excel、word等办公文件&#xff0c;甚至是mp3、mp4等音频视频文件。 当然&#xff0c;大多数小型网站会放到自己服务器&#xff0c;如果文件量不大的话 如果文件数量会很多&#xff0c;那么就需要考虑使用第三方来保管存储 不…

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈

自然语言处理 (NLP) 是人工智能 (AI) 的一个分支&#xff0c;旨在通过将计算语言学与统计、机器学习和深度学习模型相结合&#xff0c;尽可能接近人类解释地理解人类语言。 NLP 的最大挑战之一是在考虑到各种语言表示的情况下预训练文本数据的过程。 2018 年&#xff0c;谷歌…

企业报表插件怎么用?

最近因为单位年底要做部门总结汇报&#xff0c;需要使用很多的数据以报表的形式来引证今年的工作情况&#xff0c;内部的 OA、ERP 这些业务系统是指望不上了。作为懂一点 SQL、又经常用 Excel 来给领导做报表的我&#xff0c;在网上一轮操作&#xff08;就是百度啦&#xff09;…