机器学习:opencv--光流估计

目录

前言

一、光流估计前提

1.亮度恒定

2.小运动

3.空间一致

二、光流估计案例


前言

光流估计(Optical Flow Estimation)是计算机视觉中的一种技术,用于估计在连续帧图像中物体或场景的运动。它基于假设:在短时间间隔内,物体表面的亮度保持不变,并且相邻帧之间的小区域的运动可以用一个光流场来表示。

一、光流估计前提

1.亮度恒定

同一点随着时间的变化,其亮度不会发生改变。

2.小运动

随着时间的变化不会引起位置的剧烈变化,只有小运动情况下才能用前后帧之间单位位置变化引起的灰度变化去近似灰度对位置的偏导数。

3.空间一致

一个场景上邻近的点投影到图像上也是邻近点,且邻近点速度一致。因为光流法基本方程约束只有一个,而要求x,y方向的速度,有两个未知变量。所以需要连立n多个方程求解。

二、光流估计案例

python 复制代码
import numpy as np
import cv2

# 打开视频文件
cap = cv2.VideoCapture('test.avi')
# 随机生成颜色,用于绘制轨迹
color = np.random.randint(0, 255, (100, 3))
# 读取视频的第一帧
ret, old_frame = cap.read()

old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)

# 定义特征点检测参数
feature_params = dict(maxCorners=100,  # 最大角点数量
                      qualityLevel=0.3,  # 角点质量阈值
                      minDistance=7)  # 最小距离 用于分散角点

p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)  # **:关键字参数解包,用于将字典解包为关键字参数
# print(p0)

# 创建一个与当前帧大小相同的全零掩模,用于绘制轨迹
mask = np.zeros_like(old_frame)

# 定义Lucas-Kanade光流参数
lk_params = dict(winSize=(15, 15),  # 窗口大小
                 maxLevel=2)  # 金字塔层数

# 主循环,处理视频的每一帧
while (True):
    # 读取下一帧
    ret, frame = cap.read()
    # 检查是否成功读取到帧
    if not ret:
        break

    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 光流估计
    p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)

    """
    p1:当前帧中对应于p0的新位置(光流计算得到的特征点坐标)。
    st:状态数组,表示每个点是否成功跟踪(1表示成功,0表示失败)。
    err:误差数组,包含跟踪每个点的误差信息。
    """
    # 选择好的点(状态为1的点)
    good_new = p1[st == 1]
    good_old = p0[st == 1]

    # 绘制轨迹
    for i, (new, old) in enumerate(zip(good_new, good_old)):
        a, b = new.ravel()  # 获取新点的坐标或者[a,b]= new
        c, d = old.ravel()  # 获取旧点的坐标
        a, b, c, d = int(a), int(b), int(c), int(d)  # 转换为整数
        # 在掩模上绘制线段,连接新点和旧点
        mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2)
        cv2.imshow('mask', mask)

    # 将掩模添加到当前帧上,生成最终图像
    img = cv2.add(frame, mask)
    # 显示结果图像
    cv2.imshow('frame', img)
    # 等待150ms,检测是否按下了Esc键(键码为27)
    k = cv2.waitKey(150) & 0xff
    if k == 27:  # 按下ESc键,退出循环
        break
    # 更新旧灰度图和旧特征点
    old_gray = frame_gray.copy()
    p0 = good_new.reshape(-1, 1, 2)  # 重新整理特征点为适合下次计算的形状:(38,2)-->(38,1,2)
# 释放资源
cv2.destroyAllWindows()
cap.release()

输出:

将人物的行动轨迹记录下来

相关推荐
唯创知音16 分钟前
医疗器械设备语音ic芯片方案-选型大全
人工智能·单片机·物联网·智能家居·语音识别
纪怽ぅ35 分钟前
浅谈——深度学习和马尔可夫决策过程
人工智能·python·深度学习·算法·机器学习
设计是门艺术1 小时前
蚂蚁Ant Design:设计师的理想工具
人工智能·ui
NewsMash1 小时前
北京环球金融中心首启“守望秦岭”展览暨户外大熊猫公共装置亮相
人工智能·生活
z千鑫1 小时前
【AI开源项目】FastGPT- 快速部署FastGPT以及使用知识库的两种方式!
人工智能·ai·chatgpt·开源·ai编程·fastgpt·codemoss能用ai
爱数学的程序猿2 小时前
深入探索:深度学习在时间序列预测中的强大应用与实现
人工智能·深度学习·神经网络·机器学习
攻城狮_Dream2 小时前
论文题目:深度学习在自然语言处理中的应用研究
人工智能·深度学习·自然语言处理·本科论文
爱技术的小伙子2 小时前
【ChatGPT】优化ChatGPT生成内容的语言风格与语气
人工智能·chatgpt
神奇夜光杯2 小时前
Python酷库之旅-第三方库Pandas(181)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
徐小夕@趣谈前端2 小时前
MaxKB: 一款基于大语言模型的知识库问答系统
人工智能·语言模型·自然语言处理