【时钟识别】Hough变换指针式时钟识别【含GUI Matlab源码 2085期】

news2024/11/25 0:22:40

⛄一、简介

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 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DPDK技术原理概述

DPDK 基本技术指标准的 DPDK 数据平面开发包和 I/O 转发实现技术,本次将概述该部分的主要技术原理。 1 技术原理与架构 由于采用软件转发和软件交换技术,单服务器内部的转发能力是 NFV 系统的主要性能瓶颈。在各类高速转发的 NFV 应用中,数…

赣货通全球桥接江西制造全球开花,贸易强国供应链出海江西在奋进

“赣货通全球”平台是什么? “赣货通全球”平台是江西制造进入全球供应链的数字贸易平台,平台免费为江西制造打造永不落幕线上国际化“赣品展”。核心的后台功能为企业用户提供大数据获客及营销功能,同时为企业提供贸易全流程的第三方外贸综合服务&…

Ubuntu18.04复现mmdetection3d

文章目录一、环境搭建二、测试demo三、数据预处理四、训练参考一、环境搭建 从零配置深度学习环境参考:ubuntu18.04 AnnacondaCUDA10.2CuDNN7.6.5使用anaconda创建虚拟环境 conda create -n open-mmlab3d python3.8 conda activate open-mmlab3d安装torch 先从官网…

自然语言处理竞赛相关比赛项目、比赛经验、工具、算力平台资源分享

本资源主要收录NLP竞赛经验贴、通用工具、学习资料等,本项目源于2020年7月一次竞赛的经历,当时在找参考资料时遇到了很多困难,包括内容分散、质量不高等。2021年3月开始更新本项目,志在帮助NLPer提升模型性能。2021年6月开放本项目…

大一Web课程设计 基于HTML家乡主题网页项目的设计与实现——中国牡丹之都山东菏泽(6页)

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…

MySQL高级【索引概述索引结构】

目录 索引概述 无索引演示:一种表没有索引的查找方式 有索引演示:以二叉树进行演示 索引的优缺点 索引结构 二叉树: B-Tree(多路平衡查找树) BTree树 Hash数据结构 索引概述 索引它是一种有序的数据结构&…

测开真的是测试工程师的发展终点吗?

前言 在一线大厂,没有测试这个岗位,只有测开这个岗位,即使是做业务测试,那么你的title也是测开。 所以想聊一聊测开的看法,但不代表这是正确的看法,仅供参考。 没来阿里之前我对测开的看法 一直以为专职…

Docker入门 --- 简单安装及部署

Docker的简单安装及部署 文章目录Docker的简单安装及部署一、Docker概述1. 什么是Docker2. Docker架构3. DockerHub4. Docker运行模式5. Docker和虚拟机的区别二、安装Docker1. 环境准备2. 安装3. 配置镜像加速器三、Docker服务、镜像、容器命令1. 服务(进程)相关命令2. 镜像相…

【大数据处理技术】「#2」Hive数据分析

文章目录操作Hive简单查询分析测试简单指令查询条数统计分析关键字条件查询分析以关键字的存在区间为条件的查询根据用户行为分析用户实时查询分析操作Hive 启动Hive在“hive>”命令提示符状态下执行下面命令: hive> use dbtaobao; # 使用dbtaobao数据库 hi…

1.7 TCP粘包、缺包问题解决

文章目录1、TCP粘包问题1.1、客户端粘包现象1.2、服务端粘包1.3、粘包、缺包解决2、包头设计1、TCP粘包问题 1.1、客户端粘包现象 因为客户端有一个优化算法(Nagle), send(“abc”); send(“123”); send(“def”); 如果这三次发送非常紧密时间非常短,会…

一、Endnote简介

一、简介 1.Edit-Preference-Libraries:设置默认打开时的操作。(默认打开最近一次) 2.文献库的建立File-New 生成一个数据库文件和一个文件夹 3.在线数据库搜索 (1)设置不同的检索字段: (2&am…

零基础小白想学Python爬虫,但是不理解原理?5分钟带你理顺思路

很多人私信我,说自己是0基础学习Python,但是学爬虫的时候不太理解这个原理,下面我来给大家分享一下我的对Python爬虫的原理。 首先我们要知道什么是Python爬虫? 我们可以把互联网看成是各种信息的站点及网络设备在一起组成的一…

UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer

列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer 目录 列文章目录 前言 一、知识点提取汇总 二、案例需求分析 1、最终效果图 2、需求分解 三、程序分析 1、源码所在目录 2、主要功能分析 前言 随着工业智能化的不断发展,UG二次开发…

[1]物联网基础知识

前言 学习教程:B站太极创客,原教程采用的开发板为ESP8266,开发环境Arduino 本人使用开发板:ESP32S3,开发环境Vscode中的platformio,框架为Arduino 乐鑫科技:ESPRESSIF 注意:引脚…

机器人开发--CanOpen

机器人开发--CanOpen1 介绍1.1 概述1.2 应用2 历史发展3 协议3.1 协议细节(来自CiA文档)3.2 协议框架OSI 模型服务COB-IDNMTSYNC紧急事件对象 (EMCY)服务数据对象 (SDO)SDO 下载SDO 上传SDO 加速写传输报文过程数据对象PDO3.3 应用细节(伺服电…

基于springboot+mybatis+mysql+layui员工工资管理系统

基于springbootmybatismysqllayui员工工资管理系统一、目的二、需求功能划分系统结构设计软件界面截图三、系统开发配置一、目的 ​ 运用JavaEE企业级系统开发、数据库系统、面向对象技术及UML以及软件需求工程所学专业知识,解决所设定业务领域软件开发中的需求分析…

2021一带一路暨金砖大赛之企业信息系统安全赛项AWD_writeup

更多详情私聊博主 订阅专栏解锁更多~~觉得不错麻烦点个赞~~~ AWD_writeup 主要考点:后门账户、数据库操作、cve漏洞、后门漏洞、自动化攻击 1、解法一 ssh弱口令账户 用户登录后cat /etc/passwd 发现系统存在额外账户 使用msf进行ssh爆破尝试 msfconsole use auxiliary/sca…

洛谷 最长公共子序列

LCS 题面翻译 题目描述: 给定一个字符串 sss 和一个字符串 ttt ,输出 sss 和 ttt 的最长公共子序列。 输入格式: 两行,第一行输入 sss ,第二行输入 ttt 。 输出格式: 输出 sss 和 ttt 的最长公共子序…

程序的动态链接(4):动态链接信息

前言 操作系统在执行动态链接的可执行文件时,会首先加载动态链接器,然后由动态链接器根据保存在可执行文件中的动态链接信息,完成依赖动态库的加载、符号解析以及重定位等工作。这些动态链接信息包括但不限于: 动态链接器路径&a…

联邦调查局和国际执法合作加强打击非法DDS攻击

©网络研究院 美国司法部在12月14日查封了48个出售“booter”或“stresser”服务的域名,这些服务使非技术用户可以轻松、廉价地发起强大的分布式拒绝服务(DDoS)攻击,旨在离线攻击目标。 司法部还指控六名美国男子犯有计算机罪,他们涉嫌…