3dmax的python通過普通的攝像頭動捕表情

1、安裝python
進入cdm,打python要能顯示版本號
>>>(進入python提示符模式)
import sys
sys.path顯示python的安裝路徑,
進入到python.exe的路徑
在python目錄中安裝(ctrl+z退出python交互模式)
2、pip install mediapipe? ? mediapipe 官網?

用阿里云鏡像?? ? mediapipe的github托管

pip install mediapipe -i https://mirrors.aliyun.com/pypi/simple/

3、pip install opencv -python

pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple/

opencv官方網站?(有關攝像頭動捕關鍵點說明)

進入到python.exe的路徑,新建 FaceCapture.py

import cv2
import mediapipe as mp
import socket
import json
import time# 初始化 mediapipe
mp_face_mesh = mp.solutions.face_mesh
face_mesh = mp_face_mesh.FaceMesh(static_image_mode=False,max_num_faces=1,refine_landmarks=True,min_detection_confidence=0.8,  # 增加檢測置信度min_tracking_confidence=0.8  # 增加檢測置信度
)# 切換攝像頭請切換設備索引
device_index = 0
cap = cv2.VideoCapture(device_index, cv2.CAP_DSHOW)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
target_addr = ('127.0.0.1', 5005)total_duration = 15  # 總運行時間,單位:秒
start_time = time.time()
frame_count = 0
prev_time = 0# 定義需要的關鍵點索引
# 眉毛
left_eyebrow = [70, 74, 78, 336]
right_eyebrow = [300, 304, 308, 105]
# 眼睛
left_eye = [36, 70, 105, 133]
right_eye = [267, 301, 336, 362]
# 嘴巴
mouth = [61, 146, 178, 291]
# 鼻翼
left_nostril = [129]
right_nostril = [358]
# 下巴
chin = [152]
# 眼角
left_inner_corner = [133]
left_outer_corner = [33]
right_inner_corner = [362]
right_outer_corner = [263]
# 嘴角
left_mouth_corner = [61]
right_mouth_corner = [291]# 合并所有需要的關鍵點索引
selected_indices = left_eyebrow + right_eyebrow + left_eye + right_eye + mouth + left_nostril + right_nostril + chin + left_inner_corner + left_outer_corner + right_inner_corner + right_outer_corner + left_mouth_corner + right_mouth_cornerif not cap.isOpened():print("無法打開攝像頭")
else:try:while True:elapsed = time.time() - start_time  # 提前計算運行時間remaining = total_duration - elapsedtry:ret, frame = cap.read()frame_count += 1print(f"正在讀取第 {frame_count} 幀,狀態: {ret},程序將在 {remaining:.2f} 秒后自動關閉")if remaining <= 0:print("運行時間已到,自動退出")breakexcept Exception as e:print("讀取視頻幀異常:", e)continueif not ret:print("無法獲取攝像頭數據,幀號:", frame_count)breakcurrent_time = time.time()fps = 1 / (current_time - prev_time)prev_time = current_timergb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)result = face_mesh.process(rgb_frame)data_to_send = {}if result.multi_face_landmarks:landmarks = result.multi_face_landmarks[0].landmarkkeypoints = [{"id": i, "x": landmarks[i].x, "y": landmarks[i].y, "z": landmarks[i].z} for i in selected_indices]data_to_send['keypoints'] = keypoints# 繪制跟蹤點height, width, _ = frame.shapefor keypoint in keypoints:x = int(keypoint["x"] * width)y = int(keypoint["y"] * height)cv2.circle(frame, (x, y), 2, (0, 255, 0), -1)else:data_to_send['keypoints'] = []data_to_send['fps'] = int(fps)json_data = json.dumps(data_to_send)# 實時驅動sock.sendto(json_data.encode('utf-8'), target_addr)# 離線驅動# with open(f"frames/frame_{frame_count:04d}.json", "w") as f:#    json.dump(data_to_send, f)# 文字提示,添加 fps 信息countdown_text = f"remainTime: {remaining:.1f} second, FPS: {int(fps)}"cv2.putText(frame, countdown_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1,(0, 255, 0), 2, cv2.LINE_AA)# 進度條提示bar_x, bar_y = 10, 60bar_width = 300bar_height = 20progress = remaining / total_durationcv2.rectangle(frame, (bar_x, bar_y), (bar_x + bar_width, bar_y + bar_height), (180, 180, 180), 2)cv2.rectangle(frame, (bar_x, bar_y), (bar_x + int(bar_width * progress), bar_y + bar_height), (0, 255, 0), -1)cv2.imshow('Face Capture', frame)if cv2.waitKey(1) & 0xFF == ord('q'):print("用戶手動退出")break# 自動退出機制(30 秒)if time.time() - start_time > total_duration:message = "已運行 {} 秒,自動退出".format(total_duration)print(message)breakfinally:# 發送關閉信息close_message = {'type': 'close'}json_close_message = json.dumps(close_message)sock.sendto(json_close_message.encode('utf-8'), target_addr)cap.release()sock.close()cv2.destroyAllWindows()

python安裝目錄,進去后cmd命令提示符,然后 python?? FaceCapture.py

?遇到 ImportError: DLL load failed while importing _framework_bindings: 動態鏈接庫(DLL)初始化例程失敗。

最新受支持的 Visual C++ 可再發行程序包下載 | Microsoft Learn

進入到python.exe的路徑,新建 StartCam.bat 文件

@echo off
python FaceCapture.py
pause

進入到python.exe的路徑,新建 啟動攝像頭.vbs 文件,這樣就可以隱藏掉cmd命令行的界面只顯示攝像頭界面

Set objShell = CreateObject("WScript.Shell")
Dim strPath, strBatFile
strPath = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)
strBatFile = strPath & "\StartCam.bat"
objShell.Run strBatFile, 0, False

新建一個max的ms文件GetUDP.ms ,這個可以創建十個dmmy物體,用來接受攝像頭的表情捕捉數據,

--引入必要的 .NET類
dotNet.loadAssembly "System.Threading"
dotNet.loadAssembly "System.Net"
dotNet.loadAssembly "System.Net.Sockets"
dotNet.loadAssembly "System.Text"
dotNet.loadAssembly "Newtonsoft.Json"
-- dotNet.loadAssembly @"C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Threading.dll"--清理之前的資源
try (if isProperty udpClient "Close" do (udpClient.Close())) catch ()
try (if isProperty thread "Abort" do (thread.Abort())) catch ()--初始化UDP接收器
global localEndpoint = dotNetObject "System.Net.IPEndPoint" (dotNetClass "System.Net.IPAddress").Any  5005
global udpClient = dotNetObject "System.Net.Sockets.UdpClient"
udpClient.ExclusiveAddressUse = false 
udpClient.Client.SetSocketOption (dotNetClass "System.Net.Sockets.SocketOptionLevel").Socket (dotNetClass "System.Net.Sockets.SocketOptionName").ReuseAddress true
udpClient.Client.Bind localEndpoint
--定義定時器	
global delayTimer = dotnetobject "Windows.Forms.Timer"	
-- 定義后臺線程
global BgThread = dotNetObject "System.ComponentModel.BackgroundWorker"
BgThread.WorkerSupportsCancellation = true--重置場景
resetMaxFile #noPrompt-- 創建 10 個 Dummy 物體并命名為 Dummy001, Dummy002, ..., Dummy010
global dummyArray = for i = 1 to 10 collect (local mydummy = dummy()  -- 創建 Dummy 物體mydummy.name = "Dummy" + formattedPrint i format:"03d"  -- 命名為 Dummy001, Dummy002, ...mydummy.position = [i * 50, 0, 0]  -- 設置一個簡單的初始位置,您可以根據需要調整mydummy  -- 返回創建的 Dummy 物體
)-- 接收 UDP 數據并解析為 JSON 結構體的函數
fn receiveAndParseJson =
(local remoteEndpoint = dotNetObject "System.Net.IPEndPoint" (dotNetClass "System.Net.IPAddress").Any 0local receiveBytes = udpClient.Receive remoteEndpointlocal jsonString = (dotNetClass "System.Text.Encoding").UTF8.GetString receiveBytestry (-- 引用 System.Web.Extensions(包含 JSON 解析器)dotNet.loadAssembly "System.Web.Extensions"-- 創建內建 JSON 解析器jsonParser = dotNetObject "System.Web.Script.Serialization.JavaScriptSerializer"-- 反序列化 JSON 字符串為 MaxScript 可用的結構體(Hashtable/Array等)jsonStruct = jsonParser.DeserializeObject jsonStringreturn jsonStruct)catch (print("解析 JSON 時出錯:" + getCurrentException())return undefined)
)-- 處理關鍵點數據并更新 Dummy 位置的函數
fn processKeypointsData keypoints =
(if keypoints != undefined do(for id = 0 to 9 do (for pt in keypoints do (if pt.Item["id"] == id then (local x = pt.Item["x"] * 100local y = pt.Item["y"] * 100local z = pt.Item["z"] * 100--dotNetClass "System.Windows.Forms.Control".Invoke (dotNetDelegate updateDummyPosition id x y z)local mydummy = dummyArray[id+1]if isValidNode mydummy do (mydummy.position = [pt.Item["x"]*100, pt.Item["y"]*100, pt.Item["z"]*100] )))print("Dummies 位置更新完成!")))
)-- 定時器觸發時執行的函數
fn timerCallback sender e =
(if not BgThread.CancellationPending do(local jsonStruct = receiveAndParseJson()format "json結構體為:% \n" jsonStructif jsonStruct != undefined do(-- 獲取幀率local fps = jsonStruct.Item["fps"]if fps != undefined do(-- 根據幀率計算定時器間隔(毫秒)local interval = 1000 / fpsdelayTimer.Interval = interval)-- 處理關鍵點數據local keypoints = jsonStruct.Item["keypoints"]processKeypointsData keypoints-- 檢查是否接收到關閉信息,則關閉后臺線程if jsonStruct.Item["type"] == "close" do(BgThread.CancelAsync()return true))sleep 0.1)
)--主執行命令
if (timerCallback sender e )then(delayTimer.enabled = true-- 添加定時器事件處理程序dotnet.AddEventHandler delayTimer "Tick" (timerCallback sender e)-- 添加后臺線程事件處理程序dotnet.AddEventHandler BgThread "DoWork" (fn sender e = timerCallback sender e)-- 監聽鍵盤事件,設置取消標志if keyboard.escPressed do (BgThread.CancelAsync()print "已發送取消請求")
)
else(	delayTimer.enabled = falseudpClient.Close()BgThread.CancelAsync()
)

啟動啟動攝像頭.vbs,出現攝像頭窗口,和倒計時進度條,30秒后自動關閉,你可以設定的不關閉。

啟動GetUDP.ms,接收動捕數據,傳遞到做表情的dmmy物體上面
?

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

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

相關文章

國產Linux統信安裝mysql8教程步驟

系統環境 uname -a Linux FlencherHU-PC 6.12.9-amd64-desktop-rolling #23.01.01.18 SMP PREEMPT_DYNAMIC Fri Jan 10 18:29:31 CST 2025 x86_64 GNU/Linux下載離線安裝包 瀏覽器下載https://downloads.mysql.com/archives/get/p/23/file/mysql-test-8.0.33-linux-glibc2.28…

Vite 權限繞過導致任意文件讀取(CVE-2025-32395)(附腳本)

免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 前言…

poi-tl

官網地址 Poi-tl Documentationword模板引擎https://deepoove.com/poi-tl github 地址 https://github.com/Sayi/poi-tl/tree/master gitcode 加速地址 GitCode - 全球開發者的開源社區,開源代碼托管平臺GitCode是面向全球開發者的開源社區,包括原創博客,開源代碼托管,代碼…

操作系統 4.1-I/O與顯示器

外設工作起來 操作系統讓外設工作的基本原理和過程&#xff0c;具體來說&#xff0c;它概括了以下幾個關鍵步驟&#xff1a; 發出指令&#xff1a;操作系統通過向控制器中的寄存器發送指令來啟動外設的工作。這些指令通常是通過I/O指令&#xff08;如out指令&#xff09;來實現…

琥珀掃描 2.0.5.0 | 文檔處理全能助手,支持掃描、文字提取及表格識別

琥珀掃描是一款功能強大的文檔處理應用程序。它不僅僅支持基本的文檔掃描功能&#xff0c;還涵蓋了文字提取、證件掃描、表格識別等多種實用功能。無論是學生、職員還是教師&#xff0c;都能從中找到適合自己的功能。該應用支持拍照生成電子件&#xff0c;并能自動矯正文檔邊緣…

jQuery UI 小部件方法調用詳解

jQuery UI 小部件方法調用詳解 引言 jQuery UI 是一個基于 jQuery 的用戶界面和交互庫,它提供了一系列小部件,如按鈕、對話框、進度條等,這些小部件極大地豐富了網頁的交互性和用戶體驗。本文將詳細介紹 jQuery UI 中小部件的方法調用,幫助開發者更好地理解和應用這些小部…

浮點數比較在Eigen數學庫中的處理方法

浮點數比較在Eigen數學庫中的處理方法 在Eigen數學庫中進行浮點數比較時&#xff0c;由于浮點數的精度問題&#xff0c;直接使用運算符通常不是推薦的做法。Eigen提供了幾種更安全的方法來進行浮點數比較&#xff1a; 1. 近似相等比較 使用isApprox()函數進行近似比較&#…

Linux-----驅動

一、內核驅動與啟動流程 1. Linux內核驅動 Nor Flash: 可線性訪問&#xff0c;有專門的數據及地址總線&#xff08;與內存訪問方式相同&#xff09;。 Nand Flash: 不可線性訪問&#xff0c;訪問需要控制邏輯&#xff08;軟件&#xff09;。 2. Linux啟動流程 ARM架構: IRAM…

Wincc腳本全部不運行

Wincc腳本全部不運行 前言解決辦法操作步驟 前言 這里主要是指舊項目移植到Wincc的高版本&#xff0c;移植后界面的一些功能均會失效。&#xff08;例如腳本不執行&#xff0c;項目編輯器不可用等情況&#xff09; 解決辦法 Wincc的項目文件中有Dcf文件&#xff0c;Dcf文件包…

使用numpy構建邏輯回歸模型及訓練流程

邏輯回歸模型構建及訓練流程 關于邏輯回歸的數據&#xff0c;有很多學習?的?例樣本。這?我們使?scikit learn提供的數據集?成函數來創建 具體參數可參照官網 Scikit-learn 是? Python 開發的開源機器學習庫&#xff0c;?泛?于數據挖掘和數據分析。 特點&#xff1a;易…

python的多線程和多進程程序編程

CPU密集型使用多進程&#xff0c;IO密集型使用多線程 查看進程ID和線程ID的命令分別是os.getpid()和threading.current_thread() 多進程使用multiprocessing就可以了&#xff0c;通常使用進程池來完成操作&#xff0c;阻塞主進程使用join方法 多線程使用threading模塊&#…

代碼隨想錄算法訓練營第十五天

LeetCode題目: 654. 最大二叉樹617. 合并二叉樹700. 二叉搜索樹中的搜索98. 驗證二叉搜索樹2843. 統計對稱整數的數目 其他: 今日總結 往期打卡 654. 最大二叉樹 跳轉: 654. 最大二叉樹 學習: 代碼隨想錄公開講解 問題: 給定一個不重復的整數數組 nums 。 最大二叉樹 可以用…

[GN] Uart協議解碼器源碼各個方法

系列文章目錄 sigrokdecode 模塊學習指南 — 準備階段 通訊協議 - Uart sigrokdecode 模塊 UART協議解碼器源碼解析 Uart協議解碼器源碼各個方法 文章目錄 系列文章目錄引入庫parity_ok注解類型枚舉options參數annotations 注解annotation_rows 注解分組接收&#xff08;RX&a…

技術分享|iTOP-RK3588開發板Ubuntu20系統旋轉屏幕方案

iTOP-3588開發板采用瑞芯微RK3588處理器&#xff0c;是全新一代AloT高端應用芯片&#xff0c;采用8nmLP制程&#xff0c;搭載八核64位CPU&#xff0c;四核Cortex-A76和四核Cortex-A55架構&#xff0c;主頻高達2.4GHz。是一款可用于互聯網設備和其它數字多媒體的高性能產品。 在…

Unity IL2CPP內存泄漏追蹤方案(基于Memory Profiler)技術詳解

一、IL2CPP內存管理特性與泄漏根源 1. IL2CPP內存架構特點 內存區域管理方式常見泄漏類型托管堆(Managed)GC自動回收靜態引用/事件訂閱未取消原生堆(Native)手動管理非托管資源未釋放橋接層GCHandle/PInvoke跨語言引用未正確釋放 對惹&#xff0c;這里有一個游戲開發交流小組…

消融實驗_草稿

五列數據 \begin{table}[htbp]\caption{Performance Comparison of Standalone KD Variants vs MIRKD-enhanced Variants on ACNE04 Dataset\label{AblationKD}}\centering\renewcommand{\arraystretch}{1.2}\scriptsize\begin{tabularx}{\linewidth}{{}l *{3}{>{\centering…

面向對象高級(1)

文章目錄 final認識final關鍵字修飾類&#xff1a;修飾方法&#xff1a;修飾變量final修飾變量的注意事項 常量 單例類什么是設計模式&#xff1f;單例怎么寫?餓漢式單例的特點是什么&#xff1f;單例有啥應用場景&#xff0c;有啥好處&#xff1f;懶漢式單例類。 枚舉類認識枚…

不用額外下載jar包,idea快速查看使用的組件源碼

以nacos為例子&#xff0c;在idea中引入了nacos依賴&#xff0c;就可以查看源碼了。 2. idea選擇open&#xff08;不關閉項目直接選擇file-open也可以&#xff09;, 在maven的倉庫里找到對應的包&#xff0c;打開 2.idea中選擇 jar包&#xff0c;選擇 add as library 3.這樣j…

小白學習java第12天:IO流之緩沖流

1.IO緩沖流&#xff1a; 之前我們學習的都是原始流&#xff08;FileInputStream字節輸入流、FileOutputStream字節輸出流、FIleReader字符輸入流、FIleWriter字符輸出流&#xff09;其實我們可以知道對于這些其實性能都不是很好&#xff0c;要么太慢一個一個&#xff0c;要么就…

高速電路設計概述

1.1 低速設計和高速設計的例子 本節通過一個簡單的例子&#xff0c;探討高速電路設計相對于低速電路設計需要考慮哪些不同的問題。希望讀者通過本例&#xff0c;對高速電路設計建立一個表象的認識。至于高速電路設計中各方面的設計要點&#xff0c;將在后續章節展開詳細的討論…