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

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

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 AAMED

	imgC = 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 cv2

imgC = 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);
    end
    
    return;
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算法及相关数据集的使用方法,提供了验证准则,标记工具,数据可视化等相关工具,方便后续研究者研究本方向时使用。

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

评论 56
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值