【端午安康】龍舟爭渡Plug-In

文章目錄

  • 正文
  • 附錄A:關于Python的錄屏方法總結(來自DeepSeek的回答)
    • 1. 使用 `pyautogui` 和 `OpenCV` 錄制屏幕
    • 2. 使用 `mss` 庫(高效屏幕捕獲)
    • 3. 使用 `PIL.ImageGrab` 錄制屏幕
      • 4. 使用 Windows 原生快捷鍵錄制(非 Python 方案)
    • 5. 結合 GUI 實現錄屏工具(高級方案)
    • 總結
  • 附錄B:關于視頻格式轉換(以avi2mp4為例)
    • 方法1:使用 `moviepy` 庫(推薦)
    • 方法2:使用 `OpenCV` + `FFmpeg`
    • 方法3:直接使用 `FFmpeg` 命令行(最高效)
    • 方法4:使用 `PyAV`(高級控制)
      • 常見問題解決
      • 總結


正文

端午整個爛活。

龍舟爭渡2025

旗幟顏色的識別方法選了個最笨的,直接截取那塊,然后矩陣相減求F范數(二模),匹配差距最小的那個即可,因此需要提前把所有情況的截圖準備好,完整的圖片材料和演示視頻在https://github.com/caoyang-sufe/LongZhouZhengDu2025

目前速度不是特別快,但也基本夠用了。如果間隔取太小容易出錯,因為截屏速度跟不上。

# -*- coding: utf-8 -*-
# @author: caoyang
# @email: caoyang@stu.sufe.edu.cnimport cv2
import time
import numpy
import pyautoguifrom PIL import Image
from numpy.linalg import norm
from pynput.keyboard import Key, Controller as KeyController
from pynput.mouse import Button, Controller as MouseControllerimport numpy as npY1, Y2, X1, X2 = 200, 400, 830, 1090	# 這組參數適配1920×1080尺寸的屏幕jcolor_to_key = {'y': 'd', 'r': 'f', 'b': 'j', 'g': 'k'}def easy_show(image: numpy.ndarray, window_title: str="image") -> None:"""Show a image in a new window."""cv2.imshow(window_title,image)cv2.waitKey(0)cv2.destroyAllWindows()def get_screenshot():image = pyautogui.screenshot()image = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)return imagedef load_labels():labels = dict()for color in "yrbg":for n in "12":image = Image.open(f"./temp/{color}{n}.png")image = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)clipped_image = image[Y1: Y2, X1: X2, :]labels[f"{color}{n}"] = clipped_imagereturn labels# 判斷旗幟顏色及點擊次數
def classify_label(screenshot, labels):clipped_image = screenshot[Y1: Y2, X1: X2, :]diffs = {}for key, label in labels.items():diff = norm(label - clipped_image)diffs[key] = diffprint(diffs)predicted_label = min(diffs, key = lambda x: diffs[x])return predicted_labeldef run():keyboard_controller = KeyController()while True:screenshot = get_screenshot()labels = load_labels()predicted_label = classify_label(screenshot, labels)color = predicted_label[0]key_char = color_to_key[color]n = int(predicted_label[1])for _ in range(n):keyboard_controller.press(key_char)time.sleep(.05)keyboard_controller.release(key_char)time.sleep(.05)time.sleep(.1)time.sleep(2)
run()

爛活完了順便延申一點,感覺錄屏還是有點問題,cv2.waitKey()總是捕獲不到鍵位,之前就發現過這個問題,不知道怎么回事,問了一下deepseek,還是得用ffmpeg才行


附錄A:關于Python的錄屏方法總結(來自DeepSeek的回答)


1. 使用 pyautoguiOpenCV 錄制屏幕

這種方法通過不斷截取屏幕畫面并將其合成為視頻文件來實現錄屏。

import pyautogui
import cv2
import numpy as np# 設置錄屏參數
screen_size = pyautogui.size()  # 獲取屏幕分辨率
fps = 30.0
output_file = "screen_recording.avi"# 創建視頻編碼器
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter(output_file, fourcc, fps, screen_size)# 開始錄屏
while True:img = pyautogui.screenshot()  # 截取屏幕frame = np.array(img)frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)  # 轉換顏色格式out.write(frame)  # 寫入視頻文件# 按下 'q' 鍵停止錄制if cv2.waitKey(1) == ord('q'):break# 釋放資源
out.release()
cv2.destroyAllWindows()

優點:簡單易用,適合基礎錄屏需求。
缺點:性能較低,可能在高分辨率或高幀率下卡頓。


2. 使用 mss 庫(高效屏幕捕獲)

mss 是一個高效的跨平臺屏幕捕獲庫,適合高性能錄屏。

import mss
import cv2
import numpy as npdef record_screen(output_filename="output.avi", fps=20.0):with mss.mss() as sct:monitor = sct.monitors[1]  # 獲取主屏幕fourcc = cv2.VideoWriter_fourcc(*"XVID")out = cv2.VideoWriter(output_filename, fourcc, fps, (monitor["width"], monitor["height"]))while True:img = np.array(sct.grab(monitor))  # 捕獲屏幕frame = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)  # 轉換顏色格式out.write(frame)  # 寫入視頻文件# 按下 'q' 鍵停止錄制if cv2.waitKey(1) & 0xFF == ord("q"):breakout.release()cv2.destroyAllWindows()if __name__ == "__main__":record_screen()

優點:性能較好,支持多顯示器。
缺點:需要額外安裝 mss 庫。


3. 使用 PIL.ImageGrab 錄制屏幕

PIL.ImageGrab 是 Python 圖像處理庫的一部分,適合簡單的屏幕捕獲。

from PIL import ImageGrab
import cv2
import numpy as npfps = 20
output_file = "recording.avi"# 獲取屏幕尺寸
screen = ImageGrab.grab()
width, height = screen.size# 創建視頻編碼器
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter(output_file, fourcc, fps, (width, height))while True:img = ImageGrab.grab()  # 捕獲屏幕frame = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)  # 轉換顏色格式out.write(frame)  # 寫入視頻文件# 按下 'q' 鍵停止錄制if cv2.waitKey(1) == ord('q'):breakout.release()
cv2.destroyAllWindows()

優點:無需額外安裝復雜庫。
缺點:性能一般,不適合高幀率錄制。


4. 使用 Windows 原生快捷鍵錄制(非 Python 方案)

Win11 自帶錄屏功能:

  • 按下 Win + Shift + S 可調用截圖和錄屏工具。
  • 錄制完成后,可手動保存為 MP4 文件,再用 Python 轉換為 GIF(如使用 moviepy 庫)。
from moviepy.editor import VideoFileClipdef convert_mp4_to_gif(input_path, output_path, fps=10):clip = VideoFileClip(input_path)clip.write_gif(output_path, fps=fps)# 示例
convert_mp4_to_gif("input.mp4", "output.gif")

優點:無需編程,適合簡單需求。
缺點:依賴 Windows 自帶功能,靈活性較低。


5. 結合 GUI 實現錄屏工具(高級方案)

如果需要更友好的界面,可以結合 PyQt5OpenCV 開發一個錄屏工具,支持開始/停止錄制、選擇區域等功能。


總結

方法適用場景性能復雜度
pyautogui + OpenCV基礎錄屏較低簡單
mss + OpenCV高性能錄屏較高中等
PIL.ImageGrab簡單錄屏一般簡單
Windows 原生錄屏快速錄制無需代碼
GUI 工具開發自定義功能復雜

選擇哪種方法取決于你的具體需求(如是否需要高幀率、是否要錄制音頻等)。如果需要更高級的功能(如音頻錄制),可以結合 pyaudio 庫實現。


附錄B:關于視頻格式轉換(以avi2mp4為例)

在Python中,你可以使用多種方法將AVI格式的視頻轉換為MP4格式。以下是幾種常見且高效的方式:

方法1:使用 moviepy 庫(推薦)

moviepy 是一個強大的視頻處理庫,適合簡單的格式轉換。

from moviepy.editor import VideoFileClipdef avi_to_mp4(input_path, output_path):# 加載AVI視頻video = VideoFileClip(input_path)# 寫入MP4文件(默認使用H.264編碼)video.write_videofile(output_path, codec="libx264", audio_codec="aac")# 關閉視頻對象video.close()# 示例
avi_to_mp4("input.avi", "output.mp4")

優點

  • 簡單易用,支持音頻保留。
  • 自動處理編碼兼容性問題(默認使用H.264和AAC)。

安裝依賴

pip install moviepy

方法2:使用 OpenCV + FFmpeg

如果已安裝FFmpeg,可以通過OpenCV調用FFmpeg進行轉換。

import cv2def avi_to_mp4_opencv(input_path, output_path):# 讀取AVI視頻cap = cv2.VideoCapture(input_path)# 獲取視頻參數(幀率、分辨率等)fps = cap.get(cv2.CAP_PROP_FPS)width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 創建MP4視頻寫入器(需FFmpeg支持)fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 或 'avc1'out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))# 逐幀轉換while cap.isOpened():ret, frame = cap.read()if not ret:breakout.write(frame)# 釋放資源cap.release()out.release()# 示例
avi_to_mp4_opencv("input.avi", "output.mp4")

注意

  • 確保系統已安裝FFmpeg(Windows用戶需下載并添加環境變量)。
  • OpenCV的MP4編碼器(mp4v)可能在某些平臺兼容性較差,建議優先用moviepy

方法3:直接使用 FFmpeg 命令行(最高效)

如果追求轉換速度或處理大文件,直接調用FFmpeg命令行是最佳選擇。

import subprocessdef avi_to_mp4_ffmpeg(input_path, output_path):command = ['ffmpeg','-i', input_path,      # 輸入文件'-c:v', 'libx264',     # H.264視頻編碼'-c:a', 'aac',         # AAC音頻編碼'-strict', 'experimental','-y',                  # 覆蓋輸出文件output_path]subprocess.run(command)# 示例
avi_to_mp4_ffmpeg("input.avi", "output.mp4")

優點

  • 轉換速度最快,支持所有主流編碼。
  • 可自定義參數(如分辨率、比特率等)。

安裝FFmpeg

  • Windows:從 FFmpeg官網 下載并添加至系統環境變量。
  • macOS:brew install ffmpeg
  • Linux:sudo apt install ffmpeg

方法4:使用 PyAV(高級控制)

PyAV 是FFmpeg的Python綁定,適合需要精細控制編碼參數的場景。

import avdef avi_to_mp4_pyav(input_path, output_path):input_container = av.open(input_path)output_container = av.open(output_path, mode='w')# 配置輸出流(復制輸入流的參數)in_stream = input_container.streams.video[0]out_stream = output_container.add_stream('h264', rate=in_stream.average_rate)out_stream.width = in_stream.widthout_stream.height = in_stream.height# 逐幀轉碼for frame in input_container.decode(video=0):packet = out_stream.encode(frame)output_container.mux(packet)# 關閉容器output_container.close()input_container.close()# 示例
avi_to_mp4_pyav("input.avi", "output.mp4")

優點

  • 支持底層編碼參數調整。
  • 性能接近原生FFmpeg。

安裝依賴

pip install av

常見問題解決

  1. 轉換后無聲音

    • 確保使用支持音頻的編碼器(如moviepy或FFmpeg的-c:a aac)。
    • 檢查輸入文件是否包含音頻流(可用ffmpeg -i input.avi查看)。
  2. 轉換速度慢

    • 使用FFmpeg命令行并添加 -preset fast 參數。
    • 降低輸出分辨率(如 -vf scale=1280:720)。
  3. 文件體積過大

    • 調整比特率(如 -b:v 2000k)。
    • 使用CRF控制質量(如 -crf 23,數值越小質量越高)。

總結

方法適用場景是否需要FFmpeg保留音頻
moviepy快速簡單轉換
OpenCV + FFmpeg需要逐幀處理可選
FFmpeg命令行高性能/批量處理
PyAV高級編碼控制

推薦選擇

  • 普通用戶:直接用 moviepy
  • 開發者或需要批量處理:FFmpeg命令行。

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

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

相關文章

Apache SeaTunnel部署技術詳解:模式選擇、技巧與最佳實踐

Apache SeaTunnel(原Waterdrop)作為高性能、分布式數據集成平臺,支持海量數據的離線與實時同步。其靈活多樣的部署模式可適配不同規模的生產環境需求。本文將系統解析SeaTunnel的部署架構、技術要點及最佳實踐,幫助用戶高效構建穩定可靠的數據管道。 一、部署模式全景概覽 …

【機械視覺】Halcon—【六、交集并集差集和仿射變換】

【機械視覺】Halcon—【六、交集并集差集和仿射變換】 目錄 【機械視覺】Halcon—【六、交集并集差集和仿射變換】 介紹 交集并集差集介紹: 1. 交集(Intersection) 2. 并集(Union) 3. 差集(Difference&#xff…

實驗設計與分析(第6版,Montgomery)第5章析因設計引導5.7節思考題5.6 R語言解題

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅玨生譯) 第5章析因設計引導5.7節思考題5.6 R語言解題。主要涉及方差分析&#xff0c;正態假設檢驗&#xff0c;殘差分析&#xff0c;交互作用圖&#xff0c;等值線圖。 dataframe <-data.frame…

劍指offer15_數值的整數次方

數值的整數次方 實現函數 double Power(double base, int exponent) 題目要求 計算 base exponent \text{base}^{\text{exponent}} baseexponent&#xff1a; 不得使用庫函數不需要考慮大數問題&#xff0c;絕對誤差不超過 10 ? 2 10^{-2} 10?2不會出現底數和指數同為 0…

【Typst】1.Typst概述

概述 Typst是一種用于排版文檔的標記語言&#xff0c;可以用于排版各種精美的論文、文章、書籍、報告和作業等。它是LaTex的精神續作&#xff0c;但是運行環境和編譯速度都要更簡單、更快捷。 它設計了一種腳本結合簡單的標記語法實現復雜的排版效果。并且支持模板創建、文件…

[Java惡補day14] 56. 合并區間

以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。 示例 1&#xff1a; 輸入&#xff1a;intervals [[1,3…

DiskGenius專業版v6.0.1.1645:分區管理、數據恢復、備份還原,一應俱全!

各位小伙伴&#xff0c;大家好&#xff01;今天阿燦給大家帶來一款超好用的分區工具&#xff0c;DiskGenius專業版。這款工具堪稱電腦管理界的“瑞士軍刀”&#xff0c;功能強大&#xff0c;現在出了新版本v6.0.1.1645&#xff0c;簡繁中文單文件便攜版&#xff0c;使用超方便。…

azure web app創建分步指南系列之二

為注冊表授權托管標識 你創建的托管標識尚未獲得從容器注冊表中提取數據的授權。在此步驟中,你將啟用授權。 返回容器注冊表的管理頁面: 在左側導航菜單中,選擇“訪問控制 (IAM)”。選擇“添加角色分配”。此屏幕截圖顯示了如何為容器注冊表啟用添加角色分配。在角色列表中…

STM32 AD單通道與多通道實戰指南

文章目錄 AD單通道&#xff08;實驗&#xff09;有關配置的庫函數AD單通道部分主要代碼 AD多通道實現多通道采集實現思路探討單次轉換非掃描模式實現AD多通道AD多通道部分代碼 學習建議&#xff1a;推薦搭配 江協科技 AD單通道 AD多通道一起食用&#xff01;&#xff01;&#…

溝通頻率不合適,如何找到平衡點

在團隊協作中&#xff0c;溝通頻率過高、信息干擾、節奏錯位常常導致效率下降與成員倦怠。PMI研究指出&#xff0c;溝通不當是75%項目延誤的根源&#xff0c;其中溝通頻率失衡是關鍵變量之一。要解決這一問題&#xff0c;關鍵在于設定節奏、分層溝通、制定協議。其中&#xff0…

EC2 實例詳解:AWS 的云服務器怎么玩???

彈性計算、靈活計費、全球可用&#xff0c;AWS EC2 全攻略 在 AWS 生態中&#xff0c;有兩個核心服務是非常關鍵的&#xff0c;一個是 S3&#xff08;對象存儲&#xff09;&#xff0c;另一個就是我們今天的主角 —— Amazon EC2&#xff08;Elastic Compute Cloud&#xff09…

lvs-keepalived高可用群集

目錄 1.Keepalived 概述及安裝 1.1 Keepalived 的熱備方式 1.2 keepalived的安裝與服務控制 &#xff08;1&#xff09;安裝keep alived (2)控制 Keepalived 服務DNF 安裝 keepalived 后,執行以下命令將keepalived 服務設置為開機啟動。 2.使用 Keepalived 實現雙機熱備 …

車載診斷架構SOVD --- 車輛發現與建連

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 鈍感力的“鈍”,不是木訥、遲鈍,而是直面困境的韌勁和耐力,是面對外界噪音的通透淡然。 生活中有兩種人,一種人格外在意別人的眼光;另一種人無論…

BUUCTF之[ACTF2020 新生賽]BackupFile

打開環境就一句話 找出源文件! 結合題目名字&#xff1a;BackupFile 先用dirsearct掃描網站文件 發現一個index.php.bak ,拼接url下載 打開發現php代碼 <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key];if(!is_numeric($key)) {exit…

Rag技術----項目博客(六)

RAG 定義&#xff1a;檢索增強生成&#xff08;Retrieval Augmented Generation&#xff09;&#xff0c;簡稱 RAG&#xff0c;已經成為當前最火熱的LLM應用方案。 目的&#xff1a;通過提供相關領域數據庫通過問題檢索信息&#xff0c;將相關信息合并到Prompt中&#xff0c;…

設計模式——外觀設計模式(結構型)

摘要 本文介紹了外觀設計模式&#xff0c;它是一種結構型設計模式&#xff0c;通過引入一個外觀類來封裝復雜子系統的調用細節&#xff0c;對外提供簡單統一的接口。文中通過生活類比、關鍵角色介紹、使用場景分析以及結構說明等方面對這一模式進行了全面闡述&#xff0c;還涉…

LabVIEW磁懸浮軸承傳感器故障識別

針對工業高端裝備中主動磁懸浮軸承&#xff08;AMB&#xff09;的位移傳感器故障檢測需求&#xff0c;基于 LabVIEW 平臺構建了一套高精度故障識別系統。通過集成品牌硬件與 LabVIEW 的信號處理能力&#xff0c;實現了傳感器探頭故障的實時監測與精準定位&#xff0c;解決了傳統…

集成學習三種框架

集成學習通過組合多個弱學習器構建強學習器&#xff0c;常見框架包括Bagging&#xff08;裝袋&#xff09;、Boosting&#xff08;提升&#xff09; 和Stacking&#xff08;堆疊&#xff09; 一、Bagging&#xff08;自助裝袋法&#xff09; 核心思想 從原始數據中通過有放回…

PCI DSS培訓記錄

22日上午: 整體PCI DSS 結構分享VISA分享全球欺詐風險動態 信用卡被偷枚舉攻擊依然是最為主要的安全威脅之一(枚舉驗證碼),增加3DS驗證防護勒索軟件和信息泄漏攻擊欺詐分子對AI技術的興趣日益增加,如換臉軟件過驗證基于NFC技術利用非接交易進行欺詐成為新的攻擊手段,如NF…

數據安全中心是什么?如何做好數據安全管理?

目錄 一、數據安全中心是什么 &#xff08;一&#xff09;數據安全中心的定義 &#xff08;二&#xff09;數據安全中心的功能 1. 數據分類分級 2. 訪問控制 3. 數據加密 4. 安全審計 5. 威脅檢測與響應 二、數據安全管理的重要性 三、如何借助數據安全中心做好數據安…