OpenCV项目8-目标追踪之LK光流法

该文章详细介绍了如何利用OpenCV的LK光流算法进行目标追踪。首先,读取视频并提取第一帧,然后将图像转换为灰度,接着进行角点检测。在后续帧中,通过calcOpticalFlowPyrLK方法计算光流,追踪特征点并绘制轨迹。文章最后展示了如何处理窗口事件及释放资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • Lucas-Kanade:LK算法
  • calcOpticalFlowPyrLK:计算光流金字塔LK算法

1.视频读取

import numpy as np
import cv2
cap = cv2.VideoCapture('./test.avi')

2.第一帧图片、灰度化

ret, old_frame = cap.read() 
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)

3.图片角点检测

feature_params = dict(
    maxCorners=100,
    qualityLevel=0.3,
    minDistance=7)
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params) # goodFeaturesToTrack:角点检测  **:拆字典

4.mask掩码创建

mask = np.zeros_like(old_frame) # zeros_like:创建全是0且形状与...一致的矩阵

5.第二帧图片、灰度化

color = np.random.randint(0, 255, (100, 3))
while True:
    ret, frame = cap.read()
    if frame is None:
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

6.光流估计

# None:下一帧特征点 winSize:窗口大小即方框 maxLevel:最大金字塔层级 p1:特征点
    p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, gray, p0, None, winSize=(15, 15), maxLevel=2) 
    good_new = p1[st==1] # 哪些特征点找到 哪些特征点没找
    good_old = p0[st==1]

8.轨迹绘制

    for i, (new, old) in enumerate(zip(good_new, good_old)):
        a, b = new.ravel()
        c, d = old.ravel()
        mask = cv2.line(mask, (int(a), int(b)), (int(c), int(d)), color[i].tolist(), 2) # tolist:转为列表
        frame = cv2.circle(frame, (int(a), int(b)), 5, color[i].tolist(), -1) # circle:圆函数 画点 -1:圆点为实心    img = cv2.add(frame, mask)
    cv2.imshow('frame', img)
    key = cv2.waitKey(150)
    if key == 27:
        break   
    old_gray = gray.copy() # 更新图
    p0 = good_new.reshape(-1, 1, 2) # 更新特征点

9.窗口摧毁、释放资源

    for i, (new, old) in enumerate(zip(good_new, good_old)):
        a, b = new.ravel()
        c, d = old.ravel()
        mask = cv2.line(mask, (int(a), int(b)), (int(c), int(d)), color[i].tolist(), 2) # tolist:转为列表
        frame = cv2.circle(frame, (int(a), int(b)), 5, color[i].tolist(), -1) # circle:圆函数 画点 -1:圆点为实心    img = cv2.add(frame, mask)
    cv2.imshow('frame', img)
    key = cv2.waitKey(150)
    if key == 27:
        break   
    old_gray = gray.copy() # 更新图
    p0 = good_new.reshape(-1, 1, 2) # 更新特征点

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿值

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

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

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

打赏作者

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

抵扣说明:

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

余额充值