YOLO-obb+PyQt实现指针式仪表读数识别(二)

在YOLO-obb+PyQt实现指针式仪表读数识别(一)中主要介绍YOLO-obb模型标注训练流程,在YOLO-obb+PyQt实现指针式仪表读数识别(二)中介绍读数原理和校正原理,效果如下。

一、检测效果

1、指针式仪表识别效果

2、指针式仪表检测视频

YOLO-obb+PyQt实现指针式仪表读数识别

二、数据存储

1、序号对照表

2、表计

3、数据保存-单张

4、数据保存-批量

5、数据绘图-单张

6、数据绘图-批量

三、读数原理

1、整体流程

初始图片经模型1检测得到表盘带标签图片,再分别经模型2和模型3得到表盘图片和标签图片,表盘图片和标签图片经obb模型4得到表计和最终读数。模型1、模型2、模型3的训练没什么好说的,LabelImg或者makesense正常标注训练就好,obb模型4的标注训练流程已经在(一)记录的比较详细。

2、读数

如下图应用模型4检测裁剪出来的表盘所示,获取检测后result的save_dir,读取检测结果并排序,开始刻度线坐标即为如下所示。

# 先按第一列排序,再按第二列排序
sorted_rows = sorted(rows_as_lists, key=lambda x: (float(x[0]), float(x[1])))
# print(sorted_rows)
# 起始刻度线坐标
x_s1 = width * float(sorted_rows[0][1])
y_s1 = width * float(sorted_rows[0][2])
x_s2 = width * float(sorted_rows[0][3])
y_s2 = width * float(sorted_rows[0][4])
x_s3 = width * float(sorted_rows[0][5])
y_s3 = width * float(sorted_rows[0][6])
x_s4 = width * float(sorted_rows[0][7])
y_s4 = width * float(sorted_rows[0][8])
# 拟合起始刻度线坐标
x_sf = (x_s1 + x_s2 + x_s3 + x_s4) / 4
y_sf = (y_s1 + y_s2 + y_s3 + y_s4) / 4

# 终止刻度线坐标
x_e1 = width * float(sorted_rows[1][1])
y_e1 = width * float(sorted_rows[1][2])
x_e2 = width * float(sorted_rows[1][3])
y_e2 = width * float(sorted_rows[1][4])
x_e3 = width * float(sorted_rows[1][5])
y_e3 = width * float(sorted_rows[1][6])
x_e4 = width * float(sorted_rows[1][7])
y_e4 = width * float(sorted_rows[1][8])
# 拟合终止刻度线坐标
x_ef = (x_e1 + x_e2 + x_e3 + x_e4) / 4
y_ef = (y_e1 + y_e2 + y_e3 + y_e4) / 4

# 指针端点坐标
x_p1 = width * float(sorted_rows[3][1])
y_p1 = width * float(sorted_rows[3][2])
x_p2 = width * float(sorted_rows[3][3])
y_p2 = width * float(sorted_rows[3][4])
x_p3 = width * float(sorted_rows[3][5])
y_p3 = width * float(sorted_rows[3][6])
x_p4 = width * float(sorted_rows[3][7])
y_p4 = width * float(sorted_rows[3][8])
# 拟合指针端点坐标
x_pf = (x_p1 + x_p2 + x_p3 + x_p4) / 4
y_pf = (y_p1 + y_p2 + y_p3 + y_p4) / 4

# 中间刻度线坐标
x_z1 = width * float(sorted_rows[2][1])
y_z1 = width * float(sorted_rows[2][2])
x_z2 = width * float(sorted_rows[2][3])
y_z2 = width * float(sorted_rows[2][4])
x_z3 = width * float(sorted_rows[2][5])
y_z3 = width * float(sorted_rows[2][6])
x_z4 = width * float(sorted_rows[2][7])
y_z4 = width * float(sorted_rows[2][8])
# 拟合中间刻度线坐标
x_zf = (x_z1 + x_z2 + x_z3 + x_z4) / 4
y_zf = (y_z1 + y_z2 + y_z3 + y_z4) / 4

 

相应的,获得结束刻度线坐标以及指针中心坐标,再计算开始刻度线与结束刻度线交点坐标p1、开始刻度线与指针交点坐标p2、结束刻度线与指针交点坐标p3,计算p1、p2、p3之间距离,取距离最小的两个交点的平均值即为圆心坐标c1,由角度法计算指针与开始刻度线所成角度与结束刻度线与开始刻度线所成角度之比,即为仪表读数。

四、读数修正原理

在模型4中还标注了0.4刻度,检测完成后获得0.4刻度中心坐标,相应的计算由开始刻度线与0.4刻度坐标p4、开始刻度线与结束刻度线交点坐标p5、0.4刻度与结束刻度线交点坐标p6,计算p4、p5、p6之间距离,取距离最小的两个交点的平均值即为圆心坐标c2,计算c1和c2的平均值即为修正后圆心坐标。由角度法计算0.4刻度与开始刻度线所成角度与结束刻度线与开始刻度线所成角度之比,即为检测0.4刻度对应值,由0.4减去此值即为读数误差a,在第二步中获得的仪表读数减去读数误差a即为修正后表盘最终读数。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值