使用opencv调用TV_L1算法提取光流

提取视频的光流并使用灰度图可视化

import cv2
import numpy as np
import pickle
import osdef compute_tvl1_optical_flow(video_path):# 创建视频捕获对象cap = cv2.VideoCapture(video_path)ret, frame1 = cap.read()if not ret:print("Failed to read video")return None  # 返回None,表示无法读取视频# 将第一帧转换为灰度prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)# 创建TVL1光流对象optical_flow = cv2.optflow.DualTVL1OpticalFlow_create()# 初始化用于存储光流数据的列表flows = []# 读取视频帧并计算光流while True:ret, frame2 = cap.read()if not ret:break# 将当前帧转换为灰度next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)# 计算光流flow = optical_flow.calc(prvs, next, None)# 将光流数据添加到列表中flows.append(flow)# 更新前一帧prvs = nextcap.release()# 返回光流数据列表return flowsdef save_optical_flows(flows, filepath):with open(filepath, 'wb') as file:pickle.dump(flows, file)def draw_gray(flow, scale=1, gamma=0.1):# 计算每个像素点的速度大小magnitude = np.sqrt(flow[:, :, 0] ** 2 + flow[:, :, 1] ** 2)# 应用gamma校正来增强低亮度区域的可视化magnitude = np.power(magnitude, gamma)# 将速度大小归一化到0-255的范围normalized_mag = cv2.normalize(magnitude, None, 0, 255, cv2.NORM_MINMAX)# 将浮点数转换为8-bit整数,并调整亮度gray_img = np.uint8(normalized_mag * scale)return gray_img# 使用函数
video_path = '/home/yunchuan/video_features-master/sample/v_ZNVhz7ctTq0.mp4'
output_dir = '/home/yunchuan/video_features-master/sample/flow_images/'
if not os.path.exists(output_dir):os.makedirs(output_dir)flows = compute_tvl1_optical_flow(video_path)if flows is not None:print("Successfully computed optical flows.")save_optical_flows(flows, '/home/yunchuan/video_features-master/sample/flows.pkl')  # 保存光流数据for i, flow in enumerate(flows):img = draw_gray(flow)flow_image_path = os.path.join(output_dir, f'gray_flow_{i}.png')cv2.imwrite(flow_image_path, img)  # 保存光流图像cv2.destroyAllWindows()
else:print("Failed to compute optical flows.")

计算两张图片之间的光流并使用灰度图可视化

import cv2
import numpy as np
import osdef calculate_optical_flow(image1_path, image2_path):# 读取两张图片frame1 = cv2.imread(image1_path)frame2 = cv2.imread(image2_path)if frame1 is None or frame2 is None:print("Error loading images!")return None# 检查并调整两张图片的尺寸,确保它们大小相同h1, w1 = frame1.shape[:2]h2, w2 = frame2.shape[:2]h = min(h1, h2)w = min(w1, w2)h=180w=280# 将图片大小调整为最小的共同尺寸frame1 = cv2.resize(frame1, (w, h))frame2 = cv2.resize(frame2, (w, h))# 将图片转换为灰度prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)# 创建TVL1光流对象optical_flow = cv2.optflow.DualTVL1OpticalFlow_create()# 计算两张图片之间的光流flow = optical_flow.calc(prvs, next, None)return flowdef draw_gray(flow, scale=1, gamma=0.1):# 计算每个像素点的速度大小magnitude = np.sqrt(flow[:, :, 0] ** 2 + flow[:, :, 1] ** 2)# 应用gamma校正来增强低亮度区域的可视化magnitude = np.power(magnitude, gamma)# 将速度大小归一化到0-255的范围normalized_mag = cv2.normalize(magnitude, None, 0, 255, cv2.NORM_MINMAX)# 将浮点数转换为8-bit整数,并调整亮度gray_img = np.uint8(normalized_mag * scale)return gray_img# 指定两张图片的路径
image1_path = '/home/yunchuan/video_features-master/sample_images/image1.jpg'
image2_path = '/home/yunchuan/video_features-master/sample_images/image2.jpg'# 输出路径
output_dir = '/home/yunchuan/video_features-master/sample_images/'
if not os.path.exists(output_dir):os.makedirs(output_dir)# 计算光流
flow = calculate_optical_flow(image1_path, image2_path)
if flow is not None:# 可视化光流为灰度图gray_flow_image = draw_gray(flow)gray_flow_image_path = os.path.join(output_dir, 'optical_flow_visualization.png')cv2.imwrite(gray_flow_image_path, gray_flow_image)print(f"Optical flow visualization saved to {gray_flow_image_path}")# 保存原始光流数据raw_flow_path = os.path.join(output_dir, 'raw_optical_flow.npy')np.save(raw_flow_path, flow)print(f"Raw optical flow data saved to {raw_flow_path}")
else:print("Failed to compute optical flow.")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/463739.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为荣耀曲面屏手机下面空白部分设置颜色的方法

荣耀部分机型下面有一块空白区域&#xff0c;如下图红框部分 设置这部分的颜色需要在themes.xml里面设置navigationBarColor属性 <item name"android:navigationBarColor">android:color/white</item>

【开源免费】基于SpringBoot+Vue.JS新闻推荐系统(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 056 &#xff0c;文末自助获取源码 \color{red}{T056&#xff0c;文末自助获取源码} T056&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

使用DJL和PaddlePaddle的口罩检测详细指南

使用DJL和PaddlePaddle的口罩检测详细指南 完整代码 该项目利用DJL和PaddlePaddle的预训练模型&#xff0c;构建了一个口罩检测应用程序。该应用能够在图片中检测人脸&#xff0c;并将每张人脸分类为“戴口罩”或“未戴口罩”。我们将深入分析代码的每个部分&#xff0c;以便…

【MySQL】架构

1. MySQL架构基本理解 与餐厅就餐类比理解 每次数据库查询就像一次餐厅服务 应用程序发出查询相当于点菜MySQL解析和执行查询&#xff0c;后厨根据订单制作食物事务管理保证数据的一致性&#xff0c;类似于结账的时候保证账单正确查询的时候考虑优化器&#xff0c;类似于厨师选…

Linux服务器或Linux计算机设置不记录历史命令

1.设置环境变量 打开命令终端&#xff0c;编辑.bashrc文件中&#xff0c;修改HISTSIZE和HISTFILESIZE都为0 sudo nano ~/.bashrcfor setting history length see HISTSIZE and HISTFILESIZE in bash(1) HISTSIZE0 HISTFILESIZE0 2.生效 source ~/.bashrc 3.验证 cat ./b…

基于Spring Boot的中小型制造企业质量管理系统设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

动手学深度学习65 注意力分数

1. 注意力分数 好处&#xff1a;k q v的长度都可以不一样。 2. 代码 3. QA 1 画出注意力权重&#xff0c;对任何一行query&#xff0c;给每一对key-value多少注意力【哪对key-value更重要】 2 语义上的区别 3 是的。一元版本换成向量版本 4 通常用相似度做注意力分数&…

从新手到专家:7款电脑平面设计软件评测

平面设计在时尚、广告等多个领域扮演着重要角色&#xff0c;而创作出独特且富有创意的设计作品则需要依赖优秀的电脑平面设计软件。市场上的电脑平面设计软件众多&#xff0c;每款软件都有其独到之处。本文将为你推荐几款值得关注的电脑平面设计软件&#xff0c;并分析它们的特…

HTML 块级元素和内联(行内)元素详解

在 HTML 中,元素根据它们在页面中的表现方式分为两类:块级元素 和 内联元素(行内元素)。了解块级元素和内联元素的特性与使用方法,是掌握HTML开发的重要基础。本文将深入探讨这两类元素的特点及其在实际开发中的应用。 文章目录 一、块级元素1.1 块级元素是什么?1.2 块级…

微信支付宝小程序SEO优化的四大策略

在竞争激烈的小程序市场中&#xff0c;高搜索排名意味着更多的曝光机会和潜在用户。SEO即搜索引擎优化&#xff0c;对于小程序而言&#xff0c;主要指的是在微信小程序商店中提高搜索排名&#xff0c;从而增加曝光度和用户访问量。有助于小程序脱颖而出&#xff0c;提升品牌知名…

内存马浅析

之前在jianshu上写了很多博客&#xff0c;但是安全相关的最近很多都被锁了。所以准备陆陆续续转到csdn来。内存马前几年一直是个很热门的漏洞攻击手段&#xff0c;因为相对于落地的木马&#xff0c;无文件攻击的内存马隐蔽性、持久性更强&#xff0c;适用的漏洞场景也更多。 J…

【网络】套接字编程——TCP通信

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;TCP网络服务器简单模拟实现。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;…

CytoSPACE·空转和单细胞数据的高分辨率比对

1. 准备输入文件&#xff0c;需要四个文件&#xff0c;所有文件都应以制表符分隔的表格输入格式 (.txt) 提供。 a. scRNA-seq 基因表达文件 矩阵必须是基因&#xff08;行&#xff09;乘以细胞&#xff08;列&#xff09;。 第一行必须包含单个细胞 ID&#xff0c;第一列必须…

模型 定位地图

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。心智导航现实的空间图。 1 定位地图模型的应用 1.1 小玉的职业定位与发展规划 小玉&#xff0c;24岁&#xff0c;市场营销专业本科毕业生&#xff0c;有半年汽车销售实习经历。毕业后&#xff0c;她…

规划误差降低27%,碰撞率降低33%Senna: 大规模视觉-语言模型与端到端自动驾驶相结合

Abstract 端到端自动驾驶在大规模数据中展示了强大的规划能力&#xff0c;但在复杂、罕见的场景中仍然因常识有限而表现不佳。相比之下&#xff0c;大型视觉语言模型&#xff08;LVLMs&#xff09;在场景理解和推理方面表现出色。前进的方向在于融合两者的优势。以往利用LVLMs…

深入浅出 | 谈谈MNN GPU性能优化策略

MNN(Mobile Neural Network)是一个高性能、通用的深度学习框架&#xff0c;支持在移动端、PC端、服务端、嵌入式等各种设备上高效运行。MNN利用设备的GPU能力&#xff0c;全面充分“榨干”设备的GPU资源&#xff0c;来进行深度学习的高性能部署与训练。 概述 MNN自开源以来&a…

UE 引入 IOS framework库的坑

一、我明明已经把framework库进行签名的却在 上传到开发者后台时一直报错 90034 签章遗失 或者 未签 这个问题我最近遇到 极其坑爹 我是这个情况 这是我的framework库的目录 关键就在这了 多出了这个文件 就影响了 上传到开发者后台 就报错 90034 将其删除就好 &…

Rust 力扣 - 3090. 每个字符最多出现两次的最长子字符串

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 本题使用滑动窗口进行求解&#xff0c;使用左指针和右指针分别表示窗口的左边界和窗口的右边界&#xff0c;使用哈希表记录窗口内的字符及其对应数量 我们首先向右移动右指针&#xff0c;将字符加入到哈希表中进…

Spring Boot框架下的信息学科平台系统开发实战

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于保密信息学科平台系统的开发全过程。通过分析基于保密信息学科平台系统管理的不足&#xff0c;创建了一个计算机管理基于保密信息学科平台系统的方案。文章介…

利用EasyExcel实现简易Excel导出

目标 通过注解形式完成对一个方法返回值的通用导出功能 工程搭建 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…