仪表图像以检测指示器
[![测量图像以检测指示器] [1]] [1]
我想实时跟踪仪表上每个指示器的当前状态。可以在不同的时间在同一位置显示两个指示器
为了实现车速表指示器检测,我尝试了以下方法,
在此方法中,我们在测试前将仪表的基本图像存储在关闭状态。然后,我们在开始测试后捕获了每一帧,并从基础图像中减去了该帧。然后,我们检查了相减图像中的关注区域(指示器位置),如果检测到指示器大小的斑点,则认为指示器为ON;否则,如果未检测到斑点或小尺寸斑点,则将指示器视为OFF。
上述实现中面临的问题是,当该区域中显示任何其他图形时,或者如果仪表播放了任何动画,并且该动画通过指示器区域,则检测到错误的斑点并获得了错误的结果。
首次配置仪表时,用户可以通过在图像上绘制矩形来添加指示器。在此期间,将存储指示器的模板图像。在测试执行期间,该模板图像在感兴趣区域(指示器位置)中搜索。如果图像与模板图像匹配,则我们认为指示器为开,否则我们认为指示器为关。
上述实现中面临的问题是,在点火开启状态和点火关闭状态下很少显示不同的指示器,然后由于背景不同而导致模板图像匹配失败
例如下面的指示器可以根据点火状态以两种方式在仪表上显示(分别为点火关闭和点火打开)
在点火开启状态下前雾灯为ON的图像
[![前雾灯图像在点火开启状态下开启] [2]] [2]
在点火关闭状态下前雾灯点亮的图像
[![前雾灯图像在点火关闭状态下开启] [3]] [3]
为了消除上述方法中的背景问题,我尝试使用canny边缘检测将图标转换为轮廓,然后尝试匹配模板,但结果仍然不一致。
最佳答案
很高兴向我们展示您的思考过程!
问题:
对于这样的形状检测和变化,您最大的问题是泛化。指示的形状是一致的(对象),但场景会发生变化(背景)。考虑到这种变化量,这种“启发式”方法不会返回好的结果。
解决方案:
您应该对问题实现机器学习方法,精心设计自己的指标和标签数据集,组织一切并训练自己的解决方案。
PS:我提出的大多数技术都没有按照问题要求在C#中实现(主要是Python和C++),但是一旦训练并生成了推理模型(SVM,CNN等),就可以导入较新版本的EmguCV并无缝使用它们。
关于c# - 如何使用emgucv/opencv/Aforge.Net/Accord.Net在50-100毫秒内实时检测仪表中的指示器及其状态(开-关,颜色,闪烁),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57820544/