建立统计过程中排除异常干扰机制

152 阅读4分钟

前言

  经过前面的物品检测与统计,我们已经初步实现了该功能:如何对生产线上的物品进行检测并统计? 但是在文末段提出了异常分析,本篇文章将专门解决提出的异常分析。

背景

  在生产过程中,理想的检测结果应该是:摄像头下的画面存在目标物时,能够正确检测出该目标物的颜色并对该类别物体的总数进行统计。由于一些不可控的情况真实会存在,虽然概率很低,但是我们严格要求自己完成任务。在这里我将建立一种机制进行剔除异常干扰值。

      image.png

理想情况

  在理想的检测算法下物体的初始状态在图像内有如下几种情况:

相离

  这种情况是最为理想的情况,此时的初始值与检测值相同【详见:如何对生产线上的物品进行检测并统计?

相切

  根据上图所示相切存在两种情况,分别是刚进入图像内和刚好要离开图像内。在刚进入图像内时,此时的初始值刚好起到作用了(原数 = 检测数 = 0);在刚要离开图像内时,由于初始值为0,此时存在一种情况: 检测过程中停电了,物体刚要离开图像边界时停下了,当设备启动后,会对物品重复统计 我们需要对次进行剔除。

  针对这种情况,应在重启设备的时候,保证图像内无任何物品干扰

相交&包含

  这两种情况在初始值为0的情况下都可以检测并统计到,对检测统计无影响。

非理想情况

  非理想情况下,我们在这里只考虑“误差”这种情况如下:在检测物品的颜色的过程中,出现了某短暂的某一帧检测结果出现偏差,但随之后的检测结果都为正确的。

  例如检测结果为 000100000 :【这是代表没有物品在传送带上,中间出现的1表示出现误检】;同理在一串1中出现了某个非1的数字也是属于异常数字。当然了这个数字可能出现一个或多个,那么我们需要建立一种机制进行规避掉这种情况。

        image.png

demo代码

import random
import time

import cv2



# 各类别的总数
Lab1 = 0
Lab2 = 0
Lab3 = 0
Lab4 = 0
Lab5 = 0


lablist1 = []
lablist2 = []
lablist3 = []
lablist4 = []
lablist5 = []

RawNum = 0  # 原始数据

while 1:
    frame = cv2.imread("apple.jpg")
    a = random.randint(0, 10)
    if a == 6 and a == 7 and a == 8 and a == 9 and a == 10 and a == 0:
        RawNum = a
        lablist1 = []
        lablist2 = []
        lablist3 = []
        lablist4 = []
        lablist5 = []

    else:
        RawNum = a
        if a == 1:
            lablist1.append(a)
            if len(lablist1) == 3 and lablist1[0] == lablist1[1] == lablist1[2] == 1:
                
                Lab1 += 1
                lablist1 = []
        elif a == 2:
            lablist2.append(a)
            if len(lablist2) == 3 and lablist2[0] == lablist2[1] == lablist2[2] == 2:
    
                Lab2 += 1
                lablist2 = []

        elif a == 3:
            lablist3.append(a)
            if len(lablist3) == 3 and lablist3[0] == lablist3[1] == lablist3[2] == 3:

                Lab3 += 1
                lablist3 = []

        elif a == 4:
            lablist4.append(a)
            if len(lablist4) == 3 and lablist4[0] == lablist4[1] == lablist4[2] == 4:
 
                Lab4 += 1
                lablist4 = []

        elif a == 5:
            lablist5.append(a)
            if len(lablist5) == 3 and lablist5[0] == lablist5[1] == lablist5[2] == 5:
                Lab5 += 1

                lablist5 = []

    Text1 = "Yellow-Num:%s " % Lab1
    Text2 = "Red-Num:%s " % Lab2
    Text3 = "Green-Num:%s " % Lab3
    Text4 = "black-Num:%s " % Lab4
    Text5 = "blue-Num:%s " % Lab5

    Text = str(a)
    cv2.putText(frame, Text1, (5, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
    cv2.putText(frame, Text2, (5, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
    cv2.putText(frame, Text3, (5, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
    cv2.putText(frame, Text4, (5, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
    cv2.putText(frame, Text5, (5, 100), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
    cv2.putText(frame, Text, (5, 140), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)

    cv2.imshow("video", frame)
    key = cv2.waitKey(1) & 0xFF
    if key == 27:
        break

结语

  今天就先写到这里,总结一下的机制的核心有如下的两个:

  1. 启动设备的时候,需保证图像内无任何物品干扰;
  2. 在检测统计代码中进行如上demo中示例的逻辑进行判断统计

  对本文感兴趣的话,欢迎大家三连关注。还望各路大神赐教!

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情