建筑兔零基礎自學python記錄22|實戰人臉識別項目——視頻人臉識別(下)11

這次我們繼續解讀代碼,我們主要來看下面兩個部分;

至于人臉識別成功的要點我們在最后總結~

具體代碼學習:

#定義人臉名稱
def name():#預學習照片存放位置path = 'M:/python/workspace/PythonProject/face/'imagePaths=[os.path.join(path,f) for f in os.listdir(path)]for imagePath in imagePaths:name = str(os.path.split(imagePath)[1].split('.',2)[1])names.append(name)

(1)os.path.join()協調文件路徑中'/'?? '\'差異

???? 將多個路徑組件智能地拼接成一個完整的路徑。由于不同操作系統的差異,os.path.join() 可以根據當前操作系統自動處理這些差異。

補充:不同操作系統使用不同的路徑分隔符。

?????????? Windows 使用反斜杠 \,Unix/Linux 和 macOS 使用正斜杠 /

#舉例:
import os# 拼接路徑
path = os.path.join('home', 'user', 'documents')
print(path)
  • 在 Windows 系統上,輸出可能是 home\user\documents
  • 在 Unix/Linux 或 macOS 系統上,輸出為 home/user/documents

(2)os.listdir()輸出某目錄下所有文件名

即os.listdir(path)獲得了['1.lss.jpg', '2.lss.jpg']

os.path.join()將路徑M:\python\workspace\PythonProject\face替換為

M:/python/workspace/PythonProject/face/1.lss.jpg

M:/python/workspace/PythonProject/face/2.lss.jpg

  • os.path.join(path, f)這里path 是前面指定的目錄路徑,fos.listdir(path) 返回列表中的每個元素(即文件或文件夾名稱)。
  • 代碼比較長,我們來看一下這個循環的內容:

????? 這行代碼遍歷 os.listdir(path) 返回的列表,對每個文件名 調用 os.path.join(path, f) 進行路徑拼接,最終將所有拼接好的完整路徑組成一個新的列表。

??? 我們可以把整段代碼的閱讀順序做如下表達:

讓我們繼續解讀:

  for imagePath in imagePaths:name = str(os.path.split(imagePath)[1].split('.',2)[1])names.append(name) 

for imagePath in imagePaths是在剛形成的imagePath列表里自己進行循環

(3)os.path.split()將一個文件路徑拆分為目錄部分和文件名部分。

  • 通過上一個代碼我們獲取了imagePath=M:/python/workspace/PythonProject/face/1.lss.jpg
  • os.path.split(imagePath)就是把M:/python/workspace/PythonProject/face/1.lss.jpg拆為:
  • 文件目錄M:/python/workspace/PythonProject/face/
  • 文件名1.lss.jpg

os.path.split(imagePath)[1]是從文件目錄和文件名中獲取第二個文件名,即1.lss.jpg

補充:這里的第二個元素是因為列表、元組和字符串的索引都是從 0 開始,即[0]代表首位,[1]代表第二個,以此類推。

(4)split() 將字符串按照指定的分隔符分割成多個子字符串,并返回一個包含這些子字符串的列表

str.split(sep=None, maxsplit=-1)
  • sep:可選參數,指定分隔符。如果不提供該參數,默認使用空白字符(空格、制表符、換行符等)作為分隔符。
  • maxsplit:可選參數,指定最大分割次數。如果不提供該參數,表示不限制分割次數。

  • split('.', 2)的含義就是分隔符為 . 最多分隔2次。

  • '1.lss.jpg' 調用 split( ) 后,會得到列表 ['1', 'lss', 'jpg']

  • split('.',2)[1]這里從文件名1.lss.jpg中取出第二個元素,即lss

整行代碼解讀為:

(5)append()在列表的末尾添加一個新元素

list.append(object)
  • list:表示要操作的列表對象。
  • object:表示要添加到列表末尾的任意 Python 對象,比如字符串、整數、列表、元組等。

names.append(name)這里就是把開頭創建的names列表填進了內容name

解讀主函數:

內容我們都學過,就直接標注了

#打開視頻test3.mp4讀取每一幀
cap=cv2.VideoCapture('test3.mp4')
#調用自定義name函數
name()
while True:#讀取視頻里的幀flag,frame=cap.read()#如果沒有幀則中斷if not flag:break#調用自定義face_detect_demo函數,進行人臉識別和標注face_detect_demo(frame)if ord(' ') == cv2.waitKey(10):break

?(5)全部代碼解讀為:

import cv2
#導入與操作系統交互 os 模塊
import os#創建一個 LBPH(局部二值模式直方圖)人臉識別器對象,用于訓練和識別人臉。
recogizer=cv2.face.LBPHFaceRecognizer_create()
#讀取訓練好的人臉識別模型yml文件
recogizer.read('M:/python/workspace/PythonProject/trainer/trainer.yml')
#初始化一個空列表names,用于存儲人臉對應的名稱。
names=[]
#初始化一個全局變量warningtime,用于記錄未知人臉出現的次數。
warningtime = 1#自定義人臉識別
def face_detect_demo(img):#彩圖轉化為灰圖gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#調用人臉識別分類器face_detector=cv2.CascadeClassifier('M:/python/pythoninstall/Lib/site-packages/cv2/data/haarcascade_frontalface_alt.xml')#灰圖中檢測人臉face=face_detector.detectMultiScale(gray)for x,y,w,h in face:#原彩圖中用紅色矩形框人臉cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)#人臉中心畫綠圓cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1)#識別輸入人臉,獲取標簽ids,置信度confidenceids, confidence = recogizer.predict(gray[y:y + h, x:x + w])#如果置信度confidence>80if confidence > 80:#warningtime作為全局變量global warningtime#每次出現都+1warningtime += 1#控制臺輸出warningtime=,值為warningtimeprint('warningtime=',warningtime)#圖像上繪制文本,文本是unknown,位置是x向右偏移10個像素。y向上偏移10個像素,字體無襯線,字體大小0.75,綠色cv2.putText(img, 'unknown', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)else:#圖像上繪制文本,文本是names列表中的,其余同上#坐標移動規律:+ 號撒腿右下跑,- 號轉身左上飄cv2.putText(img,str(names[ids - 1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)#彈出窗口名為resultcv2.imshow('result',img)#定義人臉名稱
def name():#預學習照片存放位置path = 'M:/python/workspace/PythonProject/face/'#獲取path路徑下文件名,將文件名+路徑拼接完整路徑,將完整路徑存到imagePaths中imagePaths=[os.path.join(path,f) for f in os.listdir(path)]for imagePath in imagePaths:#獲取文件名中的一部分作為name,即name=lssname = str(os.path.split(imagePath)[1].split('.',2)[1])#將提取出的人臉名稱 name 添加到 names 列表中names.append(name)#打開視頻test3.mp4讀取每一幀
cap=cv2.VideoCapture('test3.mp4')
#調用自定義name函數
name()
while True:#讀取視頻里的幀flag,frame=cap.read()#如果沒有幀則中斷if not flag:break#調用自定義face_detect_demo函數,進行人臉識別和標注face_detect_demo(frame)if ord(' ') == cv2.waitKey(10):breakcv2.destroyAllWindows()
cap.release()
print(names)

(6)人臉識別成功的要點

?? 本次識別我們用兩張人像即實現了人臉識別,這有賴于LBPH分類器的局部特征特性,少量圖片即可識別。同時在素材選擇中刻意選擇了差異較大的人物,且目標人像的角度基本一致而檢測任務則為其他角度。如果想提升識別準確性目前我所了解的一個是提升訓練樣本量,更改分類器或者用其他方式進行識別。在實驗中我嘗試了用130多張圖用LBPH分類器,但訓練效果不佳。所以目前的成果對于材料的選擇有較高的要求。

(7)補充[]和()的區別

  1. 方括號 [] 用于表示列表(list)。列表是一種可變的、有序的數據集合,列表支持元素的添加、刪除、修改等操作
  2. 方括號 [] 用于索引和切片操作
my_list = [1, 'apple', True]my_list = [1, 2, 3, 4, 5]
# 索引操作,獲取第一個元素
first_element = my_list[0]# 切片操作,獲取第 2 到第 4 個元素
sub_list = my_list[1:4]
print(sub_list)  # 輸出: [2, 3, 4]my_tuple = (1, 2, 3, 4, 5)
# 元組的索引操作
first_tuple_element = my_tuple[0]
print(first_tuple_element)  # 輸出: 1squares = [i**2 for i in range(1, 6)]
  1. 圓括號 () 用于表示元組(tuple)。元組是一種不可變的、有序的數據集合,一旦創建就不能修改其元素
  2. 圓括號 () 用于函數調用。調用函數時,需要使用圓括號將參數括起來。如果函數不需要參數,也需要使用空的圓括號。
my_tuple = (1, 'apple', True)def greet(name):def say_hi():

綜上大部分情況都使用圓括號()

(8)總結

  • os.path.join()協調文件路徑中/\差異
  • os.listdir()輸出某目錄下所有文件名
  • os.path.split()將一個文件路徑拆分為目錄部分和文件名部分
  • split() 將字符串按照指定的分隔符分割成多個子字符串,并返回一個包含這些子字符串的列表
  • append()在列表的末尾添加一個新元素

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

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

相關文章

二〇二四年終總結

寫在前面 簡單總結一下告訴自己,曾經活著 不必太糾結于當下,也不必太憂慮未來,當你經歷過一些事情的時候,眼前的風景已經和從前不一樣了。——村上春樹 原本應該 24 年年中的時候寫 23 年年終的總結,但是一直拖著&…

LabVIEW太陽能制冷監控系統

在全球能源需求日益增長的背景下,太陽能作為一種無限再生能源,被廣泛應用于各種能源系統中。本基于LabVIEW軟件和STM32F105控制器的太陽能制冷監控系統的設計與實現,提供一個高效、經濟的太陽能利用方案,以應對能源消耗的挑戰。 項…

Node.js中的npm包:從入門到實踐指南

目錄 一、npm的核心概念 二、npm核心命令與工作流 三、package.json深度解析 四、高級技巧與最佳實踐 五、常見問題解決方案 六、未來趨勢 在Node.js生態中,npm(Node Package Manager) 是開發者不可或缺的工具。它不僅是全球最大的開源軟…

AIGC圖生視頻保姆級教程

一、AI文生圖高階技巧 推薦工具 ? MidJourney(藝術感最強) ? DALLE 3(與ChatGPT深度聯動) ? Leonardo.ai(精細化參數控制) 核心策略 提示詞架構: [主體描述][環境氛圍][鏡頭語言][風格參數…

嵌入式EasyRTC實時通話支持海思hi3516cv610,編譯器arm-v01c02-linux-musleabi-gcc

EasyRTC已經完美支持海思hi3516cv610,編譯器arm-v01c02-linux-musleabi-gcc,總體SDK大小控制在680K以內(預計還能壓縮100K上下): EasyRTC在hi3516cv610芯片上能雙向通話、發送文字以及二進制指令,總體運行…

力扣做題記錄 (二叉樹)

二叉樹 打算先來了解二叉樹基礎,都是簡單題,目的是熟悉代碼格式和解題基礎思路。 1、二叉樹最大深度 二叉樹最大深度 方法一、深度搜索 直接用原函數做遞歸,比較簡單 /*** Definition for a binary tree node.* struct TreeNode {* …

如何下載Qt和運行第一個程序。

Ubuntu24.04 下載比較容易,基本都是無腦操作。途中匯出現有個別package下載不成功的情況,重新下載即可。 文章目錄 下載qt運行qt第一個項目 下載qt 1.先找到官網,點擊Download。 2.然后選擇,community User 3.然后會跳轉到這個…

HCIA項目實踐--靜態路由的拓展配置

7.7 靜態路由的拓展配置 網絡中的兩個重要思想: (1) 實的不行來虛的; (2) 范圍太大,劃分范圍。(分治) 7.7.1 負載均衡 (1)定義 負載均衡是一種網…

Base64 PDF解析器

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Base64 PDF解析器</title><style>body {font-family: Arial, sans-serif;max-width: 800px;margin: 20px auto;padding: 20px;}.contain…

基于51單片機的的雞籠補光和恒溫系統的設計與實現(源程序+Protues仿真+電路圖+元件清單+器件手冊)

編號&#xff1a;71 基于51單片機的的雞籠補光和恒溫系統的設計與實現 功能描述&#xff1a; 本設計由89C52單片機液晶12864顯示模塊聲光報警電路溫濕度傳感器電路風扇電路LED照明電路光照檢測電路GSM電路DS1302時鐘電路 1.實現的功能 (1)采用DHT11溫濕傳感器、光敏電阻捕捉…

Spring——Spring開發實戰經驗(1)

摘要 文章主要介紹了 Swagger 作為 API 文檔生成和測試工具的功能&#xff0c;包括自動生成 API 文檔、提供可視化調試界面、促進前后端協作、支持 OpenAPI 規范等。同時&#xff0c;還提及了 Spring Boot 與 Swagger3 的實戰應用&#xff0c;以及 Spring 開發中其他相關技術內…

SAP-ABAP:SAP的Screen Layout Designer屏幕布局設計器詳解及示例

在SAP中&#xff0c;Screen Layout Designer&#xff08;屏幕布局設計器&#xff09;是用于設計和維護屏幕&#xff08;Dynpro&#xff09;布局的工具。通過Screen Layout Designer&#xff0c;您可以創建和修改屏幕元素&#xff08;如輸入字段、按鈕、文本、表格控件等&#x…

安全筑基,智能賦能:BeeWorks IM引領企業協同新紀元

在數字經濟高速發展的今天&#xff0c;企業通訊系統已從單純的信息傳遞工具演變為支撐業務創新的核心平臺。傳統通訊工具在安全性、智能化、協同性等方面的不足&#xff0c;嚴重制約著企業的數字化轉型進程。BeeWorks IM系統以其創新的技術架構和智能化功能&#xff0c;正在重新…

SpringBoot實戰:高效獲取視頻資源

文章目錄 前言技術實現SpringBoot項目構建產品選取配置數據采集 號外號外 前言 在短視頻行業高速發展的背景下&#xff0c;海量內容數據日益增長&#xff0c;每天都有新的視頻、評論、點贊、分享等數據涌現。如何高效、精準地獲取并處理這些龐大的數據&#xff0c;已成為各大平…

【IoTDB 線上小課 11】為什么 DeepSeek 要選擇開源?

新年新氣象&#xff0c;【IoTDB 視頻小課】第十一期全新來臨&#xff01; 關于 IoTDB&#xff0c;關于物聯網&#xff0c;關于時序數據庫&#xff0c;關于開源... 一個問題重點&#xff0c;3-5 分鐘&#xff0c;我們講給你聽&#xff1a; 開源“加成”再次展現&#xff01; 現在…

宏任務和微任務

在前端開發中&#xff0c;**宏任務&#xff08;Macro Task&#xff09;**和**微任務&#xff08;Micro Task&#xff09;**是 JavaScript 事件循環&#xff08;Event Loop&#xff09;中的兩個重要概念。它們決定了異步代碼的執行順序。 --- ### 1. **事件循環&#xff08;Ev…

人工智能 - 機器學習、深度學習、強化學習是人工智能領域的理論基礎和方法論

機器學習、深度學習、強化學習是人工智能領域的三大核心方向,各自具有獨特的理論基礎和方法論。以下是它們的核心理論知識總結: 一、機器學習(Machine Learning, ML) 1. 基礎概念 目標:通過數據驅動的方式,讓機器從經驗中學習規律,完成預測、分類或決策任務。 核心范式…

java處理pgsql的text[]類型數據問題

背景 公司要求使用磐維數據庫&#xff0c;于是去了解了這個是基于PostgreSQL構建的&#xff0c;在使用時有場景一條圖片數據中可以投放到不同的頁面&#xff0c;由于簡化設計就放在數組中&#xff0c;于是使用了text[]類型存儲&#xff1b;表結構 #這是一個簡化版表結構&…

. Unable to find a @SpringBootConfiguration(默認軟件包中的 Spring Boot 應用程序)

解決&#xff1a; 新建一個包即可 問題&#xff1a; 默認軟件包中的 Spring Boot 應用程序。 原因&#xff1a; 默認包的定義 &#xff1a; 如果一個 Java 類沒有使用 package 聲明包名&#xff0c;則該類會被放置在默認包中。Spring Boot 遵循 Java 的包管理約定&#xff…

C語言——排序(冒泡,選擇,插入)

基本概念 排序是對數據進行處理的常見操作&#xff0c;即將數據按某字段規律排列。字段是數據節點的一個屬性&#xff0c;比如學生信息中的學號、分數等&#xff0c;可針對這些字段進行排序。同時&#xff0c;排序算法有穩定性之分&#xff0c;若兩個待排序字段一致的數據在排序…