前言
经过前面的物品检测与统计,我们已经初步实现了该功能:如何对生产线上的物品进行检测并统计? 但是在文末段提出了异常分析,本篇文章将专门解决提出的异常分析。
背景
在生产过程中,理想的检测结果应该是:摄像头下的画面存在目标物时,能够正确检测出该目标物的颜色并对该类别物体的总数进行统计。由于一些不可控的情况真实会存在,虽然概率很低,但是我们严格要求自己完成任务。在这里我将建立一种机制进行剔除异常干扰值。
理想情况
在理想的检测算法下物体的初始状态在图像内有如下几种情况:
相离
这种情况是最为理想的情况,此时的初始值与检测值相同【详见:如何对生产线上的物品进行检测并统计?】
相切
根据上图所示相切存在两种情况,分别是刚进入图像内和刚好要离开图像内。在刚进入图像内时,此时的初始值刚好起到作用了(原数 = 检测数 = 0);在刚要离开图像内时,由于初始值为0,此时存在一种情况:检测过程中停电了,物体刚要离开图像边界时停下了,当设备启动后,会对物品重复统计 我们需要对次进行剔除。
针对这种情况,应在重启设备的时候,保证图像内无任何物品干扰
相交&包含
这两种情况在初始值为0的情况下都可以检测并统计到,对检测统计无影响。
非理想情况
非理想情况下,我们在这里只考虑“误差”这种情况如下:在检测物品的颜色的过程中,出现了某短暂的某一帧检测结果出现偏差,但随之后的检测结果都为正确的。
例如检测结果为 000100000 :【这是代表没有物品在传送带上,中间出现的1表示出现误检】;同理在一串1中出现了某个非1的数字也是属于异常数字。当然了这个数字可能出现一个或多个,那么我们需要建立一种机制进行规避掉这种情况。
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
结语
今天就先写到这里,总结一下的机制的核心有如下的两个:
- 启动设备的时候,需保证图像内无任何物品干扰;
- 在检测统计代码中进行如上demo中示例的逻辑进行判断统计