网站空间控制面板,wordpress调用幻灯片,网站关键词优化费用,腾讯街景地图实景手机版刻度识别项目 简介实现效果实现流程实现原理 刻度尺的标定 指针位置标定读数位置标定刻度线标定数字检测数字分割数字识别web部署附录简介
好久不见了#xff0c;我看了一下我最近的博客到现在已经3个月时间没更新了。这是因为我最近都在忙毕业设计#xff0c;所以一直没有时…刻度识别项目 简介实现效果实现流程实现原理 刻度尺的标定 指针位置标定读数位置标定刻度线标定数字检测数字分割数字识别web部署附录简介
好久不见了我看了一下我最近的博客到现在已经3个月时间没更新了。这是因为我最近都在忙毕业设计所以一直没有时间更新。我这三个月的收获还是丰富的最近会慢慢通过博客和大家分享。现在马上水上一篇吧。如果大家有看过我的EAST文本检测器应用这一篇博客的话可能会好奇我最后的gif demo是怎么完成的。那个其实是我大三的一个srp项目。现在我就介绍一下它。 实现效果
需求不用啰嗦直接看看效果即可其实我也是做得比较简单还有很多可以改进的地方。
1. demo1 2. demo2 实现流程
我完成上述的基本功能主要包含以下即可步骤。
刻度尺的标定数字位置的检测和分割数字识别结果可视化部署到web
其中✔的是必须的而其余的是个性化的可选项。 实现原理 刻度尺的标定
刻度尺的标定是非常重要的一环。考虑到刻度尺位置是相对固定的因此通过简单的人工标定过程就可以知道指针、刻度和数字的相对位置。当然也可以用如今非常厉害的基于深度学习的目标检测技术大家可以自行发挥。
下面是标定的示意图 从demo中可以看到整个读数系统可以象形地作成上图。需要关注的是1指针的位置2刻度尺读数的位置我们不妨假定我们可以框出数字那么框框的中心坐标就是读数的位置3读数到指针所指位置的距离首先数字的起始位置都是有一条粗黑实线然后得到的实线到指针的像素距离需要转换成实际的刻度距离。 指针位置标定
指针位置标定非常简单因为其一般呈现等腰三角形我们把它的边缘绘制出来然后求其角平分线就得到指针的指向。 我的标定程序需要从上往下按顺序指定三个红点指定后自动连接绿线指针边缘然后自动生成其角平分线蓝线整个程序是交互式的执行过程有提示信息最终标定文件会自动保存下次使用时加载标定文件即可。 读数位置标定
假定我们得到离指针位置最近的数字的中心像素坐标但我们还需要知道这个像素坐标离它低下那条粗黑实线有多远。在这里我假定这个中心坐标的y坐标y c y_c yc和粗实线所在的y坐标y b y_b yb存在二次函数的关系这其实并不严格只是感觉。所以有 y b a y c 2 b y c c y_b ay_c^2 by_c c ybayc2bycc 这样我们对多张图片的多个位置标定出( y c , y b ) (y_c, y_b) (yc,yb)我们就可以拟合出系数。 程序需要人工框出所有数字会自动返回红色中心点然后人工点出黑色实线蓝点程序采集足够多组样本之后就可以拟合生成拟合曲线 这个拟合关系还是不错的。 刻度线标定
我们现在可以推出起始的粗实线的坐标我们还需要知道1指针指向和刻度尺的交点结束坐标2像素距离到刻度尺距离的转换。首先我们先标定刻度如下所示 按从下到上或相反的顺序点出刻度而且尽量使点排成大致的直线这是因为在采集多张图以后程序会把这个直线拟合出来。拟合出的刻度直线和最开始标定出来的指针的角平分线求交点得到的y轴方向坐标就是结束坐标。
有开始坐标和结束坐标就还剩下距离转换的问题了。在这里我也是在此假设任一y轴坐标y 0 y_0 y0它的上一个刻度和下一个刻度的像素增量δ y ↑ , δ y ↓ \delta y_{\uparrow}, \delta y_{\downarrow} δy↑,δy↓也存在二次函数的关系即 δ y ↑ a ↑ y 0 2 b ↑ y 0 c ↑ δ y ↓ a ↓ y 0 2 b ↓ y 0 c ↓ \delta y_{\uparrow} a_{\uparrow}y_0^2 b_{\uparrow}y_0 c_{\uparrow} \\ \delta y_{\downarrow} a_{\downarrow}y_0^2 b_{\downarrow}y_0 c_{\downarrow} \\ δy↑a↑y02b↑y0c↑δy↓a↓y02b↓y0c↓ 和上面一样采集足够的样本之后拟合拟合效果如下 可见效果还是可以的。拟合之后假定我们起始坐标和结束坐标为y s , y e y_s,y_e ys,ye。那么我们可以求出y s y_s ys下一个刻度的像素坐标 y s , 1 y s δ y s a ↓ y s 2 ( b ↓ 1 ) y s c ↓ y_{s,1} y_s \delta y_s a_{\downarrow}y_s^2 (b_{\downarrow}1)y_s c_{\downarrow} ys,1ysδysa↓ys2(b↓1)ysc↓ 不断重复上述过程我们可以求出毫米级读数y s , k ≤ y e ≤ y s , k 1 y_{s,k} \le y_e \le y_{s,k1} ys,k≤ye≤ys,k1。如果需要取两位小数那么在这个区间等比例取就可以了。 数字检测
数字检测使用我之前的博客提到的EAST模型里面详细介绍了如何配置和使用模型输入原图片返回数字的中心坐标。 数字分割
本人数字分割使用的同样是比较传统的方法。首先将图像转化为灰度图然后使用OTSU方法对图片进行二值化。最后对二值化的图片使用MSER算法这个算法可以有效地抠出连通域。这样的话我们就得到单个分割的数字了。
mser cv2.MSER_create(_min_areamin_area, _max_areamax_area)
img cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转为灰度图
_, img cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV cv2.THRESH_OTSU) # 二值化
_, boxes self.mser.detectRegions(img) # MSER分割数字识别
容易发现我们需要识别的数字都是印刷体的。所以数据集只需要印刷体数字0~9即可你可能会觉得找数据集是件麻烦事但印刷体数据集是可以用opencv生成的。这一部分我参考了开源项目digitx它非常详细地给出了生成数据集和数据增强的方案并且训练了一个简单的CNN实现了高效的数字识别。 web部署
本人使用flask实现但使用本地电脑作为服务器部署后只能供局域网访问如果需要让国内的朋友都能访问的话可以申请一个公网的服务器比如阿里云等然后把代码放到上面运行别人就可以访问了。 附录
完整代码见github
如有问题可以加下面二维码咨询