椭圆检测(Ellipse Detection)算法
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