本篇文章给大家谈谈数字水表读数示意图,以及数字水表图片的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
文章详情介绍:
水表读数怎么看?
准确抄表的基本方法:
从水表面的正面看,不要侧看或斜看;
从左到右bai抄读四位黑针的指示数du值,依次为:千位针(*1000)、百位针(*100)、十位针(*10)、个位针(*1);
一
二
三
读黑针,不要读红针。红针是小数,一般是不计的;
从高位到低位依次读数;
黑针的读数方法:
针指在两个数之间时,读小的数;
针指在一个数a附近,看其低一位的针是否过0,若过0,读数为该数a,否则读数为该数a前的数;
针指在一个数a附近,看其低一位的针若指在0附近,则看再低一位的针,直至可以判断是否过0,若过0,读书为该数a,否则读数为该数a前的数。
现如今抄表方案大多还是采用人工现场抄表的方式,或者充值卡使用的方式,不仅浪费人力,还可能存在抄表错误,使用人员对具体用量也不清楚,无法对能源做出更好的分配及调整。
很多表具在抄表时无法找到或者被遮挡,这对表具的管理和检修造成了极大的困难,如何精确定位附近表具的位置也是当下需解决的问题之一。
1、远程抄表在传输方式,传输网络的选择
2、抄表数据的采集处理
3、表具的位置管理
易抄表是深圳市中科智联有限公司推出的面向水务抄表服务的全新机器人产品,在水表上加装机器人智能硬件,将水表表盘进行摄像并进行识别,将识别出的信息提供给客户进行数字信息处理或大数据分析。抄表机器人重新定义了智能抄表服务,从此告别了人工抄表的历史,开启了水务人工智能新时代。
如何正确看水表读数?
无线远传无线远传水表是基于传统无线远传水表的基础之上进行了技术化改造,它兼顾了传统无线远传水表读数的功能,读数精度有所提升,读数的稳定性有所增加,而且适合批量安装和远程控制,从企业角度而言,选择该类无线远传水表之后能够减少劳动力数量,那么在选择无线远传水表怎么读数呢?
目前水表厂水表分为三种类型:一种是指针式,一种是数字直读式,一种是智能无线远传水表。
一:指针式水表,黑色指针读数:
千位(×1000):2
百位(×100):2
十位(×10):6
个位(×1):1
读取红色指针读数:红色指针的读数,出厂时检验用,我们不必关心。
二:数字直读式水表,仪表盘上的前四位数字是黑色,第五位是红色,只有三个红色指针。旁边的红色指针“x0.1”表示“指针指向数字x0.1吨。红色指针旁的“x0.01”表示“指针指向数字x0.01吨”
三、智能无线远传水表,新建筑物和更换基本都采用智能无线远传水表,大部分居民家中的无线远传水表都是像上图中的数字表,读数方法很简单:一般的无线远传水表在表盘上会有一个保护盖,要查看无线远传水表上的用水量时,先把蓝色的盖板掀开;然后在无线远传水表上,有一个长方形的显示窗,这上面显示的数字,就是当前总用水量是多少,后面标着m3,就是单位为立方的意思。
73.Python——语义分割后期处理:水表读数
在人工智能计算机视觉方面,有图像分类、目标检测、语义分割、实例分割四大主要任务。目前在各个领域都有比较成熟的应用。
在一些特定的环境或特殊需求中,我们可能需要通过图像来对水表进行智能读数。
水表数据图像
对于水表读数,首先考虑使用语义分割,目的就是把水表盘的数据区域分割出来。关于语义分割可以参看:。本文主要想讲一下语义分割后的图像数据处理和识别。
语义分割后,返回的是多边形坐标值。这里因为可以看到水表的数据区域并不是水平的,所以我们需要根据返回的多边形坐标值,对水表的数据区域图像进行旋转后得到,再进行文字识别。
这里每个水表图像对应一个文本文件,文件内容就是语义分割后返回的4个顶点的坐标值。如:97 475 280 424 293 466 105 520
演示数据
实现代码:import cv2
import os
import numpy as np
import paddleocr
basedir="meter"
ptslst=[]
#读取文本文件
for f in os.listdir(basedir):
#分离文件名和后缀
fname,fext=os.path.splitext(f)
if fext==".txt":
#读取文件
with open(os.path.join(basedir,f)) as f:
for line in f:
#按照空格分割,并转换为int
x1,y1,x2,y2,x3,y3,x4,y4,v=list(map(lambda x:int(x),line.split()))
#print(x1,y1,x2,y2,x3,y3,x4,y4,v)
dxy={fname:[[x1,y1],[x2,y2],[x3,y3],[x4,y4]]}
ptslst.append(dxy)
#print(ptslst)
#多边形旋转为矩形,并计算旋转角度,返回旋转后的矩形,中心坐标
def rotate_rect(pts):
#计算多边形的中心点
x=sum(map(lambda x:x[0],pts))/4
y=sum(map(lambda x:x[1],pts))/4
#计算多边形的长宽
w=max(map(lambda x:x[0],pts))-min(map(lambda x:x[0],pts))
h=max(map(lambda x:x[1],pts))-min(map(lambda x:x[1],pts))
#计算多边形的旋转角度
angle=np.arctan2(pts[1][1]-pts[0][1],pts[1][0]-pts[0][0])*180/np.pi
#旋转后的矩形
pts_rotate=np.array([[x-w/2,y-h/4],[x+w/2,y-h/4],[x+w/2,y+h/4],[x-w/2,y+h/4]])
pts_rotate=pts_rotate.astype(np.int32)
return pts_rotate,angle,x,y
#以(x,y)为中心旋转图像
def rotate_img(img,angle,x,y):
#获取图像的高和宽
h,w=img.shape[:2]
#计算旋转后的高和宽
h_new=int(np.sqrt(h**2+w**2-2*h*w*np.cos(angle)))
w_new=int(np.sqrt(h**2+w**2+2*h*w*np.cos(angle)))
#计算旋转后的中心点
# x_new=w_new/2
# y_new=h_new/2
#计算旋转矩阵
# M=cv2.getRotationMatrix2D((x_new,y_new),angle,1)
M=cv2.getRotationMatrix2D((x,y),angle,1)
#旋转图像
img_rotate=cv2.warpAffine(img,M,(w_new,h_new))
return img_rotate
#读取图片,并画多边形
for f in os.listdir(basedir):
#分离文件名和后缀
fname,fext=os.path.splitext(f)
if fext==".jpg":
#读取图片
img=cv2.imread(os.path.join(basedir,f))
#画多边形
for dxy in ptslst:
if fname in dxy:
#转换为np.array
pts=np.array(dxy[fname])
#cv2.polylines(img,[pts],True,(0,255,0),2)
#返回旋转后坐标,旋转角度,中心点
pts_m,theta,x,y=rotate_rect(pts)
#print(pts_m)
#旋转图像
img=rotate_img(img,theta,x,y)
#cv2.polylines(img,[pts_m],True,(0,0,255),2)
#获取旋转后矩形的图像
roi_img=img[pts_m[0][1]:pts_m[2][1],pts_m[0][0]:pts_m[2][0]]
#ocr识别
ocr=paddleocr.PaddleOCR(use_angle_cls=True,lang="ch")
result=ocr.ocr(roi_img,cls=True)
line=result[0]
boxes=line[0]
txts=line[1][0]
scores=line[1][1]
#print(boxes,txts,scores)
#写文字
cv2.putText(roi_img,txts,(10,25),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
cv2.imshow("meter",roi_img)
#显示图片
#cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
实现效果
旋转后识别结果