前言
经过前面的物品检测与统计,我们已经初步实现了该功能:如何对生产线上的物品进行检测并统计? 但是在文末段提出了异常分析,本篇文章将专门解决提出的异常分析。
背景
在生产过程中,理想的检测结果应该是:摄像头下的画面存在目标物时,能够正确检测出该目标物的颜色并对该类别物体的总数进行统计。由于一些不可控的情况真实会存在,虽然概率很低,但是我们严格要求自己完成任务。在这里我将建立一种机制进行剔除异常干扰值。
理想情况
在理想的检测算法下物体的初始状态在图像内有如下几种情况:
相离
这种情况是最为理想的情况,此时的初始值与检测值相同【详见:如何对生产线上的物品进行检测并统计?】
相切
根据上图所示相切存在两种情况,分别是刚进入图像内和刚好要离开图像内。在刚进入图像内时,此时的初始值刚好起到作用了(原数 = 检测数 = 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中示例的逻辑进行判断统计
对本文感兴趣的话,欢迎大家三连关注。还望各路大神赐教!
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情