50行代码利用Python-OpenCV绘制视频中运动轨迹热力图

4 篇文章 13 订阅
3 篇文章 0 订阅

在这里插入图片描述

一、环境配置

opencv-python == 3.4.2.16
opencv-contrib-python == 3.4.2.16
numpy == 1.19.3

二、算法步骤:

核心思路是,通过高斯混合差值算法,计算相邻帧图像的差值,得到二值图像,利用二值图像进行累积求和,得到累积二值图,并将累计二值图转为伪彩色图像,与原图像进行融合,得到运动轨迹热力图。

step1.构建视频流

cap = cv2.VideoCapture('TownCentreXVID.avi'),用于读取视频的每一帧

step2.初始化初始参数

初始化累积二值图像accum_image,用于累积每一帧的背景差分二值图的和

step3.差值计算

filter = background_subtractor.apply(frame),用于计算差值,去除背景

step4.累积二值图,并赋予伪彩色,和原图进行融合
# 1.二值化
ret, th1 = cv2.threshold(filter, threshold, maxValue, cv2.THRESH_BINARY) 
# 2.累积二值图
accum_image = cv2.add(accum_image, th1)
# 3.赋予伪彩色
color_image_video = cv2.applyColorMap(accum_image, cv2.COLORMAP_HOT)
# 4.图像融合
video_frame = cv2.addWeighted(frame, 0.7, color_image_video, 0.7, 0)
step5.显示与保存

使用cv2.imshow()cv2.imwrite()显示和保存图像

三、完整代码

只需要更改第五行中的视频文件路径

import numpy as np
import cv2
import copy

def main():
    capture = cv2.VideoCapture('TownCentreXVID.avi')
    background_subtractor = cv2.bgsegm.createBackgroundSubtractorMOG()  # 基于高斯混合的背景差分算法,原理可参考https://blog.csdn.net/qq_30815237/article/details/87120195
    length = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))

    first_iteration_indicator = 1
    for i in range(0, length):
        ret, frame = capture.read()
        frame = cv2.resize(frame,dsize=None,fx=0.3,fy=0.3)
        # 第一帧作为初始化
        if first_iteration_indicator == 1:
            first_frame = copy.deepcopy(frame)
            height, width = frame.shape[:2]
            accum_image = np.zeros((height, width), np.uint8)
            first_iteration_indicator = 0
        else:
            filter = background_subtractor.apply(frame)  
            threshold = 2
            maxValue = 2
            ret, th1 = cv2.threshold(filter, threshold, maxValue, cv2.THRESH_BINARY)
            # 差分图的累积计算图,用于绘制热力背景
            accum_image = cv2.add(accum_image, th1)
            # 为二值图添加伪色彩
            color_image_video = cv2.applyColorMap(accum_image, cv2.COLORMAP_HOT)
            # 图像融合
            video_frame = cv2.addWeighted(frame, 0.7, color_image_video, 0.7, 0)
            cv2.imshow('frame',frame)   # 原图
            cv2.imshow('diff-bkgnd-frame',filter)   # 背景差分图,通过高斯混合差分算法得到的差分图
            cv2.imshow('mask',accum_image)
            cv2.imshow('result',video_frame)

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

    color_image = cv2.applyColorMap(accum_image, cv2.COLORMAP_HOT)
    result_overlay = cv2.addWeighted(first_frame, 0.7, color_image, 0.7, 0)

    # 保存最终图
    cv2.imwrite('diff-overlay.jpg', result_overlay)

    # 释放
    capture.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()
参考

1.https://towardsdatascience.com/build-a-motion-heatmap-videousing-opencv-with-python-fd806e8a2340
2.https://blog.csdn.net/qq_30815237/article/details/87120195

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以通过以下步骤实现: 1. 导入需要的库: ```python import cv2 import numpy as np ``` 2. 创建一个窗口,读取第一帧图像并转为灰度图: ```python cap = cv2.VideoCapture(0) ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) ``` 3. 定义需要用到的变量: ```python # 运动轨迹 trajectory = [] # Shi-Tomasi角点检测参数 feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7, blockSize=7) # Lucas-Kanade光流参数 lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) # 随机颜色 color = np.random.randint(0, 255, (100, 3)) ``` 4. 进主要的算法流程: ```python while True: # 读取并转换当前帧为灰度图 ret, frame = cap.read() gray_next = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 计算光流 p1, st, err = cv2.calcOpticalFlowPyrLK(gray, gray_next, np.array(pts, np.float32), None, **lk_params) # 选取好的匹配点 good_new = p1[st == 1] good_old = pts[st == 1] # 绘制轨迹 for i, (new, old) in enumerate(zip(good_new, good_old)): a, b = new.ravel() c, d = old.ravel() trajectory.append([a, b]) mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2) frame = cv2.circle(frame, (a, b), 5, color[i].tolist(), -1) # 把运动轨迹画在图像上,并显示 img = cv2.add(frame, mask) cv2.imshow('frame', img) # 更新上一帧图像及特征点位置 gray = gray_next.copy() pts = good_new.reshape(-1, 1, 2) # 退出 if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` 以上就是使用Python-OpenCV画出一点运动轨迹代码实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小风_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值