导 读
本文主要介绍基于OpenCV的流水线包装箱检测计数应用,并给出源码。
资源下载
完整代码和视频下载地址:
代码语言:javascript复制https://github.com/freedomwebtech/rpi4-conveyor-belt-boxces-counter
核心代码如下(cboxtest.py):
代码语言:javascript复制import cv2
import numpy as np
from tracker import*
cap=cv2.VideoCapture('box.mp4')
lower_range=np.array([0,46,64])
upper_range=np.array([43,115,160])
def RGB(event, x, y, flags, param):
if event == cv2.EVENT_MOUSEMOVE :
point = [x, y]
print(point)
tracker=Tracker()
cv2.namedWindow('box-counter')
cv2.setMouseCallback('box-counter', RGB)
area=[(391,244),(370,443),(391,438),(410,237)]
counter=[]
while True:
ret,frame=cap.read()
if not ret:
break
frame=cv2.resize(frame,(640,480))
hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
mask=cv2.inRange(hsv,lower_range,upper_range)
_,mask1=cv2.threshold(mask,254,255,cv2.THRESH_BINARY)
cnts,_=cv2.findContours(mask1,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
list=[]
for c in cnts:
x=500
if cv2.contourArea(c)>x:
x,y,w,h=cv2.boundingRect(c)
list.append([x,y,w,h])
bbox_idx=tracker.update(list)
for bbox in bbox_idx:
x1,y1,w1,h1,id=bbox
cx=int(x1 x1 w1)//2
cy=int(y1 y1 h1)//2
results=cv2.pointPolygonTest(np.array(area,np.int32),((cx,cy)),False)
if results>=0:
cv2.circle(frame,(cx,cy),4,(0,0,255),-1)
cv2.rectangle(frame,(x1,y1),(x1 w1,y1 h1),(0,255,0),2)
if counter.count(id)==0:
counter.append(id)
cv2.polylines(frame,[np.array(area,np.int32)],True,(255,255,255),2)
c1=(len(counter))
#cvzone.putTextRect(frame,f"{c1}",(50,60),2,2)
cv2.putText(frame,str(c1), (420, 350), 0, 3, (0, 0, 255), 4)
cv2.imshow("box-counter",frame)
if cv2.waitKey(1)&0xFF==27:
break
cap.release()
cv2.destroyAllWindows()
下载测试视频box6.mp4(vid.txt中有链接):
实现步骤
【1】通过track.py滑动条动态设置HSV范围,保证较好的提取去包装箱的轮廓mask,效果如下:
通过调试设置HSV范围如下,然后做HSV轮廓提取,提取纸箱轮廓。
代码语言:javascript复制lower_range=np.array([0,46,64])
upper_range=np.array([43,115,160])
【2】划定多边形区域,当直线轮廓中心点经过时将目标跟踪的id添加到list中:
【3】纸箱计数:计算list中元素个数即可,具体原理可参考上篇文章:
基于OpenCV YOLOv5实现车辆跟踪与计数(附源码)
最终效果如下:
总 结
此应用相对基于OpenCV YOLOv5实现车辆跟踪与计数(附源码) 案例简单一点,计数原理相同。这里直接用HSV范围提取的纸箱目标,没有用深度学习目标检测方法。另外计数时也不一定使用多边形,以直线和点的距离来计算也可以,核心还是避免重复计数。
另外实际流水线上,这种简单应用还用不到视觉,红外传感器 单片机就可以搞定了,此例仅供参考。