看效果
这是方形指针表的原图(随便网上找的一张图片)
识别结果图:
原图片本来就有点模糊,看不太清。
这也是网上找的图片测试的识别结果。
以下是识别结果
大致思路
1.yolov5目标检测。
训练完成tensorrt加速识别结果(每次识别一个表)。
2.图像矫正。
用传统方法进行的矫正,应该也可以用深度学习,通过分割或者关键点检测。懒得训练了,直接用传统方法做的。随便找几张看下效果如下:
上边是yolo检测结果。
这是矫正结果。
3.接下来是指针角度识别。
我没有用paddlocr的思路去识别数字,网上搜了很多资料,很多都是要ocr识别数字,或者要用检测或者分割去分割数字,或者用关键点检测去检测指针的两端以及数字的中心,有的是识别每个刻度线;我看也有用传统方法去分割指针的,我感觉图片比较单一或者很清楚的条件下可以那么做,目前情况是,有各种各样的方形指针表,有的指针表上还有脏东西干扰,纯用传统方法不适用。
但是这种指针表的范围是不一样的,有的是0-3kA,单位各种不一样,有v、A、kA、kV等各种单位,刻度的范围也各种不一样,有最大是3的,有100的,400的等各种范围,有很多还是刻度不均匀的情况。如果要做的比较通用的话,要收集各种数据标注刻度,数字甚至单位。目前没有收集那么多数据,所以想做个比较通用的算法,只是识别指针的角度,通过角度转换为对应的刻度即可。
tensorrt加速后分割效果:
通过判断起始点和终点计算出角度,然后根据角度转换为对应的刻度,有一个计算公式,可以参考: https://blog.csdn.net/qq_46035581/article/details/131903104 如下:
再记录一下整个流程:
通过海康sdk登录nvr,控制多个相机转到之前设定好的指定的预置点并进行抓拍图像(多线程执行)。
把各自拍好的图片给各自的算法(每张图像中的表是不一样的,有压力表,油位计,压板,数字表等。java已经配好了每个预置点调用哪些算法,调用巡检任务之前已经传给算法并解析)。
算法端作为服务端,接收到要巡检任务(去那些摄像头的哪些预置点拍照)后将识别结果通过http服务再返回给java,最终将识别数字以及状态等信息显示在页面上(报警或者正常)。
完事。写c++蛋疼。。。。。。。。。。。。。。。。。。
圆形双指针表以及sf6压力表
下次整理一下圆形双指针表以及sf6压力表的读数思路。都是大同小异,检测加分割,计算角度然后转成刻度值。
这是识别结果 可以看到黑指针识别结果为26.63,和真实结果还是存在误差的。
这里还不知道客户那边要输出什么结果,先按黑指针占整个刻度的百分比来做吧,后期有变动也好改。
结果被挡住了,实际我的结果是77.7%