基于深度学习的指针式仪表倾斜校正方法——论文解读

news2024/11/18 9:24:09

中文论文题目:基于深度学习的指针式仪表倾斜校正方法

英文论文题目:Tilt Correction Method of Pointer Meter Based on Deep Learning

周登科、杨颖、朱杰、王库.基于深度学习的指针式仪表倾斜校正方法[J].计算机辅助设计与图形学学报, 2020, 32(12):9.DOI:10.3724/SP.J.1089.2020.18288.

一、摘 要:

       针对仪表图像自动识别中倾斜仪表产生的读数误差,提出一种基于深度学习的圆形指针式仪表快速倾斜校正方法,可以实现仪表图像的倾斜校正和旋转校正,该方法利用卷积神经网络提取以表盘刻度数字为中心的关键点并采用最小二乘法对关键点进行椭圆拟合

        结合椭圆变换理论使用透视变换对仪表图像进行第 1 次倾斜校正,再根据一对关于仪表竖直中轴线对称的关键点计算仪表相对于水平方向的旋转角度,以拟合椭圆的几何中心为旋转中心旋转仪表图像实现第 2 次校正

        在变电站真实环境下采集图像数据,验证方法性能,实验结果表明,该方法相对于传统方法鲁棒性更好,校正有效率达到 100%,平均校正时间为0.45 s,满足实时校正需求,识别校正后的仪表图像读数的平均相对误差降低到 3.99%平均参考误差降低到 0.91%,充分显示该校正方法的有效性. 

        针对现有的指针式仪表倾斜校正方法不能同时实现仪表的倾斜校正和旋转校正,并且在校正过程中速度较慢、效果较差等问题,本文提出一种基于深度学习的指针式仪表倾斜校正方法。

二、算法检测流程

该方法分为 2 个部分:

        表盘关键点提取和仪表校正在仪表的关键点提取中,利用端到端的深度学习算法 YOLOv3 提取表盘上的以刻度数字为中心的关键点坐标。(可以网上找到仪表的图自己训练,目前没有找到作者公开的代码及数据)

关于关键点检测的方法网上资料很多,这里不做过多说明

例如下面的参考链接,提供了人脸关键点的训练方法以及检测流程

同时还提供了详细的代码和数据集

人脸与关键点检测:YOLO5Face实战_yolov5face_烧技湾的博客-CSDN博客

        仪表校正又分为倾斜校正和旋转校正,首先根据提取的关键点坐标计算透视变换矩阵,然后透视变换实现仪表的第 1 次倾斜校正:再根据图像上的一对以表盘竖直中轴线对称的关键点旋转图像实现仪表第 2 次旋转校正,图所示为本文仪表图像倾斜校正的框架图 。

三、检测效果及验证

         最后,为了验证本文校正方法相对于传统仪表校正方法[12,13]具有更好的稳定性和有效性,选择 10 幅变电站真实环境下采集的倾斜仪表图像进行实验校正.校正后的图像效果如图 12 所示,校正效率和时间如表3所示:其中有效率的统计中认为校正后的图像相对于原图有较大的比例尺度改善且可用于仪表读数,则视为校正有效.如图 12所示,部分图像经过透视变换后相对于原图像发生更大的形变,则视为校正无效,如图 12b 所示后7 幅图像及图 12c 所示后 5 幅图像 .

四、结语

        指针式仪表图像的倾斜校正是仪表读数识别研究中的一项重要任务,针对传统的图像校正方法难以满足复杂环境中仪表的校正任务,本文提出一种基于深度学习的指针式仪表倾斜校正方法该方法通过深度卷积神经网络提取表盘上以刻度数字为中心的关键点,然后根据关键点信息同时实现了仪表图像的倾斜校正和旋转校正.实验结果表明,与传统校正方法相比,本文校正方法能够得到更好的仪表校正效果,识别校正后的仪表图像提高了读数的准确度.在变电站及工业环境中采集的仪表图像会出现各种各样的倾斜,通过本 文方法倾斜校正后再识别仪表图像,提高了读数准确度,具有实用价值。

五、拓展,基于SIFT特征的仪表倾斜校正方法(opencv python代码)

import numpy as np
import cv2
from matplotlib import pyplot as plt
#参考链接
#https://www.javaroad.cn/questions/347518#toolbar-title

# FIXME: doesn't work
def deskew():
    im_out = cv2.warpPerspective(img1, M, (img2.shape[1], img2.shape[0]))
    plt.imshow(im_out, 'gray')
    plt.show()


# resizing images to improve speed
factor = 0.4
img1 = cv2.resize(cv2.imread("./img/zheng2.png", 0), None, fx=factor, fy=factor, interpolation=cv2.INTER_CUBIC)
img2 = cv2.resize(cv2.imread("./img/xie2.png", 0), None, fx=factor, fy=factor, interpolation=cv2.INTER_CUBIC)

#有专利,SURF_create,SIFT_create可以直接跑
'''
1. 卸载已有安装opencv-python:

      pip uninstall opencv-python

2. 安装opencv-contrib-python  3.2版本以下:

      pip install opencv-contrib-python==3.4.2
也可以不降低版本号,进行编译,详细流程见链接
https://blog.csdn.net/m0_50736744/article/details/129351648

'''
surf = cv2.xfeatures2d.SIFT_create()
kp1, des1 = surf.detectAndCompute(img1, None)
kp2, des2 = surf.detectAndCompute(img2, None)

FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)

# store all the good matches as per Lowe's ratio test.
good = []
for m, n in matches:
    if m.distance < 0.7 * n.distance:
        good.append(m)

MIN_MATCH_COUNT = 10
if len(good) > MIN_MATCH_COUNT:
    src_pts = np.float32([kp1[m.queryIdx].pt for m in good
                          ]).reshape(-1, 1, 2)
    dst_pts = np.float32([kp2[m.trainIdx].pt for m in good
                          ]).reshape(-1, 1, 2)

    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
    matchesMask = mask.ravel().tolist()
    h, w = img1.shape
    pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)
    dst = cv2.perspectiveTransform(pts, M)

    deskew()

    img2 = cv2.polylines(img2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA)
else:
    print("Not  enough  matches are found   -   %d/%d" % (len(good), MIN_MATCH_COUNT))
    matchesMask = None

# show matching keypoints
draw_params = dict(matchColor=(0, 255, 0),  # draw  matches in  green   color
                   singlePointColor=None,
                   matchesMask=matchesMask,  # draw only    inliers
                   flags=2)
img3 = cv2.drawMatches(img1, kp1, img2, kp2, good, None, **draw_params)
plt.imshow(img3, 'gray')
plt.show()

上面算法的效果图

上面的代码及仪表图像数据,已经上传至资源,自行下载

https://download.csdn.net/download/sunnyrainflower/88221223

#参考链接
#https://www.javaroad.cn/questions/347518#toolbar-title

特别说明

#SURF_create有专利,直接运行报错,SIFT_create可以直接跑

使用SURF_create的方法如下

一、
1. 卸载已有安装opencv-python:

      pip uninstall opencv-python

2. 安装opencv-contrib-python  3.2版本以下:

      pip install opencv-contrib-python==3.4.2

二、
也可以不降低版本号,进行编译,详细流程见链接
https://blog.csdn.net/m0_50736744/article/details/129351648


/*----------------------------------------------------------------------------------
// 作    者:    大胡子大叔
// 版权声明: 未经同意请勿转载,里面有几张图来自网络,如果侵权请联系删除
----------------------------------------------------------------------------------*/ 

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

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

相关文章

web前端开发基础入门html5+css3+js学习笔记(一)

目录 1.第一个前端程序2.前端工具的选择与安装3.VSCode开发者工具快捷键4.HTML5简介与基础骨架4.1 HTML5的DOCTYPE声明4.2 HTML5基本骨架4.2.1 html标签4.2.2 head标签4.2.3 body标签4.2.4 title标签4.2.5 meta标签 5.标签之标题5.1 快捷键5.1 标题标签位置摆放 6.标签之段落、…

商城系统搭建,选择SaaS模式还是源码模式?

当今互联网时代&#xff0c;电子商务已成为商业发展的重要方向之一。搭建一个高效、可靠的商城系统是企业成功的关键之一。然而&#xff0c;在选择商城系统时&#xff0c;很多企业面临一个重要的决策&#xff1a;是选择SaaS&#xff08;软件即服务&#xff09;模式还是购买源码…

无涯教程-Perl - symlink函数

描述 此函数在OLDFILE和NEWFILE之间创建符号链接。在不支持符号链接的系统上,会导致致命错误。 语法 以下是此函数的简单语法- symlink ( OLDFILE, NEWFILE )返回值 如果失败,此函数返回0,如果成功,则返回1。 例 以下是显示其基本用法的示例代码,首先在/tmp目录中创建一…

Leetcode-每日一题【剑指 Offer 32 - II. 从上到下打印二叉树 II】

题目 从上到下按层打印二叉树&#xff0c;同一层的节点按从左到右的顺序打印&#xff0c;每一层打印到一行。 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果&#xff1a; [ [3], [9,20], [15,7] ] 提示&#xff…

vue3拖拽排序使用Sortable,获取拖拽排序之后的数据

1.安装Sortable npm install sortablejs 2.导入 import Sortable from sortablejs 3.使用 // html<div id"example" class"list-group"><template v-for"(element, index) in 6" :key"index"><div>item{{index …

读完这篇文章,妥妥拿下springboot+jsp+vue+easyui架构项目

概念 Spring Boot是一个快速构建基于Java的Web应用程序的框架。它提供了简化开发流程的特性&#xff0c;如自动配置和内置的嵌入式服务器。 JSP&#xff08;Java Server Pages&#xff09;是一种基于Java的服务器端技术&#xff0c;用于动态生成HTML页面。在Spring Boot中&…

100个网络知识,懂一半绝对高手!

中午好&#xff0c;我的网工朋友。 咱网工找工作的时候&#xff0c;招聘岗位上&#xff0c;都会有好几个大差不差的指标。 比如说&#xff0c;相关专业、啥等级的厂商证书&#xff0c;又或是熟悉网络基础知识等等&#xff0c;对吧。 那这个网络基础知识&#xff0c;就很灵性了…

飞腾架构麒麟V10安装达梦数据库客户端

目录 前言1.下载2.检查安装环境2.1 检查操作系统限制2.2 检查系统内存与存储空间 3.安装4.打开数据库管理工具5.总结 前言 本文主要介绍在飞腾架构麒麟V10桌面系统下如何安装达梦数据库客户端。参照安装手册安装的时候遇到了一些问题特意记录在此&#xff0c;希望能为遇到类似…

ubuntun 18.04设为静态ip(.net模式,可连接外网)

ubuntun 18.04设为静态ip&#xff08;.net模式&#xff0c;可连接外网&#xff09; ubuntun设置 进入到网络配置文件中 sudo vim /etc/netplan/01-network-manager-all.yaml修改配置文件如下 注意制表符&#xff08;格式&#xff09;&#xff0c;其中addresses为要设定的固定…

42个人工智能机器学习数据集推荐

为成功推出人工智能&#xff08;AI&#xff09;项目&#xff0c;许多公司正在转向采用外部数据集。当今时代&#xff0c;寻找数据集比以往任何时候都要容易&#xff0c;数据集对机器学习模型的性能也日益重要。有许多站点都托管数据存储库&#xff0c;涵盖主题广泛&#xff0c;…

Boost开发指南-4.6singleton

singleton singleton即单件模式&#xff0c;实现这种模式的类在程序生命周期里只能有且仅有一个实例。单件模式是一个很有用的创建型模式&#xff0c;有许多实际的应用&#xff0c;并被广泛且深入地研究。 虽然单件模式非常重要&#xff0c;但很遗憾目前Boost中并没有专门的单…

IDA调试安卓应用

先安装好IDA工具 找到需要放到android上的android_server文件 我这里是64位的 # 将android_server64放入到手机/data/local/tmp adb push d:\as /data/local/tmp/as启动android_server 默认的端口是23946, 但我指定了一个新的端口 PC端端口转发 adb forward tcp:23946 tcp:…

django实现文件上传

在django中实现文件上传有三种方法可以实现&#xff1a; 自己手动写使用Form组件使用ModelForm组件 其中使用ModelForm组件实现是最简单的。 1、自己手写 先写一个上传的页面 upload_file.html enctype"multipart/form-data 一定要加这个&#xff0c;不然只会上传文件名…

在Orangepi5开发板3588s使用opencv获取摄像头画面

先感谢香橙派群的管理员耐心指导&#xff0c;经过不断的调试修改最后成功通过opencv调用mipi摄像头获取画面 就记录分享一下大概步骤希望大家少踩点坑&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 我用的固件系统是ubuntu2022.0.4 固件是&#x…

【java毕业设计】基于SSM+MySql的个人交友网站设计与实现(程序源码)--个人交友网站

基于SSMMySql的个人交友网站设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于SSMMySql的个人交友网站设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及论文的获取方式。更多毕业设计源…

Git 目录详解

一、Git目录详解 在使用Git时&#xff0c;有几个目录和文件在Git项目中扮演着重要的角色&#xff0c;下面详细介绍一下这些目录和文件的作用 1、.git目录 .git目录是Git项目的核心&#xff0c;包含了Git的版本库和元数据等重要信息。在该目录中&#xff0c;有一些重要的子目录和…

Python Web框架:Django、Flask和FastAPI巅峰对决

今天&#xff0c;我们将深入探讨Python Web框架的三巨头&#xff1a;Django、Flask和FastAPI。无论你是Python小白还是老司机&#xff0c;本文都会为你解惑&#xff0c;带你领略这三者的魅力。废话不多说&#xff0c;让我们开始这场终极对比&#xff01; Django&#xff1a;百…

【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云

【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云 serverless服务是腾讯云自研的新一代云原生关系型数据库TDSQ L-C的无服务器架构版&#xff0c;是全Serverless架构的云原生数据库 前言 体验了一下腾讯云刚出的TDSQL-C Serverless&#xff0c;使用…

阿里云故障洞察提效 50%,全栈可观测建设有哪些技术要点?

本文根据作者在「TakinTalks 稳定性社区 」公开分享整理而成 #一分钟精华速览# 全栈可观测是一种更全面、更综合和更深入的观测能力&#xff0c;能协助全面了解和监测系统的各个层面和组件&#xff0c;它不仅仅是一个技术上的概念&#xff0c;更多地是技术与业务的结合。在“…

Oracle外部表ORACLE_LOADER方式加载数据

当数据源为文本或其它csv文件时&#xff0c;oracle可通过使用外部表加载数据方式&#xff0c;不需要导入可直接查询文件内的数据。 1、如下有一个文件名为&#xff1a;test1.txt 的数据文件。数据文件内容为&#xff1a; 2、使用sys授权hr用户可读写 DATA_PUMP_DIR 目录权限&a…