高质量椭圆检测库

news2024/11/17 23:40:04

目录

前言

效果展示

检测库

简介

安装库

用法

测试

论文算法步骤简读

1. lsd 检测

2. lsd group

3. 生成初始 ellipse

4. 聚类


前言

椭圆检测是工业中比较常用的一种检测需求。目前常用的基于传统图像处理的椭圆检测方法是霍夫变换,但是霍变换的检测率比较低,很难满足工业场景。而基于深度学习的椭圆检测,只能用于特定场景下的椭圆检测,检测场景和标注数据有很大的关系,很难做到通用。

我无意中看到一篇椭圆检测的论文《An Efficient High-quality Ellipse Detection》,是基于传统图像处理算法进行的椭圆检测。效果很不错,对于标准椭圆的检测率很高,并且通用性很不错。但是论文作者只提供了基于matlab的源码,这么好的论文也没有人翻译成 c++ 库,所以我在理解原论文的基础上,经过一些调参和优化,实现了一个 c++ 版本的椭圆检测库(MIT LICENSE)效果和效率都很不错。

效果展示

先上图。

另外可以用我做的demo体验效果。线上体验:http://ellipsedetect.xyz/,或者小程序搜索 “椭圆识别“。

检测库

简介

椭圆检测库地址:

https://github.com/memory-overflow/standard-ellipse-detection​github.com/memory-overflow/standard-ellipse-detection

该库适用于边界清晰的椭圆检测、最好需要检测的的椭圆的大小在 200 * 200 像素以上,太小可能会有漏检,所以称之为标准椭圆检测。

安装库

库的的安装可以参考仓库的 wiki进行安装,注意 opencv 的版本一定要用 3.4.x。由于库使用了 shared_ptr,需要开启 c++11 及以上标准。

用法

该库的用法也很简单,您不必了解论文的具体实现细节。代码中引用头文件#include "ellipse_detection/detect.h",然后 zgh::detectEllipse(...) 调用。

接口说明

bool zgh::detectEllipse(
     INPUT const uint8_t *image,
     int height,
     int width,
     OUTPUT std::vector<std::shared_ptr<Ellipse> > &ells,
     int polarity = 0,
     double line_width = 2.0);
  • 输入参数:
    • image 图像原始数据,灰度图,彩色图需要先转换成灰度图,并且转换成一维数组输入
    • height 图像高度
    • width 图像宽度
    • polarity 表示椭圆极性,-1、0、1, 默认为 0,检测所有极性,-1 表示只检测内部亮,外部暗的椭圆,1 表示只检测内部暗,外部亮的椭圆,0 表示不关注椭圆的内外部亮度关系,检测所有椭圆。
    • line_width 椭圆边界的线宽,单位像素,推荐使用默认值,2 像素。
  • 输出
    • ells 检测到的椭圆列表

关于 Ellipse 结构的说明

Pointd o; // 椭圆中心点坐标
double a, b; // 短半轴长度,长半轴长度
double phi; // 椭圆偏角,单位为弧度
int polarity; // 椭圆极性
double goodness; // 椭圆评分
double coverangle; // 椭圆角度完整程度
std::vector<Pixel> inliers; // 构成的像素点

测试

提供了1个测试工具,可以查看效果。需要桌面版的操作系统才能显示图片,如果是服务器版本的操作系统,需要注释掉 imshow 部分。

cmake3 .. -DBUILD_TESTING=ON
make
./bin/testdetect [image_dir1] [image_dir2] [image_dir3] ...

论文算法步骤简读

如果对于论文的具体实现比较感兴趣,可以查看该部分内容。

该椭圆检测方法,主要分成如下4个步骤:

  1. lsd: 首先通过 lsd 检测算法生成很多细小的线段。
  2. lsd group: 通过搜索方法,将细小的线段连接成弧线。
  3. inital ellipse: 通过组合两条弧线,可以进行椭圆拟合,得到初始椭圆集。
  4. 聚类:对初始椭圆进行聚类,然后进行进一步的完整度评估,筛选出高完整度、高评分的椭圆。

1. lsd 检测

lsd 是一种传统的线段检测算法。它是基于梯度排序以后,通过查找近似矩形区域来获得线段。通过 lsd 可以提取图像中的细小线段,以下图为例子,

经过 lsd 检测算法后如下图,不同的颜色代表一条不同的线段。

2. lsd group

lsd group 的目的是为了把多个首尾相连的,并且斜率差在一定范围内的线段聚集成一组,组成一段弧。就也是通过搜索的方法找到连续的如下结构

如果有多条线段可以选择,采用一种像素投票机制,选择角度阈值内像素最多的线段。

如下图,相同颜色的线段组成了一组弧。

3. 生成初始 ellipse

选择任意两条弧线,只要满足一定的条件,那么这两个弧线就可能匹配组成一个椭圆。

找到所有的这样的一组弧以后,我们可以通过组成这些弧的所有像素点拟合出来一个椭圆(最小二乘法)。最后得到一个初始椭圆集。

4. 聚类

初始椭圆集里面,有很多相似的椭圆(椭圆心,长短轴,偏角都比较接近),对初始椭圆进行聚类,采用均值漂移聚类方法,对椭圆心,长短轴,偏角,分别进程聚类,得到更少,更具有代表性的椭圆。然后对这些椭圆进行最后的验证,筛选掉完整度不高的椭圆,得到椭圆检测的结果。

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

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

相关文章

【基于前后端分离的博客系统】Servlet版本

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一. 项目简介 1. 项目背景 2. 项目用到的技…

玩转ChatGPT:Transformer分类模型

一、写在前面 之前&#xff0c;我们介绍了Sklearn包以及Boost辈的各种分类模型&#xff0c;这些模型都很经典了&#xff0c;实际上也很强大&#xff0c;比如说Xgboost。 然而&#xff0c;近期随着ChatGPT的大火&#xff0c;其底层框架Transformer也逐渐火了&#xff0c;现在大…

分析和解决java.lang.OutOfMemoryError: Java heap space问题

这里写目录标题 问题场景问题分析与解决1.优化项目代码2.提升Java heap size3.JVM参数配置配置参考堆区参数配置说明非堆区参数配置说明 问题场景 最近客户反馈在生产环境导入操作时遇到任务一直执行中&#xff0c;并且入库的数据量一直不改变。通过日志查询&#xff0c;终于定…

UE4蓝图学习篇(九)-- 人物重定向

在平常的游戏制作或者项目练习过程中&#xff0c;我们想使用其他比较好看的模型&#xff0c;但是却想使用小白人的动画&#xff0c;这个时候要怎么去处理呢&#xff1f; 这个时候就需要使用到重定向功能&#xff0c;让两者使用同一套骨骼&#xff0c;把小白人动画重定向到我们…

IMX6ULL裸机篇之I2C相关寄存器与AP3216C传感器

一. I2C实验 I2C时钟选择与传输速率 1. IMX6ULL的 I2C频率标准模式 100kbit/S&#xff0c;快速模式为 400Kbit/S 2. 时钟源选择 perclk_clk_rootipg_clk_root66MHz&#xff08;由之前的时钟实验章节可以知道是 66MHz&#xff09;。 二. I2C 寄存器配置 I2Cx_IFDR寄存器&…

常见的内存泄漏场景

console导致 console导致的内存泄漏 因为打印后的对象需要支持在控制台上查看&#xff0c;所以传递给console.log方法的对象是不能被垃圾回收的。我们需要避免在生产环境用console打印对象。 定时器 在组件初始化的时候设置了setInterval&#xff0c;那么在组件销毁之前记得…

张驰课堂:深入了解六西格玛绿带培训课程大纲的应用价值!

六西格玛绿带培训课程大纲的内容通常包括以下几个方面&#xff1a; 六西格玛介绍&#xff1a;介绍六西格玛的历史、目标和应用领域&#xff0c;以及其在质量管理中的作用。 统计学基础&#xff1a;介绍基本的统计概念和方法&#xff0c;包括描述统计、概率分布、抽样和检验等…

SpringBoot定义优雅全局统一Restful API 响应框架五

闲话不多说&#xff0c;继续优化 全局统一Restful API 响应框架 做到项目通用 接口可扩展。 如果没有看前面几篇文章请先看前面几篇 SpringBoot定义优雅全局统一Restful API 响应框架 SpringBoot定义优雅全局统一Restful API 响应框架二 SpringBoot定义优雅全局统一Restful…

开发微信小程序,常用的开发组件有哪些?

随着微信小程序开发的持续升温&#xff0c;小程序开发也变得越来越流行&#xff0c;因为小程序不仅能帮助企业解决推广的问题&#xff0c;还能为企业带来可观的收益。但是很多企业并不知道如何开发微信小程序&#xff0c;而市面上的开发组件又有很多种&#xff0c;不知道怎么选…

restful相关知识

一. 接口编程简介 1 背景 ​ 随着互联网的发展, 尤其是移动互联为代表的Web3.0时代. 客户端层出不穷, 以APP、微信、PC浏览器为代表, 服务端业务逻辑是基本一致的. ​ 那么有没有一种方式可以做到”一次编写,随时接入”呢? 目前比较流行的方案就是"接口编程" 2 …

DevOps - (3)使用SOPS 和Terraform来加密/解密敏感信息文件

一&#xff1a;背景 每个人都想将自己的敏感数据以加密格式存储在一个安全的地方。例如我们的数据库的账号密码&#xff0c;不能以纯文本的方式来记录。让我们利用Mozilla SOPS以一种安全的方式实现它。SOPS支持将文件加密为二进制文件&#xff0c;除此之外&#xff0c;它还具…

尘埃粒子计数器 审计追踪 权限管理 洁净室等级确认干货分享

尘埃粒子计数器实用干货汇总 随着我国医药行业的不断发展&#xff0c;越来越多的医药企业需要应用洁净技术以达到控制实验室安全卫生的目的。在医药、电子、机械微生物等行业中&#xff0c;需要严格把关空间的洁净度以符合相关的标准和产品的质量。其中包括对各种洁净等级的工作…

Qt 助手简介

在探讨Qt帮助框架之前&#xff0c;我们先了解一下Qt帮助文档&#xff0c;可以让大家更好的理解。 当你使用Qt时&#xff0c;你可能会发现Qt帮助文档是一个非常有用的资源。Qt帮助文档提供了关于Qt框架和其各种组件的详细信息&#xff0c;包括类和函数的文档、示例代码和教程等…

抖音seo系统源码*SaaS+部署搭建(开源)

抖音seo源码&#xff0c;抖音seo系统源码&#xff0c;抖音seo系统搭建&#xff0c;部署 抖音作为一个全球性的短视频平台&#xff0c;用户数量已经超过了10亿。这也给企业带来了巨大的发展机遇。为了吸引更多的用户&#xff0c;企业可以通过抖音seo源码来提高自己的搜索引擎排…

有没有什么好的C++项目推荐?

据我粗略估计&#xff0c;问我“有没有什么好的C项目推荐“这个问题出现的频率仅次于“问我帅不帅“。 「C」是一门贴近底层的语言&#xff0c;不像「Java」那样能够快速搭建一个业务系统&#xff0c;比如「XX」秒杀系统、「XX」电商系统这种看着“高大上“的项目&#xff0c;「…

python按行写入json文件,每一行都是一个标准json对象,但是整体文件却非json对象

今天这篇文章主要是一个小小的偏向于应用的实践&#xff0c;为啥会写这个&#xff0c;还要回溯到2017年&#xff0c;那时候做项目的时候有一个是要做数据处理分析的工作&#xff0c;给到我的数据集我拿到的时候总觉得怪怪的&#xff0c;每一行都是一个字典对象&#xff0c;但是…

聊聊部署在K8S的项目如何获取客户端真实IP

前言 最近部门有个需求&#xff0c;需要对一些客户端IP做白名单&#xff0c;在白名单范围内&#xff0c;才能做一些业务操作。按我们的部门的一贯做法&#xff0c;我们会封装一个client包&#xff0c;提供给业务方使用。&#xff08;注&#xff1a; 我们的项目是运行在K8S上&a…

LAMP的实战应用之部署wordpress论坛,并实现正常访问登录论坛

目录 环境配置&#xff1a; 一、安装配置基础环境 步骤一&#xff1a;配置本地yun 步骤二&#xff1a;安装Remi 仓库配置包&#xff08;清华源获取&#xff09; 步骤三&#xff1a;配置Remi 仓库配置包 步骤四&#xff1a;安装php的加速器配置 步骤五&#xff1a;启动服…

Cesium实战 - 实现大气云层效果

Cesium实战 - 实现大气云层效果 Cesium 实现大气云层效果主要思路核心代码在线示例 Cesium 实现大气云层效果 在实际开发中&#xff0c;一般会有天气的效果&#xff0c;雨雪雾比较常见&#xff0c;相关的博客也很多&#xff0c;但是关于云层的天气效果还是比较少&#xff0c;而…

【调峰】储能辅助电力系统调峰的容量需求研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…