在之前博客椭圆检测 2020:Arc Adjacency Matrix-Based Fast Ellipse Detection介绍的基础上,我们针对其公开的源代码进行说明,介绍如何使用其提供的数据集和源代码。

文章目录

  • 1 编译源码
    • 1.1 在Windows上编译
    • 1.2 在Ubuntu上编译源码
    • 1.3 编译可在Python上运行的代码
    • 1.4 编译可在MATLAB上运行的代码
  • 2 椭圆标记工具
  • 3 AAMED 数据可视化工具
  • 4 9个公开数据集
  • 5 评价工具
    • 5.1 补充读取自己算法的检测方法
    • 5.2 配置验证主函数文件
  • 6 制作自己的数据集
  • 总结

1 编译源码

此代码在开发过程中使用的是opencv3.1,测试opencv3.4也能用,其源码内主要基于opencv的一些基本函数,基本上各个版本都通用。

1.1 在Windows上编译

在windows上编译时,其源码依赖的是VS2015,创建一个VS项目,注意选择项目为64位,并配置好OpenCV的环境,也就是包含目录,库目录,附加依赖项

这些结束后,要将代码全部导入到工程中,右键解决方案资源管理器中的头文件,选择添加→现有项,把所有头文件添加进去,同理,右键源文件,添加所有cpp文件添加进去。

解决这些事情之后,编译项目即可,main.cpp提供了一个示例。

#include "FLED.h"
int main()
{string imgPath = "002_0038.jpg"; //图片路径Mat imgC, imgG;// 初始化AAMED算法,指定drows=540,dcols=960,// 切记,drows和dcols一定要大于所有待检测图像的行数和列数AAMED aamed(540, 960); // 参数设置,第一个参数控制曲线弯曲程度,目标更像是一个圆的话,可以将这个设置的更低些。// 第二个参数(其实没啥用了,敏感度分析已经说明这个参数不敏感了)// 主要是第三个参数,如果目标缺失较大,则设置的小些,如果几乎无缺失,大些即可。aamed.SetParameters(CV_PI / 3, 3.4, 0.77); // config parameters of AAMEDimgC = cv::imread(imgPath);cv::cvtColor(imgC, imgG, CV_RGB2GRAY);aamed.run_FLED(imgG); // 执行算法,可以直接放在循环中检测多张图片。cv::Vec<double, 10> detailTime;aamed.showDetailBreakdown(detailTime); // 展示每个阶段所用的时间aamed.drawFLED(imgG, ""); // 绘制结果aamed.writeDetailData(); // 保存关键数据,用于AAMEDViewer分析数据用cv::waitKey();return 0;
}

1.2 在Ubuntu上编译源码

在Ubuntu上的代码编译使用了cmake,源码中已经提供了CMakeLists.txt文件,具体流程如下。

cd AAMED/cmake-build
cmake ..  # 生成Makefile文件
make
./AAMED # 执行算法

1.3 编译可在Python上运行的代码

先进入python文件夹中,同样的,先配置OpenCV路径,在setup.py中,修改opencv_include, opencv_lib_dirs,并在 ext_modules 中配置库文件libraries=['opencv_world310']

opencv_include = "D:/opencv3.1/opencv/build/include"
opencv_lib_dirs = "D:/opencv3.1/opencv/build/x64/vc14/lib"

然后在当前文件夹中执行,即可开始编译AAMED算法

python setup.py build_ext --inplace

我是在Windows上平台编译的,编译之后会生成一个pyAAMED.cp36-win_amd64.pyd文件,这个文件就是可在python上执行的包。

test_aamed.py提供了一个测试说明,用法跟C++用法相似。

from pyAAMED import pyAAMED
import cv2imgC = cv2.imread('002_0038.jpg')
imgG = cv2.cvtColor(imgC, cv2.COLOR_BGR2GRAY)
aamed = pyAAMED(600, 600)
aamed.setParameters(3.1415926/3, 3.4,0.77)
res = aamed.run_AAMED(imgG)
print(res)
aamed.drawAAMED(imgG)
cv2.waitKey()

下面是一个图片的检测示例。

1.4 编译可在MATLAB上运行的代码

先配置OpenCV环境,查看setup.m,修改之后执行即可。setup.m调用了mex工具,如果是第一次使用mex,请先配置mex的C++编译工具。编译通过之后,将会生成如下4个文件。

test_aamed.m是一个示例。

clc;clear;close all;
obj = mexAAMED(540, 960);
mexSetAAMEDParameters(obj, pi/3, 3.4, 0.77);
figure;
img = imread('139_0018.jpg');
img = rgb2gray(img);
detElps = mexdetectImagebyAAMED(obj, img);
imshow(img); hold on;
plot_aamed_res(detElps)
hold off;
% 释放内存,如果不调用这个代码,AAMED算法内存将一直在MATLAB中无法释放,只能重启软件才能消失
mexdestoryAAMED(obj);

2 椭圆标记工具

最早在2012年Prasad的文章中,给了一个标记工具,但是其标记小椭圆时误差较大,而且无法放大,图片,我们自己开发了一个标记工具。

先调用setup.m编译椭圆拟合函数,生成mexElliFit.mexw64,然后执行main.m即可启动这个工具,下面是使用时候这个软件的界面。


下面给出这个软件的具体用法。

  • 单张图片标记模式

    • 点击Open an Image 打开一张图片

    • 选择Select Points 开始选择标记点 (快捷键s,一定要点在GUI界面上,不要点在图像上,否则快捷键可能失效)

    • 在图像上开始选点,因为椭圆拟合需要6个点,因此选择6个点之后,会有个拟合出来的椭圆。

    • 6个点之后,会给1秒的时间判断这个椭圆是否符合需求

      • 如果这个椭圆满足需求,请在1秒内按下空格键
      • 如果这个椭圆不满足需求,在1s之后继续点击其他点,重新进行拟合
      • 如果想取消这次选择,请在1s之后点击之前点过的点即可(比如之前点过一个坐标为(1,2)的点,再点击这个点即可取消)
    • 按下回车之后,拟合出的椭圆参数将会自动保存到图片路径下,也可以点击Save保存数据。

  • 批量图片标记模式
    • 点击Open a Folder,选择一个包含待标记的图片的文件夹
    • 点击列表中的某个图片进行标记,有快捷键(a,d)切换上下张图片
    • 进行单张图片的标记,标记方法如上面介绍的一样

一些操作技巧: 可以使用菜单栏中的放大镜对图片进行放大和缩小,使用小手图标进行拖动。

3 AAMED 数据可视化工具

这个工具用来展示算法中涉及到的几个核心数据,edge contours(边缘轮廓), DP contours(多边形逼近轮廓),arc contours(分割出的椭圆弧段),AAM矩阵和检测结果。

一般导出这些参数在matlab上进行开发,函数测试无误后再转到C++中。

在C++中调用如下函数生成对应的数据文件。

aamed.writeDetailData(); // 保存关键数据,用于AAMEDViewer分析数据用

先执行setup.m 编译出数据读取函数mexcvtBasicData, mexcvtRRect, mexcvtVVP, mexcvtAAM,然后使用main.m文件读取生成的DetailAAMED.aamed文件,下面是调用生成的数据,可视化的结果。

4 9个公开数据集

椭圆检测中,目前为止,提供了3个真实数据集和2个仿真数据集,论文在此基础上补充了2个卫星数据集和2个仿真数据集。

数据集传到了百度云上,连接为https://pan.baidu.com/s/1vUx7d3mvRxIPGSwi8DLADg,验证码 7br2

5 评价工具

代码提供了算法的验证工具,用于衡量检测结果和真值的差异,同样需要先运行setup.m编译一些用于计算重合度的函数基本库文件。

然后,下面说明如何使用这个工具

5.1 补充读取自己算法的检测方法

读取结果主要是获取一个数据集上,每个图片的对应检测结果,结果用cell文件存的。

  • filepath:表示结果文件夹路径
  • imgname:表示所有图片的文件名
  • dataset_name:算法名

下面,按照如下格式,在Read_Ellipse_Results.m上添加下面一段代码,每张图片的读取方法由用户自定义。

if strcmp(dataset_name, 'aamed')for i = 1:imgnum% 读取一张图片的检测结果,并存入elps_data中dt_elps{i} = elps_data;fclose(fid_dt);endreturn;
end

5.2 配置验证主函数文件

在文件MeasureAllDatasets.m中已经提供了验证算法的一个主函数,其中有几个变量需要明确说明下。

  • data_root_path:数据集根目录地址
  • dataset_name:数据集名称,也就是数据集文件夹的名称
  • gt_label:数据集对应的缩写,每一个元素与dataset_name中的元素一一对应,用于在文件Read_Ellipse_GT.m中读取数据集的真值。
  • methods_name:要验证的算法名称,当前算法的检测结果放在这个文件夹名称里。
  • method_label:算法的缩写名称,用于在文件Read_Ellipse_Results.m中读取算法的检测结果
  • T_overlap:重合度阈值,大于这个阈值则表示为真椭圆,否则为虚假椭圆。


6 制作自己的数据集

制作数据集方法很简单,步骤如下所示。

  • 在数据集根目录下创建一个文件夹,命名为A(A表示数据集名称,根据实际需求更换)
  • 创建images文件夹,放入所有图片,格式可以不唯一
  • 创建图像名称文件imagenames.txt,里面存储了images下所有图片的名称
  • 创建文件夹gt,存储图片的真值数据
  • 在Read_Ellipse_GT.m中补充该数据集真值读取部分

总结

本博客仅提供了AAMED算法及相关数据集的使用方法,提供了验证准则,标记工具,数据可视化等相关工具,方便后续研究者研究本方向时使用。

这些工具在实际项目开发中起到了很大的作用,如果对相关工具有改进意见或者需要补充其他工具,欢迎指出,我将尽可能对其进行补充。

椭圆检测 Arc Adjacency Matrix-Based Fast Ellipse Detection 代码和数据集使用教程相关推荐

  1. 论文阅读——椭圆检测 2020:Arc Adjacency Matrix-Based Fast Ellipse Detection

    这是一篇基于边缘连接方法的椭圆检测算法AAMED<Arc Adjacency Matrix-Based Fast Ellipse Detection>,核心思想是使用弧段邻接矩阵获得所有弧 ...

  2. 论文阅读——椭圆检测算法 2018 使用梯度分析利用错误检测控制的精确椭圆检测

    本文是2018年<Pattern Recognition>期刊(2区SCI)上的一篇文章,是最新的椭圆检测,论文题目为<Accurate detection of ellipses ...

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

    椭圆检测(Ellipse Detection)算法 一.文献与代码 二.使用与实例 三.进阶使用 四.其他 bilibili相关视频 by 今天不飞了 圆的物体,在实际拍摄中由于种种原因可能会变成椭圆 ...

  4. 论文阅读——椭圆检测 2016 Robust ellipse detection with Gaussian mixture models

    这篇文章是16年发表的椭圆检测文章,论文题目为:<Robust ellipse detection with Gaussian mixture models>,发表在<Pattern ...

  5. 椭圆检测(Ellipse Detection)算法

    ---------------- 版权声明:本文为CSDN博主「今天不飞了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.cs ...

  6. 基于opencv的一种快速有效椭圆检测方法

    本篇介绍的椭圆检测方法来自以下论文,论文作者提供了测试代码.本文主要是对这个方法做出详解. 参考论文:A fast and effective ellipse detector for embedde ...

  7. 【图像检测】基于计算机视觉实现椭圆检测附matlab代码

    1 内容介绍 Hough变换在图像处理中占有重要地位,是一种检测曲线的有效方法.但使用传统的Hough变换来检测椭圆具有存储空间大计算时间长的缺点.为此提出了一种新的基于Hough变换的椭圆轮廓检测方 ...

  8. 开源、快速、高精度的椭圆检测—你值得拥有!

    点击我爱计算机视觉标星,更快获取CVML新技术 在很多计算机视觉任务中需要用到形状分析,尤其是直线检测和圆检测用的最多.比如工业检测中检测元器件(OpenCV中有经典的电阻电容识别的例子),生物图像检 ...

  9. QT+opencv学习笔记(5)——霍夫直线检测、圆检测及椭圆检测

    开发环境为:win10+QT5.8+opencv3.2 Hough变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛.最基本的Hough变换是从黑白图像中检测直线,还可以经过改进检测圆.椭 ...

  10. python椭圆特征识别_opencv python中的椭圆检测

    Xie,Yonghong和Qiang Ji制作的skimage中有另一种替代方法,并出版为- "A new efficient ellipse detection method." ...

最新文章

  1. LNMP安装与启动脚本编写
  2. Hexo博客NexT主题美化之文末统一添加“本文结束”标记
  3. 浏览器和迅雷简单拿到动漫妹子图
  4. p,v原语解决和尚挑水问题
  5. [HAOI2015]树上操作
  6. NVelocity的宏使用
  7. 一个分支强制替代另一个分支
  8. sql not exists用法_SQL Server 2012 高级用法(一)
  9. java 字符串每隔两位插入一个字符
  10. 报表默认执行查询及汉字无法查询原因处理
  11. 河南oracle客户端,解决Oracle监听服务报错
  12. CCF201604-2 俄罗斯方块(100分)
  13. 立帖为据,每日学习一课编程技术
  14. 雷锋科普:联发科MT6577,国产平民双核手机的芯
  15. 马云:我肯定是12x12,你们却在纠结不能996
  16. 【分布式版本控制系统】GIT 托管网站 客户端
  17. FCPX插件:15种棱镜折射图文展示介绍动画效果 Prism Slideshow
  18. 有道 linux 安装路径,「Linux」- 安装有道词典
  19. 解析几何----拉格朗日乘数法在解析几何中的应用
  20. java atd_Android R.java问题汇总

热门文章

  1. 攻防世界-web-mfw
  2. WIN10任务栏卡死,鼠标一直转圈(亲测有效)
  3. Elasticsearch 搜索引擎开发实战
  4. 修改无线网密码后服务器拒绝访问,路由器重设密码怎么上不了网
  5. 特征级融合_自动驾驶系统入门(七)- 多传感器信息融合(MSIF)
  6. Linux regulator框架理解及使用
  7. OpenCV(三)彩色图灰度化、通道分离、单通道反差处理(灰度图)、多通道反差处理(彩色图)
  8. 凸优化(一)绪论与凸集
  9. 【摘抄】领导力21法则-约翰·C·马克斯韦尔
  10. android 源代码 毛笔,android中实现毛笔效果(View 中绘图)