65.9K
CodeProject 正在变化。 阅读更多。
Home

模拟仪表读数器

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (1投票)

2017年12月15日

MIT

3分钟阅读

viewsIcon

14237

这个示例应用程序获取模拟仪表的图像或视频帧,并使用 OpenCV* 计算机视觉库中的函数读取值。

这个示例应用程序获取模拟仪表的图像或视频帧,并使用 OpenCV* 计算机视觉库中的函数读取值。它由两部分组成:校准和测量。 在校准过程中,应用程序通过提示用户输入以度为单位的仪表值范围来校准仪表的图像(由用户提供)。 然后,它在测量阶段使用这些校准值将表盘的角度转换为有意义的值。

您将学到什么

  • 圆检测
  • 直线检测

准备您的材料

  • Python* 2.7 或更高版本
  • OpenCV 版本 3.3.0 或更高版本
  • 仪表的图像(或者您可以使用提供的示例)

安装

  1. 拍摄仪表图像,或者使用提供的 gauge-1.jpg。 如果您将其命名为其他名称(而不是 gauge-1.jpg),请确保在 main() 函数中进行更改。
  2. 运行该应用程序(首先下载本文末尾的 .zip 文件),然后输入所请求的值,使用输出文件 gauge-#-calibration.jpg 来确定这些值。 这是校准图像的示例

    对于上面的校准图像,您将输入以下值

  3. 默认情况下,该应用程序读取您用于校准的图像中的仪表值。 对于提供的图像,它给出的结果是 16.4 psi。 还不错。

原始图像

找到的线:(通常不是输出,只是为了展示更多正在发生的事情)。

提供了 gauge-2.jpg 供用户尝试。

获取代码

代码包含在存储库的此文件夹中的 .py 文件中。

工作原理

OpenCV* 库中使用的主要函数是 HoughCircles(用于检测仪表的轮廓和中心点)和 HoughLines(用于检测表盘)。

基本过滤如下:对于圆(这发生在 calibrate_gauge() 中)

  • 仅从 HoughCircles 返回在图像高度的合理范围内的圆(这假设仪表占据了大部分视图)
  • 平均结果圆并使用平均值作为中心点和半径 对于线(这发生在 get_current_value() 中)
  • 使用 cv2.threshold.cv2.THRESH_BINARY_INV 应用阈值,阈值为 175,maxValue 为 255 即可
  • 删除给定半径之外的所有线
  • 检查线是否在半径的可接受范围内
  • 使用第一条可接受的线作为表盘

涉及大量的三角函数来创建校准图像,主要是正弦和余弦来绘制校准图像线,以及反正切来获得表盘的角度。 这种方法设置 0/360 为 -y 轴(如果图像中间有一个笛卡尔网格),并且它是顺时针方向。 通过在 p_text[i][j] 的计算中添加(i+9),可以稍微修改以使 0/360 度位于 -y 轴。 如果没有这个 +9,0/360 点将位于 +x 轴上。 因此,此实现假设仪表在图像中对齐,但可以通过将 9 的值更改为其他值来调整它。

重要提示:此软件是示例软件。 它并非设计或意图用于任何医疗、救生或维持生命系统、交通系统、核系统,或任何其他关键任务应用,其中系统的故障可能导致严重伤害或死亡。 该软件可能尚未经过全面测试,并且可能包含错误或缺陷;它可能并非旨在或适合商业发布。 尚未获得该软件的任何监管批准,因此该软件可能未获得在某些国家或环境中使用认证。

© . All rights reserved.