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

server/2024/10/19 3:55:35/

目录

前言

一、光流估计前提

1.亮度恒定

2.小运动

3.空间一致

二、光流估计案例


前言

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

 

一、光流估计前提

1.亮度恒定

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

 

2.小运动

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

 

3.空间一致

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

 

二、光流估计案例

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:breakframe_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]= newc, 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) & 0xffif 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()

输出:

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


http://www.ppmy.cn/server/132934.html

相关文章

Spring Boot为医疗行业B2B平台带来的变革

第2章 设计技术与开发环境 2.1 相关技术介绍 2.1.1 B/S模式分析 C/S模式主要由客户应用程序(Client)、服务器管理程序(Server)和中间件(middleware)三个部件组成。客户应用程序是系统中用户与数据组件交互。服务器程序负责系统资源,如管理信息数据库的有效管理&…

【Python数据分析】利用Pandas库轻松处理大数据

【Python数据分析】利用Pandas库轻松处理大数据 在现代数据分析中,随着数据量的快速增长,处理大规模数据成为了必然的挑战。幸运的是,Python作为最受欢迎的编程语言之一,其生态系统为我们提供了强大的工具,尤其是Pand…

Cocos Creator 原生Android项目打 aab 包,升级到Android14(API 34)

注意:打aab包的前提是需要配置对应gradle文件。这里我简单说下,我这边做的。 1.setting.gradle文件中配置 include ‘:asset_pack’ 。如下图 2.找到对应的 asset_pack 的 gradle文件,一定要改assetPack。如下图: deliveryType = “install-time” //PAD资源分发 安装时分…

Switching Temporary Teachers for Semi-Supervised Semantic Segmentation 论文阅读

code: naver-ai/dual-teacher: Official code for the NeurIPS 2023 paper "Switching Temporary Teachers for Semi-Supervised Semantic Segmentation" (github.com) paper: 7eeb42802d3750ca59e8a0523068e9e6-Paper-Conference.pdf (neurips.cc) 在半监督语义分…

Android Framework AMS(09)service组件分析-3(bindService和unbindService关键流程分析)

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:上上一章节主要解读应用层service组件启动的2种方式startService和bindService,以及从APP层到AMS调用之间的打通。上一章节我们关注了s…

Android JNI调用.c文件

Android JNI调用.c文件 1.创建Android项目,创建一个jni目录来存放.c代码 2.CMakeLists.txt cmake_minimum_required(VERSION 3.10.2) project("MyApplication")add_library(native-lib SHARED native-lib.c)find_library(log-lib log)target_link_libraries

开发一个微信小程序要多少钱?

在当今数字化时代,微信小程序成为众多企业和个人拓展业务、提供服务的热门选择。那么,开发一个微信小程序究竟需要多少钱呢? 开发成本主要取决于多个因素。首先是功能需求的复杂程度。如果只是一个简单的信息展示小程序,功能仅限…

简单实现通过电脑操作手机

通过电脑操作手机,支持单击,拖抓事件,延时有1-2秒。 具体步骤: 1、从手机截图到sdcard 2、将图片导出到PC 3、从PC加载展示图片 4、开启定时器 5、设置点击、滚动事件 1、 private static void takeScreenshot(String path)…