OpenCV杂谈_03


一. 需要做的前期准备
  1. 环境配置:
    Python版本:3.9.0
    功能包:opencv-python(4.5.2.52)、opencv-contrib-python(4.5.2.52)
  2. 需要自行拍摄想要识别物体的视频,作为input
  3. 一个用的顺手的IDE(本人推荐Pycharm)
二. 源码如下(需要修改input为自己拍摄的source)
"""通过使用OpenCV-Python实现手动对物体进行boundingbox的绘制,以及之后对boundingbox的追踪"""
import cv2

cap = cv2.VideoCapture("bottle_capture.mp4")
tracker = cv2.TrackerMIL_create()  # 导入tracker

#############
tracker的部分有可能会因为opencv版本的不同而导致调用失败,因此根据自己的版本可进行相应的tracker的选择,一般情况下都是可以使用的,但tracking的精度上稍有不同
tracker = cv2.TrackerBoosting_create()
tracker = cv2.TrackerMIL_create()
tracker = cv2.TrackerKCF_create()
tracker = cv2.TrackerTLD_create()
tracker = cv2.TrackerMedianFlow_create()
tracker = cv2.TrackerCSRT_create()
tracker = cv2.TrackerMOSSE_create()
#############

# 在视频的第一帧中,通过手动绘制boundingbox去抓取目标,抓取成功之后敲击回车键,boundingbox便会被视为之后将要tracking的对象
success, frame = cap.read()
boundingBox = cv2.selectROI("Tracking", frame, False)
tracker.init(frame, boundingBox)

# 在接下来的视频的其他帧中,按照之前第一帧自己绘制的bounding box的顶点、长、宽去重复添加boundingbox
def drawBox(img, boundingBox):
    x, y, w, h = int(boundingBox[0]), int(boundingBox[1]), int(boundingBox[2]), int(boundingBox[3])
    cv2.rectangle(img, (x, y), ((x + w), (y + h)), (255, 0, 255), 3, 3)
    cv2.putText(img, "Tracking", (100, 75), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)  # 捕获成功地话在界面中输出:tracking 


while True:
    timer = cv2.getTickCount()
    success, img = cap.read()
    success, boundingBox = tracker.update(img)

    if success:  # 如果在第一帧手动添加boundingbox 成功的话
        drawBox(img, boundingBox)  # 绘制bounding box在接下来的帧中
    else:  # 如果第一帧手动添加boundingbox失败的话则在界面上输出:lost the target
        cv2.putText(img, "Lost the target", (75, 75), cv2.FONT_ITALIC, 0.9, (0, 0, 255), 2)

    cv2.rectangle(img, (15, 15), (200, 90), (255, 0, 255), 2)
    cv2.putText(img, "Fps:", (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 255), 2)  # 显示fps
    cv2.putText(img, "Status:", (20, 75), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 255), 2)

    fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer)  # 获取视频的fps
     # 根据视频fps的大小去定义显示fps字体的颜色
    if fps > 60: 
        myColor = (20, 230, 20)
    elif fps > 20:
        myColor = (230, 20, 20)
    else:
        myColor = (20, 20, 230)
    cv2.putText(img, "FPS:" + str(int(fps)), (75, 50), cv2.FONT_ITALIC, 0.9, myColor, 2)  # 显示fps

    cv2.imshow("Tracking", img)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break
三. 结果展示(由于上传图片大小的限制,gif动图较短)

by demo

四. 解惑与推荐
  1. 对于boundingbox的参数的理解:
    boundingbox有四个值,分别是x, y, w, h,其中(x, y)组成了boundingbox的左上角顶点的坐标,w代表boundingbox的宽, h代表boundingbox的高。
  2. 有关tracking的博文推荐:https://ehsangazar.com/object-tracking-with-opencv-fd18ccdd7369(内容为英文)
  3. OpenCV-Python教程推荐:https://www.youtube.com/watch?v=1FJWXOO1SRI&list=RDCMUCYUjYU5FveRAscQ8V21w81A&start_radio=1&t=1094(内容为英文,需要翻墙)

如有问题,敬请指正。欢迎转载,但请注明出处。
Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐