基于OpenCV的流水线包装箱检测计数应用(附源码)

2023-11-30 16:51:22 浏览数 (3)

导 读

本文主要介绍基于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范围提取的纸箱目标,没有用深度学习目标检测方法。另外计数时也不一定使用多边形,以直线和点的距离来计算也可以,核心还是避免重复计数。

另外实际流水线上,这种简单应用还用不到视觉,红外传感器 单片机就可以搞定了,此例仅供参考。

—THE END—

0 人点赞