⛄一、简介

1 仪表示数识别流程
基于刻度准确定位的指针式仪表示数识别方法包括预处理、指针检测、刻度定位、油位计表盘中心拟合与仪表读数计算5个部分。该方法无需预先添加任何表盘信息,算法流程如图2所示。整个流程分为两步且同时进行——第1步,将油位计图像进行灰度化和边缘检测等预处理,再通过指针检测获得油位计的指针信息,其中指针检测又包括概率霍夫变换检测和指针位置的计算;第2步,将原图进行灰度化、二值化和膨胀腐蚀等预处理,再经过刻度定位(刻度定位包括粗识别和细识别),使得预处理后的图像先经过粗识别粗略定位出所有可能包含油位计刻度的区域,再单独截取出粗识别的结果并进行细识别,定位出刻度,获得计算所需要的圆心信息和刻度信息,最终结合这两步计算出读数。

图2 文中算法流程

2 预处理
在用无人巡检机拍摄油位计图片时,由于表盘自身信息干扰或光照变化等因素的影响,无法准确提取出有用的仪表信息,从而会影响仪表读数的计算。因此,在提取指针区域之前必须对图像进行预处理以去除部分噪声,为后续指针识别和刻度定位信息的精确提取提供清晰的图像,以获得精度更高的指针式仪表读数。

2.1 二值化
指针式仪表通常暴露在室外,再加上工业生产中的光线变化及油位计自身表框或周围仪器的遮挡产生的阴影,巡检机器人采集到的图像很可能是部分阴影、部分光亮的表盘图片。为了后续精确定位刻度和提高计算效率,需要对彩色的油位计图像进行二值化处理,去除对提取表针有干涉影响的背景。图像的二值化处理就是把图像中的像素按照给定的阈值分化成黑白两种颜色。

2.2 膨胀腐蚀
为消除表盘噪声点和非实心区域,同时尽量避免对表盘内部的实心刻度与指针信息造成影响,文中采用形态学处理中的膨胀和腐蚀操作对二值化表盘图像进行预处理,具体步骤如下:首先对二值化图像的白像素进行膨胀,消除孤立噪声点和非黑的实心图像区域;然后对膨胀后的图像进行腐蚀,将被压缩的黑色部分近似恢复到原来的大小,还原表盘有效信息。

2.3 边缘检测
为了后续表盘指针的精确识别,需先将表盘图像转化为灰度图后再进行边缘检测。目前较为主流的边缘检测算子主要有Canny算子、Laplace算子、Roberts算子、Sobel算子等。而在所有的边缘检测算法中,Canny边缘检测不但定义严格,还具有实现过程简单、检测可靠性高等优点,因此文中选择Canny检测算法来进行油位计图像的边缘检测,结果如图5所示。

3 指针检测与刻度定位
通常指针直线检测都是采用霍夫变换进行的,然后直接选择矩形刻度的几何中心来计算表盘读数。在拍摄角度倾斜过大的情况下,矩形宽刻度将会被部分遮挡,使得刻度大小不一,且直接选择矩形刻度的几何中心计算刻度时会产生较大的误差,所以文中先用矩形刻度的几何中心拟合出一个粗略的圆心,然后选择每个刻度距粗略圆心较近的两个角点的中点来计算油位计读数,同时对该粗略圆心进行修正。

3.1 指针检测
霍夫变换一直是直线检测中比较流行的方法,其通过两个坐标空间之间的变换,将图像中直线上的所有点都在变换空间的某个点上形成峰值。但是传统的霍夫变换无法检测出油位计指针的方向。文中采用累计概率霍夫变换(Progressive Probabilistic Hough Transform,PPHT来提取指针。累计概率霍夫变换算法是标准霍夫变换算法的一个改进,它在一定的范围内进行霍夫变换,算出独立线段的范围和方向,可以实质性地减少计算时间,运行效率很高。由于油位表的指针较粗,将检测出两条线段,并且累计概率霍夫变换检测出的结果是一条直线上的两个点,这两条直线的交点即为指针针尖,指针的指向即为从圆心到针尖的方向。文中采取斜率为这两条直线斜率的平均值且穿过针尖的直线作为该油位计指针。累计概率霍夫变换检测是在油位计边缘检测的图上进行的,但是为了更显著地显示出累计概率霍夫变换的结果,文中将检测结果显示在原仪表图上,如图6所示。图6中共有4个点,这4个点即为指针累计概率霍夫变换检测的两侧直线的结果,图中所示的直线是穿过指针两侧直线交点且斜率为指针两侧直线斜率的平均值的直线,可认为这条直线是油位计指针所在的直线。

3.2 刻度粗识别与精准定位
在识别倾斜角过大情况下获得的油位计读数时,由于表盘内部信息(数字、符号、仪表编号、生产厂商等)的干扰,且矩形刻度并非水平,自身的旋转角度各不相同,使用传统方法在整个油位计表盘的图像中直接定位出油位计刻度位置较为困难。为此,文中提出一个先粗识别再精确识别并定位出刻度的方法,在识别倾斜角过大情况下获得的油位计示数时,也能准确地定位出油位计刻度的位置,并提取出刻度中更有利于抗角度干扰的后续计算读数所需的信息。

首先对油位计刻度进行粗识别,在膨胀腐蚀结果中寻找各个闭合形状的边缘点集,判断各个闭合区域的大小,设定最大阈值和最小阈值,将面积不属于该阈值范围内的区域过滤掉,然后求出该区域的最小外接矩形,将最小外接矩形的中心坐标保存在一个列表中。粗识别的结果如图7所示。此时保留的中心坐标包括了刻度外接矩形的中心坐标和一些干扰信息的中心坐标。为了去除这些干扰信息,以粗识别获得的最小外接矩形中心继续作为中心,略微扩大矩形框的长与宽,在对应表盘原图中截取如图8(a)所示的图片。对截取的图片使用Harris角点检测方法进行矩形检测,排除掉角点过多和角点无法形成矩形的图,得到真正的刻度。Harris角点检测结果如图8(b)所示。所得矩形刻度4个角点中,距离圆心较近的两个角点所对应线段的中点用于后续油位计读数的计算。

3.3 油位计表盘中心的拟合
在精确定位刻度之后,先用所有矩形刻度的几何中心拟合出一个粗略的圆心,获取每个矩形刻度的4个角点与该圆心的距离,距圆心最短的两个角点的连线中点构成一组坐标点。这组坐标有一个共同点,即该组坐标全部近似位于一个椭圆上,满足以下关系:

x2+Axy+By2+Cx+Dy+E=0 (1)

式中,A、B、C、D、E为椭圆的未知参数。通过最小二乘法对该组坐标进行拟合,得到目标椭圆,因此可设置目标函数F如下

在拍摄倾角过大时,拟合得到的椭圆圆心与指针并不在一条直线上,若将其直接用于计算读数,获取的油位计读数误差会较大。因此,选择圆心(xc,yc)距累计概率霍夫检测得到的指针直线方程上最近的一点作为真正用于计算的圆心(xt,yt)。

4 读数计算
传统方法[19]计算指针式仪表的读数时,一般通过Hough变换直线检测来获取正面圆盘图像的指针角度信息,在获得直线的角度后,即可计算出读数。假设:直线的角度为θ;最小刻度为kmin,对应的角度为θmin;最大刻度为kmax,对应的角度为θmax;读数用k表示。那么,k可由以下公式计算:

k=(kmax−kmin)×θ−θminθmax−θmin         (5)

但是,在拍摄角度倾斜较大的情况下,每两个相邻的刻度与圆心组成的夹角不是一个完全相等的值,也就是说,采集图像中的指针与刻度线的角度差有的偏小有的偏大。这将导致指针相对于每个刻度线的读数出现误差。对于传统方法,可以使用透视变换来对油位计的图片先进行校正。透视变换是将图片投影到一个新的视平面,拥有较高的灵活性。结合油位计的先验信息(起始刻度倾角与末位刻度倾角),即可用传统的方法计算出油位计的读数。但该方法需要预先选取4个点,而油位计表盘没有合适的参考点,因此需要手动选出4个点来校正表盘。而文中提出的油位计示数识别方法,无需对表盘进行校正也能准确地计算出读数。

文中读数计算方法的步骤如下:
步骤1 计算所有矩形刻度精确定位后所得坐标点与相邻两个坐标点的距离并求和;
步骤2 根据油位计表盘信息可得:距离和最大的两个点为0与10,且巡检机器人拍得的图片中0的纵坐标大于10的纵坐标,即可求得0与10坐标;
步骤3 接着计算与0距离最近的点,即为1,依次可将所有坐标点对应的数字一一求出;
步骤4 计算所有坐标点与指针针尖的距离,距离针尖最近的两个坐标点记为k1与k2(k1+1=k2);
步骤5 使用式(6)计算表盘读数k:

⛄二、部分源代码

function varargout = mytime(varargin)
% MYTIME MATLAB code for mytime.fig
% MYTIME, by itself, creates a new MYTIME or raises the existing
% singleton*.
%
% H = MYTIME returns the handle to a new MYTIME or the handle to
% the existing singleton*.
%
% MYTIME(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in MYTIME.M with the given input arguments.
%
% MYTIME(‘Property’,‘Value’,…) creates a new MYTIME or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before mytime_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to mytime_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE’s Tools menu. Choose “GUI allows only one
% instance to run (singleton)”.
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help mytime

% Last Modified by GUIDE v2.5 03-Sep-2022 08:44:17

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @mytime_OpeningFcn, …
‘gui_OutputFcn’, @mytime_OutputFcn, …
‘gui_LayoutFcn’, [] , …
‘gui_Callback’, []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT

% — Executes just before mytime is made visible.
function mytime_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to mytime (see VARARGIN)

% Choose default command line output for mytime
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);
% set(gcf,‘Name’,‘时钟识别’);
set(gcf,‘numbertitle’,‘off’,‘name’,‘时钟识别’);

% UIWAIT makes mytime wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% — Outputs from this function are returned to the command line.
function varargout = mytime_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

% — Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%%[filename,pathname]=uigetfile({‘.jpg’;'.bmp’;‘*.gif’},‘选择图片’);
%%if isequal(filename,0)
% disp(‘Users Selected Canceled’);
%else
%str=[pathname filename];
%im = imread(str);
%axes(handles.axes1);%axes1是坐标轴的标示
%imshow(im);
%end;
global im
global flag ;
flag = 1;
axes(handles.axes1);
im=imread(‘时钟-1.jpg’);
imshow(im);

% — Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global im
global flag ;
flag = 2;
axes(handles.axes1);
im=imread(‘时钟-2.jpg’);
imshow(im);

% — Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global im
global flag ;
flag = 0;
if(flag == 0)
flag = 3;
end
axes(handles.axes1);
im=imread(‘时钟-3.jpg’);
imshow(im);

function popupmenu2_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,‘String’)) returns popupmenu2 contents as cell array
% contents{get(hObject,‘Value’)} returns selected item from popupmenu2
global im
global BW
global BW1
global angle_m
global angle_h
BW = imresize(im,0.7); % initial picture 70%

[m,n]=size(BW); %图像去除背景
for i=1:m
for j=1:n
if BW(i,j)>100
BW(i,j)=256;
end
end
end
BW = im2bw(BW);%rgb转化为二值化图像
BW = imcomplement(BW); %图像反色
val = get(handles.popupmenu2,‘value’);
%选择骨架次数
switch val
case ‘1’
t=3;
case ‘2’
t=4;
case ‘3’
t=5;
case ‘4’
t=6;
case ‘5’
t=7;
case ‘6’
t=8;
otherwise
t=9;
end

⛄三、运行结果



⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 向友君,江文,阮荣钜.基于刻度准确定位的指针式仪表示数识别方法[J].华南理工大学学报(自然科学版). 2020,48(10)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

【时钟识别】基于matlab GUI Hough变换指针式时钟识别【含Matlab源码 2085期】相关推荐

  1. 【电力预测】基于matlab GUI灰色模型电力负荷预测【含Matlab源码 769期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [电力负荷预测]基于matlab GUI灰色模型电力负荷预测[含Matlab源码 769期] 获取代码方式2: 通过订阅紫极神光博客付费专 ...

  2. 【光学】基于matlab GUI菲涅尔系数计算【含Matlab源码 1165期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI菲涅尔系数计算[含Matlab源码 1165期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  3. php企业官网源码 响应式,基于ThinkPHP5框架开发的响应式企业官网PHP源码_PC端+WAP手机端自适应+TP企业官网建站系统...

    源码介绍 基于ThinkPHP5框架开发的响应式企业官网PHP源码,是一款基于ThinkPHP5.0.10内核开发的企业建站管理系统,非常适合企业拿来二次开发自己的企业官网系统.前端界面采用流行的bo ...

  4. 【缺陷检测】基于matlab GUI印刷电路板自动缺陷检测【含Matlab源码 1912期】

    ⛄一.印刷电路板自动缺陷检测简介 我国是PCB生产大国,据世界电子电路理事会WECC各协会统计[1],2007年中国大陆PCB产值占全球总产值的27.9%,仅一年时间就比2006年增长了17.0%.但 ...

  5. 【语音去噪】基于matlab GUI切比雪夫+椭圆形低通滤波器语音去噪【含Matlab源码 2198期】

    一.语音处理简介 1 语音信号的特点 通过对大量语音信号的观察和分析发现,语音信号主要有下面两个特点: ①在频域内,语音信号的频谱分量主要集中在300-3400Hz的范围内.利用这个特点,可以用一个防 ...

  6. 【图像修复】基于matlab GUI FMM+Criminisi算法彩色图像修复【含Matlab源码 1507期】

    一.FMM+Criminisi算法简介 1 FMM算法 FMM算法是由Telea在2004年提出的,主要思想是先处理待修复区域边缘的像素,然后逐步向内推进,直到所有空洞点修复完毕.设Λ为待修复区域, ...

  7. 基于matlab的串口通信,基于Matlab GUI的单片机串口与PC的通信 附源码

    我也是最近学习单片机和MATLAB的小白平时在看学习的时候 下载了一些有价值的参考文献 概述采用51单片机,atmel的STC89C52RC芯片,主要用到的是七段数码管用来做一个时钟,程序编写软件为k ...

  8. 简单物联网应用——基于老人居家声音监测系统(全!含完整源码、详细注释、测试结果、设计过程、视频详细教程)

    简单物联网应用设计与实现--基于老人居家声音监测系统 概述 设计内容: 采用标准的物联网三层架构, 感知层为可以检测声音数据并且实现无线发送的传感器节点: 网络层主要使用无线 WiFi: 应用层中, ...

  9. 【肌电信号】基于matlab GUI脉搏信号分析(去噪+特征提取)【含Matlab源码 862期】

    ⛄一.脉搏信号分析简介 人体脉搏信号是一种微弱信号, 信噪比较低.在检测和采集时, 由于受仪器.人体等方面的影响, 所采集的信号中常存在如下3种噪声:1) 基线漂移.人体呼吸等低频干扰, 频率小于1 ...

最新文章

  1. DBA_Oracle Database 11g 面向 DBA 和开发人员的重要特性
  2. VI常用使用命令 为初次接触VI 的兄弟们献微利
  3. apache2.2 虚拟主机配置
  4. 让乔布斯立足肩上的C语言之父
  5. 【Nutch2.2.1基础教程之2.1】集成Nutch/Hbase/Solr构建搜索引擎之一:安装及运行【单机环境】
  6. 机器学习 多变量回归算法_如何为机器学习监督算法识别正确的自变量?
  7. 依赖注入的三种方式_Java核心知识 Spring原理十 Spring 依赖注入四种方式
  8. unef螺纹_硬料怎么车螺纹?一文了解螺纹的分类及其刀具选择
  9. Android 系统(64)---Android中m、mm、mmm、mma、mmma的区别
  10. source insight 深色主题配置文件
  11. leetcode 1154 一年中的第几天
  12. 让你的网站首页自动选择语言转跳
  13. CentOS源码安装消息队列ActiveMQ
  14. Matlab绘制柱状图(含显著性差异*)
  15. svg元素 标签增加、移除class名
  16. android xposed miui9,vxposed在小米-安卓9上闪退
  17. 数学建模-层次分析法
  18. js 获取汉字首拼和全拼和拼音
  19. 维度表,实体表,事实表之间的关系
  20. Word输入的英文字体被默认为宋体并无法修改的解决办法

热门文章

  1. 今天,你想换工作了吗?
  2. 记2016.10.15百度面试经历,软件研发工程师
  3. Python简单工厂模式(超详细)
  4. 固安天地人计算机学校,河北固安县共有多少个学校?
  5. java打地鼠文本代码_Java编程实现打地鼠文字游戏实例代码
  6. css的基本语法与方法解释
  7. vue websocket 建立连接并添加心跳检测机制
  8. Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization论文阅读笔记
  9. Games104现代游戏引擎入门-lecture16游戏引擎的Gameplay玩法系统基础_AI Basic
  10. oomph! - Niemand