最近结合项目,研究了一下指针式仪表的自动读数算法,写了一套基于巡检机器人的指针式仪表检测和读数系统。简单总结记录一下。
1. 系统框架
需求很简单,在场景中寻找标定好的仪表 → 定位 → 拉近焦距 → 读数。硬件方面不用我管,大概写了一个简单的框架图,开始动手。
2. 界面和操作
用MFC写了一个标定界面,实现功能包括:
1. 读取、保存图像和标定的模板;
2. 简单地对图像进行一些基本的处理(如裁剪、划定区域、绘制辅助线、标定关键点等);
3. 修改模板具体参数;
4. 测试算法结果。
基本都是MFC的基本的控件、opencv中图像读取、处理和保存操作,需要提一点,在绘制辅助线和选取区域时需要调用ondraw函数实时对界面进行刷新。有了界面之后算法测试心情都舒畅些~ 行了,开始写算法。
3. 算法
现在这方面做的不多,据我知道也就鲁能科技再搞吧(不太确定)。不知道高手怎么做的,我的思路大概如下:
首先是寻找仪表,很简单,一个cvMatchTemplate了事。
然后是读数,这里我使用了SIFT+Homography对仪表表盘进行配准,使检测对样本和模板间光照,旋转和尺度变化具有较强鲁棒性。配准后使用hough变换检测目标中的直线,从长度、累计值、角度、对比度等方面设计函数,计算每条直线作为仪表指针的置信概率。得到概率最大的指针后,根据其到最小、最大值的相对角度计算其读数值。
4. 总结