项目记录 06.16
“以每日记录的方式鞭策自己前行”
文接上节,本次记录仍为cv 水表检测,简单回看了昨天的行文,语句不通顺的地方很多,希望自己能在语句上稍多花一些功夫,这样回看也会舒服一些。
本次针对预处理后图像提取完整指针并在此基础上尝试进行读数操作。
观察图像上次的图像,噪声主要是表盘上的数字以及表盘上方汉字区域造成,尝试使用增大指针与表盘的对比度的方法,使得二者(背景与目标)的差异增大,由此提高后续阈值分割效率。
注:但单一增大对比度操作并没有带来明显影响,分析可能是因为数字与表盘指针颜色过于相近(不应该啊,有一半指针是红色的,,,)
使用开闭操作,并适当修改阈值,可以消除表盘上方的汉字区域以及减小指针周围数字影响,效果如图。
在此基础上,经过边缘检测(基于Canny 算子)得到如下图像:
显然图像剩余部分可以进行判断了!
但需要注意的是,以上方法的参数都是通过手动逐步调整的,不具有普适性,鲁棒性差,后续操作需要对此进一步优化。
另:指针示数读取
通过读取文献发现,可用的方法是通过Hough 变换检测闭合曲线中最长的线,以此作为指针的指向,通过斜率计算的方法,计算偏移量,在预知量程的前提下计算得出数值。
文献方法转化具体步骤如下:
由于目前基于操作平台为matlab,暂使用matlab 有关于Hough 变换的三个封装函数:
hough() % 计算二值图像的标准霍夫变换,H为霍夫变换矩阵,T,R为计算霍夫变换的角度和半径值
houghpeaks() % 从霍夫变换矩阵H中提取5个极值点
houghlines()
基于https://www.ilovematlab.cn/thread-325021-1-1.html atpalain 与 https://blog.csdn.net/abcjennifer/article/details/6673799 Rachel-Zhang 公开的代码,在未修改参数的前提下,得到下图(备注:由于边缘检测处理后的图像仅剩边沿,无法使用封装函数得到预测结果,仅会得到一些边沿线段,而非过指针中心的最长直线,所以回滚一步,进行最长直线检测)
总体看到,可以得到接近要求的直线,但有如下问题:
- 同一个指针区域得到两条直线。
- 指针区域没有检测到直线。
- 检测到单一直线的区域直线与理想情况仍有较大误差。
所以需要对参数进行修改,第一步修改极值点数目,通过增加极值点的方法使得每个指针区域至少检测出一条直线,同时每个指针区域中至少有一条直线接近于理想值,即与理想情况的误差值在可接受范围内。
第二步修改可允许最短线段长度,拉升下限,使得同一区域线的斜率可以尽可能集中在一定范围内。
得到图如下:
由上图得到了一个笔主认为比较好的结果。
接下来的计划是根据以上的结果,将同一指针区域中的指针的斜率取均值,将均值作为计算最后指针示数数值的输入量。
2019.0616 晚