You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python初学者求助:能否在同一视频上绘制不同函数图像?

在同一视频帧上绘制不同函数图像的解决方案

当然可以在同一个视频帧上绘制不同的图形/函数图像!你的思路方向是对的,但现有代码里的multiprocessing其实没必要(甚至会带来问题,因为cv2.VideoCapture对象不能安全地在多进程间共享),而且代码没完成资源释放的部分。下面给你整理一个更合理的实现方案:

核心思路

直接在主线程的视频读取循环中,依次调用不同的绘图函数即可——因为视频帧的处理是串行的,单线程就能轻松完成多个图形的绘制,避免多进程带来的同步问题。

完善后的示例代码

import numpy as np
import cv2

# 定义第一个绘图函数:画直线
def draw_line(img):
    cv2.line(img, (50, 180), (380, 180), (0, 255, 0), 5)

# 定义第二个绘图函数:比如画一个矩形(你可以替换成自己的函数图像绘制逻辑)
def draw_rectangle(img):
    cv2.rectangle(img, (100, 100), (300, 200), (0, 0, 255), 3)

# 主函数:读取视频并绘制图形
def main():
    cap = cv2.VideoCapture('C:/Users/littl/Desktop/Presentation/Crop_DownResolution.mp4')
    
    while cap.isOpened():
        ret, img = cap.read()
        if ret:
            # 调用多个绘图函数,在同一帧上绘制不同图形
            draw_line(img)
            draw_rectangle(img)
            
            cv2.imshow('img', img)
            # 按ESC退出
            if cv2.waitKey(1) & 0xFF == 27:
                break
        else:
            break
    
    # 必须释放资源!
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

关键注意事项

  • 避免多进程处理单视频流:cv2.VideoCapture是线程不安全的,多进程同时读取会导致帧错乱、程序崩溃,单线程处理完全足够。
  • 封装绘图逻辑:把不同的绘制操作拆成单独函数,代码更易维护,你可以随时添加新的绘图函数(比如绘制正弦曲线、自定义函数图像)。
  • 资源释放不能忘:循环结束后一定要调用cap.release()释放视频资源,cv2.destroyAllWindows()关闭所有OpenCV窗口,否则可能导致内存泄漏。

如果你的“函数图像”是指数学函数(比如y=sin(x)),可以先计算函数的坐标点,再用cv2.polylines()把点连起来绘制在帧上,原理和上面的示例一致——只需要把绘图函数替换成计算坐标+连线的逻辑即可。

内容的提问来源于stack exchange,提问作者L Rong Fei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:48:27