仪表图像以检测指示器
[![测量图像以检测指示器] [1]] [1]

我想实时跟踪仪表上每个指示器的当前状态。可以在不同的时间在同一位置显示两个指示器

为了实现车速表指示器检测,我尝试了以下方法,

  • 背景扣除方法-
    在此方法中,我们在测试前将仪表的基本图像存储在关闭状态。然后,我们在开始测试后捕获了每一帧,并从基础图像中减去了该帧。然后,我们检查了相减图像中的关注区域(指示器位置),如果检测到指示器大小的斑点,则认为指示器为ON;否则,如果未检测到斑点或小尺寸斑点,则将指示器视为OFF。

  • 上述实现中面临的问题是,当该区域中显示任何其他图形时,或者如果仪表播放了任何动画,并且该动画通过指示器区域,则检测到错误的斑点并获得了错误的结果。
  • Open CV模板匹配方法-
    首次配置仪表时,用户可以通过在图像上绘制矩形来添加指示器。在此期间,将存储指示器的模板图像。在测试执行期间,该模板图像在感兴趣区域(指示器位置)中搜索。如果图像与模板图像匹配,则我们认为指示器为开,否则我们认为指示器为关。

  • 上述实现中面临的问题是,在点火开启状态和点火关闭状态下很少显示不同的指示器,然后由于背景不同而导致模板图像匹配失败

    例如下面的指示器可以根据点火状态以两种方式在仪表上显示(分别为点火关闭和点火打开)

    在点火开启状态下前雾灯为ON的图像
    [![前雾灯图像在点火开启状态下开启] [2]] [2]

    在点火关闭状态下前雾灯点亮的图像
    [![前雾灯图像在点火关闭状态下开启] [3]] [3]
  • 打开CV边缘检测+模板匹配方法–
    为了消除上述方法中的背景问题,我尝试使用canny边缘检测将图标转换为轮廓,然后尝试匹配模板,但结果仍然不一致。
  • 最佳答案

    很高兴向我们展示您的思考过程!

    问题:

    对于这样的形状检测和变化,您最大的问题是泛化。指示的形状是一致的(对象),但场景会发生变化(背景)。考虑到这种变化量,这种“启发式”方法不会返回好的结果。

    解决方案:

    您应该对问题实现机器学习方法,精心设计自己的指标和标签数据集,组织一切并训练自己的解决方案。

  • SVM-支持 vector 机:这不是最通用的方法,但是可以生成较轻的模型并且可以快速训练模型。您甚至可以使用Opencv训练自己的SVM。 Application example | Training example
  • CNN-卷积神经网络:非常通俗易懂,并且具有一定的抗噪能力,这绝对是我的“入门”方法。训练物体检测模型的最简单,最快的方法是使用Keras。 Application example | Training example

  • PS:我提出的大多数技术都没有按照问题要求在C#中实现(主要是Python和C++),但是一旦训练并生成了推理模型(SVM,CNN等),就可以导入较新版本的EmguCV并无缝使用它们。

    关于c# - 如何使用emgucv/opencv/Aforge.Net/Accord.Net在50-100毫秒内实时检测仪表中的指示器及其状态(开-关,颜色,闪烁),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57820544/

    10-11 07:23