提取視頻光流成幀并寫入視頻中

修改一下配置文件就可以運行了

配置文件
config.py
video_path = 'xxxx/dataset/data/huaping/BXDQ05-花屏-1.mp4'#要處理的視頻路徑
frame_path = 'xxxx/dataset/frame'#處理成幀之后保存的路徑
flow_path = 'xxxx/dataset/flow'#處理成光流之后保存的路徑
save_video_path = 'xxxx/fetch-flow/output/result.mp4'#最終將光流幀變成視頻的路徑
fps = 30
2.將視頻拆分為幀
fetchFrame.py
from __future__ import print_function
import sys
import numpy as np
import os
import imageio#用于讀取和寫入圖像和視頻的庫
import cv2
import config
Height = 512
Width = 512def get_frame(file_dir):with imageio.get_reader(file_dir,  'ffmpeg') as vid:# 使用imageio庫打開視頻文件,并創建一個讀取器對象。此對象被命名為vid。'ffmpeg'是用于讀取視頻的編解碼器。nframes = vid.get_meta_data()['nframes']#從視頻元數據中獲取幀數,并保存到nframes變量中。for i, frame in enumerate(vid):n_frames = iframe = cv2.resize(frame, (Width, Height), interpolation = cv2.INTER_CUBIC)imageio.imwrite(config.frame_path+'/'+str(i)+'.jpg', frame)#將調整大小后的幀保存為JPEG文件。文件的路徑和名稱是由前面的路徑、字符串"frame_"和當前幀索引組合而成的。np.save('nframes.npy', n_frames)#將視頻的總幀數保存到一個NumPy文件中。文件名是'nframes.npy',而文件中的數據是n_frames變量。
2.計算光流
fetchFlow.py
import os
import numpy as np
import cv2
from glob import glob_IMAGE_SIZE = 256# 用于計算視頻中每一幀之間的光流。它首先根據視頻路徑獲取所有以'.jpg'結尾的幀圖像文件路徑,并按順序排序。然后,它使用OpenCV庫讀取并轉換每一幀的圖像,計算當前幀與前一幀之間的光流,并將光流添加到一個列表中。最后,返回包含所有光流的列表。
import os
import cv2
from glob import globdef cal_for_frames(video_path):# 獲取視頻路徑下的所有jpg圖片路徑print(video_path)# 對圖片路徑進行排序frames = [f for f in os.listdir(video_path)]frames = sorted(frames, key=lambda x:int(x[:-4]))#字符串排序順序會是1,10,11這樣,所以要進行關鍵字排序    frames = [os.path.join(video_path, f) for f in frames]print(frames)flow = []prev = cv2.imread(frames[0])  # 讀取第一幀圖像prev = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY)  # 將第一幀圖像轉換為灰度圖像for i, frame_curr in enumerate(frames):print(frame_curr)curr = cv2.imread(frame_curr)  # 讀取當前幀圖像curr = cv2.cvtColor(curr, cv2.COLOR_BGR2GRAY)  # 將當前幀圖像轉換為灰度圖像tmp_flow = compute_TVL1(prev, curr)  # 計算當前幀和前一幀之間的光流flow.append(tmp_flow)  # 將光流添加到列表中prev = curr  # 更新前一幀圖像print(i)return flow  # 返回光流列表def compute_TVL1(prev, curr, bound=15):"""計算TV-L1光流。參數:prev: numpy.ndarray, 輸入圖像序列中的前一幀圖像。curr: numpy.ndarray, 輸入圖像序列中的當前幀圖像。bound: int, 光流值的邊界限制,默認為15。返回值:flow: numpy.ndarray, 計算得到的光流圖像。"""# 創建TV-L1光流估計算法對象TVL1 = cv2.DualTVL1OpticalFlow_create()# 使用TV-L1算法計算光流flow = TVL1.calc(prev, curr, None)assert flow.dtype == np.float32# 將光流值進行縮放和取整操作flow = (flow + bound) * (255.0 / (2*bound))flow = np.round(flow).astype(int)# 將光流值限制在0-255范圍內flow[flow >= 255] = 255flow[flow <= 0] = 0return flowdef save_flow(video_flows, flow_path):"""保存視頻的光流圖參數:video_flows:視頻的光流圖(三維數組)flow_path:保存光流圖的路徑(字符串)返回值:無"""for i, flow in enumerate(video_flows):# 保存u分量的光流圖cv2.imwrite(os.path.join(flow_path.format('u'), "{:06d}.jpg".format(i)),flow[:, :, 0])# 保存v分量的光流圖cv2.imwrite(os.path.join(flow_path.format('v'), "{:06d}.jpg".format(i)),flow[:, :, 1])#u代表水平分量,v代表垂直分量def extract_flow(video_path,flow_path):flow = cal_for_frames(video_path)print("finish1")save_flow(flow, flow_path)print('finish2')print('complete:' + flow_path)return
3.將幀寫入視頻
main.py
import imageio
import PIL.Image as Image
import numpy as np
from fetchFlow import extract_flow
from fetchFrame import get_frame
import configvideo_path = config.video_path
fps = config.fps
flow_path = config.flow_path
frame_path = config.frame_path
save_video_path = config.save_video_path#get_frame(video_path)
extract_flow(frame_path, flow_path)flow_list = [Image.open(os.path.join(flow_path,f)) for f in os.listdir(flow_path)]
print(flow_list)
with imageio.get_writer(save_video_path, fps = fps) as video:for image in flow_list:image = image.convert('RGB')image = np.array(image)video.append_data(image)

參考:提取光流

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208445.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自動補全的 select antd react

自動補全的 select antd react 文檔&#xff1a;自動補全的 select antd react.note 鏈接&#xff1a;http://note.youdao.com/noteshare?idf5e4a93d2b9d6be8e459edd4eb86323b&sub19796E9BC04D4ABD9ACE325FDFF59B0E 添加鏈接描述 import React, { useState, useRef } from…

【1day】泛微e-office OA系統xml.php 文件 SORT_ID 參數 SQL 注入漏洞學習

注:該文章來自作者日常學習筆記,請勿利用文章內的相關技術從事非法測試,如因此產生的一切不良后果與作者無關。 目錄 一、漏洞描述 二、影響版本 三、資產測繪 四、漏洞復現

理解傳統模式與互聯網時代 消費行為模型 AIDMA , AISAS , SICAS

1 AIDMA與AISAS 消費行為模型&#xff0c;以及所誕生的IT崗位 1.1 傳統市場營銷消費行為模型 AIDMA模型&#xff1a;Attention&#xff08;吸引&#xff09;&#xff0c;Interest &#xff08;興趣&#xff09;&#xff0c;Desire&#xff08;欲望&#xff09; &#xff0c;Me…

LeetCode 76. 最小覆蓋子串 滑動窗口框架

雙指針的特殊應用&#xff1a;滑動窗口 代碼 題目鏈接&#xff1a;https://leetcode.cn/problems/minimum-window-substring/description/ 不說廢話&#xff0c;直接貼代碼&#xff1a; static string minWindow(string s, string t) {// need記錄需要匹配的字符串t中每個字…

? Mac IDEA使用并運行項目

? IDEA導入項目并運行 Mac IDEA使用 (1) 倉庫導入 通過獲取giett倉庫包的url&#xff0c;在idea中導入項目 在gitee里獲取項目的ur打開idea&#xff0c;點擊 File->new->Project from Version Control (2) 創建數據庫ry并導入數據腳本 &#xff08;3&#xff09;修改配…

華為配置Smart Link主備備份示例

定義 Smart Link&#xff0c;又叫做備份鏈路。一個Smart Link由兩個接口組成&#xff0c;其中一個接口作為另一個的備份。Smart Link常用于雙上行組網&#xff0c;提供可靠高效的備份和快速的切換機制。 Monitor Link是一種接口聯動方案&#xff0c;它通過監控設備的上行接口…

npm私有源構建項目下載依賴報錯

Jenkins構建項目報錯&#xff0c;依賴找不到 Error: Couldnt find any versions for "babel/helper-module-imports" that matches "^7.22.15"at MessageError.ExtendableBuiltin (/data1/jenkins/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/…

log4j(日志的配置)

日志一般配置在resources的config下面的&#xff0c;并且Util當中的initLogRecord中的initLog&#xff08;&#xff09;方法就是加載這個log4j.properties的. 首先先看log4j.properties的配置文件 log4j.rootLoggerdebug, stdout, Rlog4j.appender.stdoutorg.apache.log4j.Co…

高性能和多級高可用,云原生數據庫 GaiaDB 架構設計解析

1 云原生數據庫和 GaiaDB 目前&#xff0c;云原生數據庫已經被各行各業大規模投入到實際生產中&#xff0c;最終的目標都是「單機 分布式一體化」。但在演進路線上&#xff0c;當前主要有兩個略有不同的路徑。 一種是各大公有云廠商選擇的優先保證上云兼容性的路線。它基于存…

考研真題數據結構

【2021年山西大學真題】將二叉樹中所有非終端結點的左右子樹交換位置&#xff0c;可以得到原二叉樹的 鏡像二叉樹&#xff0c;如圖。假設二叉樹的存儲形式為&#xff08;lchild&#xff0c;data&#xff0c;rchild&#xff09;&#xff0c;給出求鏡像二叉樹的算法: &#xff0…

Sql Server Management Studio連接Mysql

目標 已知mysql連接參數&#xff08;地址和用戶&#xff09;&#xff0c;期望通過Microsoft Sql Server Management Studio &#xff08;以下簡稱MSSSMS&#xff09;連接Mysql&#xff0c;在MSSSMS中直接查詢或修改Mysql中的數據。 下載MySql Connector/ODBC并安裝&#xff0c…

使用poi-tl填充word模板,并轉化為pdf輸出

后端 依賴 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.0</version> </dependency>Word版本 Word版本填充代碼 // 培訓詳情HashMap<String, Object> textMap new Ha…

maven環境搭建

maven歷史版本下載&#xff1a;https://archive.apache.org/dist/maven/ 新建系統變量編輯Path&#xff0c;添加bin目錄mvn -v測試查看版本號conf目錄下新建repository文件夾&#xff0c;作為本地倉庫 settings.xml <?xml version"1.0" encoding"UTF-8&…

2312d,d語言來綁定C++和rust

原文 各編譯語言相同概念 1,按可重用函數拆分代碼. 2,由源碼中的函數名生成的串來標識函數.如,g為void foo()生成_Z3foov的標識.此串總是是可重現的;如,Linux上的Clang和GCC都遵循ItaniumCABI約定來裝飾函數名. 3,在內存中的特定位置存儲該函數的所有參數,然后用調用或等效指…

gitee配置

注冊配置gitee Gitee官網 進入官網之后&#xff0c;有賬號直接登錄&#xff0c;沒有賬號注冊一個新的賬號 下載安裝git客戶端 官網地址 下載完成&#xff0c;一路直接點擊安裝直接安裝成功 檢查是否安裝成功 鼠標留在桌面–>右擊–>出現Git GUI Here/Git Bash Her…

windows系統nodeJs報錯node-sass npm ERR! command failed

報錯信息 npm WARN deprecated request2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 npm WARN deprecated tar2.2.2: This version of tar is no longer supported, and will not receive security updates. Please upgrade asa…

國科大通信原理復習

CH4-信源的數字化 26. 信源編碼的基本方法和分類 27. 無失真編碼和有失真編碼的區別 無失真編碼能夠完全一模一樣的恢復到原信號。 有失真編碼則不行。 28. 信息量和熵的定義 29. 離散信源的最大熵定理 n表示所有符號的種類&#xff0c;比如對于二進制碼字&#xff0c;Rbit對…

云計算ACP認證考試題庫0-100

0001.單選題:阿里云的云盾會檢查通過公共互聯網登錄云服務器ECS的來源IP,登錄方式包括SSH和遠程桌面,當來自某個IP的登錄請求出現多次密碼錯誤的情況時,會發出”ECS遭遇密碼暴力破解”的報警,當收到這個報警后,最安全的處理方法應該是。 A.通知自己業務平臺的所有用戶立即修改…

基于支持向量機SVM的新鮮度等級預測,基于自適應粒子群優化長短期神經網絡的新鮮度等級預測

目錄 背影 支持向量機SVM的詳細原理 SVM的定義 SVM理論 粒子群算法原理 SVM應用實例,基于支持向量機SVM的新鮮度等級預測,基于自適應粒子群優化長短期神經網絡的新鮮度等級預測 代碼 結果分析 展望 完整代碼:基于支持向量機SVM的新鮮度等級預測,基于自適應粒子群優化長短期…

SpringBoot+線程池實現高頻調用http接口并多線程解析json數據

場景 SpringbootFastJson實現解析第三方http接口json數據為實體類(時間格式化轉換、字段包含中文)&#xff1a; SpringbootFastJson實現解析第三方http接口json數據為實體類(時間格式化轉換、字段包含中文)-CSDN博客 Java中ExecutorService線程池的使用(Runnable和Callable多…