【MATLAB】椭圆检测(Ellipse Detection)算法(含代码)

您所在的位置:网站首页 椭圆MATLAB编程语言 【MATLAB】椭圆检测(Ellipse Detection)算法(含代码)

【MATLAB】椭圆检测(Ellipse Detection)算法(含代码)

2024-07-12 15:06| 来源: 网络整理| 查看: 265

椭圆检测(Ellipse Detection)算法 零、写在前面(2023年4月10日)一、文献与代码二、使用与实例三、进阶使用四、其他bilibili相关视频

by 今天不飞了

圆的物体,在实际拍摄中由于种种原因可能会变成椭圆,用圆拟合就不够准确。这里分享一篇文献中椭圆检测的方法(代码使用方法)。 在这里插入图片描述

零、写在前面(2023年4月10日)

我真的……为什么评论和私信还有人问我“求出来的椭圆在哪里呀?”你们到底在看什么。2.3分明写着“输出参数说明——ellipses是目标椭圆”,不知道椭圆数学表达式的就百度”

还有问“你这个代码能计算椭圆圆心吗?”,全篇都在检测椭圆,你猜呢?不懂就问可以,但毫不思考就问,是不是有点……

一、文献与代码 下载 Arc support Line Segments Revisited An Efficient High-quality Ellipse Detection[文献下载 ] [源码下载 ]编译 直接复制并修改(根据自己OpenCV和MATLAB路径版本等) 这里假设你的文件都在D盘,OpenCV使用2.4.9版本,那么编译方式如下 % 编译C++源码供MATLAB调用 mex generateEllipseCandidates.cpp... -ID:\opencv2\build\include... % 请使用你的OpenCV路径 -ID:\opencv2\build\include\opencv... % 请使用你的OpenCV路径 -ID:\opencv2\build\include\opencv2... % 请使用你的OpenCV路径 -LD:\opencv2\build\x64\vc11\lib... % 请使用你的OpenCV路径 -ID:\MATLAB\extern\include... % 请使用你的MATLAB路径 -LD:\MATLAB\extern\lib\win64\microsoft... % 请使用你的MATLAB路径 -lopencv_core249... % 请使用你的OpenCV版本 -lopencv_highgui249... % 请使用你的OpenCV版本 -lopencv_imgproc249... % 请使用你的OpenCV版本 -llibmwlapack.lib % 注意:替换的时候,不要把前面的 -I,-L,-l 删了

如果觉得麻烦,可以在文末链接直接下载。(已编译且内置动态库)

二、使用与实例 基本使用 编译完之后就可以直接使用论文提供的测试代码LCS_ellipse.m,运行前记得修改文件路径(文件名)。 主要函数有两个ellipseDetectionByArcSupportLSs.m,drawEllipses.m,也可以使用以下代码测试: % 这是论文自带的图片(可替换成你自己的) im = imread('.\pics\43.jpg'); % 论文检测椭圆的核心代码 [ellipses, ~, ~] = ellipseDetectionByArcSupportLSs(im, 120, 0.3, 0); % 输入输出后面会讲到 % 论文自带的显示结果的代码 drawEllipses(ellipses',im); 输入参数说明(除了第一个im,以外的三个)

Tac:椭圆完整度,测试代码如下 (为了更人性化进行了修改,可自定义颜色,如有需要文末有下载地址)

%% 第一个参数 Tac im = imread('.\pics\test1.png'); Tacs = [90,180,190,270,300,350]; for k = 1:6 % Tr统一用0.1 [ellipses, L, posi] = ellipseDetectionByArcSupportLSs(im, Tacs(k), 0.1, 0); subplot(2,3,k),drawEllipses(ellipses',im,[1,0,0]); % 为了使用方便进行了修改,可自定义颜色 title(['\fontsize{14}Tac = ',num2str(Tacs(k))]) end

实验结果如下,所以当你要找的目标是比较完整时,可以将Tac调大,从而达到剔除残缺椭圆的效果;反之你的目标可能被遮挡(只露出一部分时),可以将Tac调小,以确保不漏掉任何可能。 在这里插入图片描述

Tr:椭圆边缘点数量比列系数(用于判断构成一个椭圆的点数是否足够,不代表具体的值) 举例说明,如下图左边的椭圆Tr值就小于右边的椭圆(设置合适的Tr,就能剔除左边保留右边) 在这里插入图片描述 测试代码如下

%% 第二个参数 Tr im = imread('.\pics\test2.jpg'); Trs = [0.1,0.2,0.3,0.5,0.7,0.9]; for k = 1:6 % Tac统一用30 [ellipses, L, posi] = ellipseDetectionByArcSupportLSs(im, 30, Trs(k), 0); subplot(2,3,k) drawEllipses(ellipses',im,[1,0,0]); % 为了使用方便进行了修改,可自定义颜色 title(['\fontsize{14}Tr = ',num2str(Trs(k))]) end

实验结果如下,大致就是Tac取得越小,找到的椭圆越多,但“假目标”也越多。 在这里插入图片描述

sp:椭圆正负性,描述椭圆内外灰度情况(正-内亮外暗,负-外暗内亮),测试代码如下

%% 第三个参数sp if 1 im = imread('.\pics\test3.png'); sp = [1,-1,0]; for k = 1:3 [ellipses, L, posi] = ellipseDetectionByArcSupportLSs(im, 30, 0.2, sp(k)); subplot(1,3,k) drawEllipses(ellipses',im,[1,0,0]); % 为了使用方便进行了修改,可自定义颜色 title(['\fontsize{14}sp = ',num2str(sp(k))]) end end

实验结果如下,取1只搜索比背景亮的椭圆,反之只搜索比背景暗的椭圆,取0则全部搜索。 在这里插入图片描述

输出参数说明 ellipses:最终目标椭圆参数 E:优化后的边缘(仅椭圆目标) candidates:初始检测出的所有疑似椭圆目标(即优化前) % 这是论文自带的图片 im = imread('.\pics\43.jpg'); % 论文检测椭圆的核心代码 %% 输出参数 [ellipses, E, candidates] = ellipseDetectionByArcSupportLSs(im, 120, 0.3, 0); % 显示结果 figure,imshow(im) drawEllipses(ellipses',im,[1,0,0]); % 为了使用方便进行了修改,可自定义颜色 figure,imshow(E) drawEllipses(candidates',im,[0,1,0]); % 为了使用方便进行了修改,可自定义颜色

在这里插入图片描述

三、进阶使用

有时在复杂场景下,通过调节Tac,Tr,sp也不能定位到自己想要的“椭圆”时,可以对输出数据进一步筛选。

目标尺寸(长短轴绝对大小) 测试代码如下 im = imread('.\pics\filt1.jpg'); minsize = [30,40,50,60]; for k = 1:4 % 找到所有椭圆 [ellipses, L, posi] = ellipseDetectionByArcSupportLSs(im, 180, 0.3, 0); % 找到尺寸较小的 b = ellipses(:,4); % 短轴长 idx = find(b


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3