使用实时视频源监控 Python 中的模拟仪表

Using real time video feed to monitor analog gauge in Python

我希望这里有人可以帮助我着手解决这个问题。当看起来像 this 的压力表达到某个可变压力时,我正在尝试找出一种使用实时视频馈送到 运行 a python 0script 的好方法。

我非常有信心这应该不会太难,因为仪表将安装在图像框架中的固定位置,但我对这类东西很陌生,真的不知道从哪里开始.

有什么建议吗?提前致谢!

这个问题可能比你想象的要难得多。通常,人们将 OpenCV 用于图像 processing/pattern 识别问题。还有很多优秀的tutorials for Python available in the documentation

归根结底,你的问题是计算针的旋转角度。然后从那里,你可以计算出压力是多少。运气好的话,可以使用Feature Detection + Homography找到针,然后计算角度。但我怀疑这种图像是否会导致特征检测。

模板匹配可以找到针,但它对旋转非常敏感,因此您必须生成大量具有不同针角的模板,然后每次都遍历所有模板压力读数。

使用电子压力表读取压力可能更快、更便宜、更容易。您可以通过多种方式将电子仪表的输出输入 Python。一些仪表可以连接到网络。有些可以作为串行端口与 RS232/422 或 USB 进行通信。

如果你能找到带有数字显示屏的仪表,那么进行某种OCR/Template匹配以从相机读取显示屏应该更直接。

编辑:

@jeremy arsenault 的评论促使我想到另一个解决方案。如果您主要关注检测指针何时越过阈值,则可以寻找刻度盘的前缘。而且你可以多看向表盘的中心,那里没有指示器。

这种图像非常适合轻松转换为黑白阈值处理。表盘是黑色的,背景(至少朝向中心)是白色的。在对图像进行一些形态学和阈值处理后,您可以寻找表盘的黑色像素。无需模板匹配。下面的图片说明了一些想法。第一张照片是您的图像阈值化为黑白。初始图像非常干净,但如果您是从相机抓取的,则可能需要在设置阈值之前进行一些模糊处理和形态学处理,以免在不需要的地方出现杂散的黑色像素。第二张图片有一个重叠的圆圈,您可以在其中寻找黑色像素。您可以找到前缘和后缘以及平均值以获得相当精确的中心值。

更多实现 details/pseudocode。对于计算机图像,原点通常是左上角,+y 向下。另外,我定义了随压力增加而增加的角度 theta。圆的参数方程是

x = x0 - r*cos(theta + theta0)
y = y0 - r*sin(theta + theta0)

theta0 是给出零压力的偏移角(图中的压力表约为 -45 度。寻找针头的蛮力方法是从零开始扫描角度并增加直到找到黑色像素x,y。然后继续增加,直到在x,y处找到一个白色像素。两个角度的平均值就是针的中心,您应该可以计算出压力。