前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于OpenCV的流水线包装箱检测计数应用(附源码)

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

作者头像
Color Space
发布2023-11-30 16:51:22
4880
发布2023-11-30 16:51:22
举报
文章被收录于专栏:OpenCV与AI深度学习

导 读

本文主要介绍基于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—

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV与AI深度学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • —THE END—
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档