首页 > 编程问答 >有没有办法在Python中使用OpenCV在边界框后面画一条线?

有没有办法在Python中使用OpenCV在边界框后面画一条线?

时间:2024-07-28 08:22:34浏览次数:15  
标签:python opencv image-processing tracking

我正在为我的本科论文编写一个应用程序,该应用程序从根本上允许使用 OpenCV 库跟踪视频源中的多个对象。为了进一步发展这个想法,我希望能够在屏幕上画一条线,显示边界框在我正在跟踪的对象周围的历史记录。

我注意到没有排序用于执行此操作的内置函数,因此任何有关制作此类内容的指针都会有用,因为网上关于此主题的信息不多。


在 OpenCV 中没有内置函数可以在边界框后绘制轨迹线。但是,可以使用 OpenCV 函数和一些 Python 代码轻松实现这一点。以下是如何操作:

import cv2

# 初始化一个列表来存储边界框历史记录
bbox_history = []

# 定义要绘制的轨迹线颜色(例如,绿色)
trail_color = (0, 255, 0) 

# 打开视频流
cap = cv2.VideoCapture(0) 

while True:
    # 从流中读取帧
    ret, frame = cap.read() 

    # 在这里执行对象检测(例如,使用 YOLO、Haar Cascades 等)
    # ... 

    # 假设获得了名为 'bbox' 的检测到的对象的边界框坐标
    # bbox = [x, y, w, h] 

    # 将边界框添加到历史记录列表中
    bbox_history.append(bbox) 

    # 绘制轨迹线
    for i in range(1, len(bbox_history)):
        # 从历史记录中获取前一个和当前的边界框坐标
        prev_bbox = bbox_history[i-1]
        curr_bbox = bbox_history[i]

        # 计算边界框中心点的坐标
        prev_center = (prev_bbox[0] + prev_bbox[2] // 2, prev_bbox[1] + prev_bbox[3] // 2) 
        curr_center = (curr_bbox[0] + curr_bbox[2] // 2, curr_bbox[1] + curr_bbox[3] // 2)

        # 在两个中心点之间画一条线
        cv2.line(frame, prev_center, curr_center, trail_color, 2) 

    # 在帧上绘制当前边界框
    cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[0]+bbox[2], bbox[1]+bbox[3]), (255, 0, 0), 2) 

    # 显示结果帧
    cv2.imshow("Object Tracking", frame)

    # 按 'q' 退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows() 

这段代码通过将每个检测到的边界框存储到一个列表中来工作,从而维护边界框的历史记录。然后,它遍历历史记录并在每个连续的边界框中心点之间画一条线,从而有效地创建了一个轨迹线。

可以根据需要调整轨迹线的颜色和厚度。此外,可以通过实现一种机制来限制历史记录列表的大小,以防止其无限增长,从而潜在地优化代码。这可以通过使用 del 关键字删除旧的边界框条目,或者通过使用具有最大大小的 collections.deque 来实现。

标签:python,opencv,image-processing,tracking
From: 60163191

相关文章

  • 如何向 python pandas 数据透视表添加过滤器? (pd.read_excel)
    我正在尝试使用pandas库在python中重新创建我在Excel中制作的数据透视表。我试图用时间段作为过滤器来总结超过500k行的OD总行程数据。在Excel上,我只会执行行(O)、列(D)、值(行程)、过滤器(时间)。到目前为止,在python上我只有索引、列、值、aggfunc,但我不知道如何过滤。有......
  • 标量添加中的 Python 溢出警告
    我想执行一个简单的操作:b+g+rb,g,r变量是整数并且值低于256。我收到溢出警告和错误的结果。问题是操作很简单(结果不高于765),我不应该收到溢出警告这是我的代码:importcv2ascvimportnumpyasnpimgname='r_hh_classic.png'img=cv.imread(imgname)h,w,_=......
  • 在 Python 中读取部分 MP3 文件时处理“对于可用位计数来说太大”错误
    我正在尝试读取MP3文件的特定部分,但遇到错误:[src/libmpg123/layer3.c:INT123_do_layer3():1771]error:part2_3_length(1376)toolargeforavailablebitcount(760)可以访问音频文件此处我的环境是使用此Docker映像设置的:pytorc......
  • Python SQLAlchemy 2.0 使用 dataclass_transform 非必需字段类型
    我刚刚在一个新项目上安装了SQLAlchemy2.0,我正在尝试使我的模型尽可能类型安全。通过使用@typing_extensions.dataclass_transform,我已经能够实现我想要实现的大部分目标类型检查,但是当前所有字段都被标记为不需要。例如:@typing_extensions.dataclass_tran......
  • 当读取字节时,Python 将 \n 解释为 0xd0
    换行符被解释为Ð(0xd0)而不是(0x0a),我真的不知道如何解决这个问题。我也不知道从哪里开始。当尝试使用此代码时,它将0x0a读为0xd0。withopen(path,"rb")asroot:b_arr=root.read()+b""print("Processing...")buffer=""b_arr......
  • 在Python 3中获取范围的特定形式
    当获取range(1,100)时,我得到:[1,2,3,4,5...99]我需要像这个范围的zip之类的东西:[50,49,51,48,52,47,53...99]如何获取它?背景:这都是关于比特币谜题66的。首先我做了对过去已知的私钥进行线性回归预测,直到第65题为止。我......
  • Python:如何使用pyaudio或sounddevice等库进行自动录音?
    我想做一个项目,需要满足以下录音要求:程序启动后,会在后台不断检测麦克风的声音,当声音分贝大于一定值时打开录音流级别,当分贝低于一定级别时关闭录音流并保存为wav文件。我知道原理,但我无法使用这些库来实现。我想实现以上结果使用Python实现自动录音以下代......
  • OpenCV aruco 标记检测不起作用
    我想在OpenCV中检测图像中的aruco标记。我的OpenCV版本是4.8.0。看起来它已被其他一些功能取代,我找不到任何指南。感谢您的帮助!#programtodetectarucomarkerswithopencv24.8.0versionimportcv2importnumpyasnp#dictionaryofarucomarkersaruco_dict=......
  • 当我们创建一个在 https 服务器上获取和发送数据的 python 应用程序时,我们应该如何处
    python脚本使用Urllib3,我的服务器是在Node.js上编写的脚本。我担心(并且不清楚)证书:我是否需要将我的python应用程序上的证书另存为变量?例如我这样做了,http=urllib3.PoolManager(cert_reqs="CERT_REQUIRED",ca_certs='client-cert.pem')并且我不知道......
  • 使用 Python 进行 Web 抓取以获取数据 NoneType ERROR
    我正在努力为我的学校项目获取美元和价格。所以我决定为此使用网络抓取,但我有一个问题。当我尝试在服务器上使用我的代码时,它给我NoneType错误。它可以在googlecolab上使用,但我无法在我的电脑或服务器上使用。我该如何解决这个问题?网页抓取代码;defdolar():he......