使用 Python 和 OpenCV 實(shí)現(xiàn)攝像頭人臉檢測(cè)并截圖功能
概述
在現(xiàn)代應(yīng)用中,人臉檢測(cè)是一項(xiàng)非常重要的技術(shù),廣泛應(yīng)用于安全監(jiān)控、身份驗(yàn)證等領(lǐng)域。本文將詳細(xì)介紹如何使用 Python 和 OpenCV 庫(kù)實(shí)現(xiàn)攝像頭人臉檢測(cè)并截圖,并通過具體的代碼示例來展示整個(gè)過程。
環(huán)境準(zhǔn)備
在開始編寫代碼之前,確保已經(jīng)安裝了 OpenCV 庫(kù)。可以使用以下命令安裝:
pip install opencv-python
代碼詳解
# -*- coding: utf-8 -*-
# import 進(jìn)openCV的庫(kù)
import cv2
import os
import time
# 調(diào)用攝像頭檢測(cè)人臉并截圖
def camera(window_name, path_name):
# Linux 不顯示圖形界面
cv2.namedWindow(window_name)
# 視頻來源,來自USB攝像頭
cap = cv2.VideoCapture(0)
# 告訴OpenCV使用人臉識(shí)別分類器
classfier = cv2.CascadeClassifier(os.getcwd()+"/haarcascade_frontalface_alt.xml")
# 識(shí)別出人臉后要畫的邊框的顏色,RGB格式, color是一個(gè)不可增刪的數(shù)組
color = (0, 255, 0)
num = 0
while cap.isOpened():
ok, frame = cap.read() # 讀取一幀數(shù)據(jù)
if not ok:
break
# 將當(dāng)前楨圖像轉(zhuǎn)換成灰度圖像
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 人臉檢測(cè),1.2和2分別為圖片縮放比例和需要檢測(cè)的有效點(diǎn)數(shù)
faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(faceRects) > 0: # 大于0則檢測(cè)到人臉
for faceRect in faceRects: # 單獨(dú)框出每一張人臉
x, y, w, h = faceRect
num = num + 1
# 將當(dāng)前幀保存為圖片
img_name = "%s/%d.jpg" % (path_name, num)
image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
cv2.imwrite(img_name, image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
# 延遲 60s,不要太頻繁的發(fā)送,知道來了就可以了
# time.sleep(60)
# 畫出矩形框
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
# 顯示當(dāng)前捕捉到了多少人臉圖片了
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame, 'num:%d/1000' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4)
# 顯示圖像 Linux 下注釋掉即可
cv2.imshow(window_name, frame)
c = cv2.waitKey(10)
if c & 0xFF == ord('q'):
break
# 釋放攝像頭并銷毀所有窗口
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
camera("watchdog", os.getcwd()+"/face")代碼解析
1. 導(dǎo)入必要的模塊
# -*- coding: utf-8 -*- # import 進(jìn)openCV的庫(kù) import cv2 import os import time
# -*- coding: utf-8 -*-:指定文件編碼為 UTF-8。import cv2:導(dǎo)入 OpenCV 庫(kù),用于圖像處理和人臉檢測(cè)。import os:導(dǎo)入 os 模塊,用于文件路徑操作。import time:導(dǎo)入 time 模塊,用于延遲操作。
2. 定義 camera 函數(shù)
def camera(window_name, path_name):
def camera(window_name, path_name)::定義一個(gè)名為camera的函數(shù),參數(shù)window_name是窗口名稱,path_name是保存截圖的路徑。
3. 創(chuàng)建窗口
# Linux 不顯示圖形界面
cv2.namedWindow(window_name)cv2.namedWindow(window_name):創(chuàng)建一個(gè)窗口,用于顯示視頻流。在 Linux 下可以注釋掉這行代碼以不顯示圖形界面。
4. 打開攝像頭
# 視頻來源,來自USB攝像頭
cap = cv2.VideoCapture(0)cv2.VideoCapture(0):打開默認(rèn)攝像頭。參數(shù) 0 表示默認(rèn)攝像頭。
5. 加載人臉識(shí)別分類器
# 告訴OpenCV使用人臉識(shí)別分類器
classfier = cv2.CascadeClassifier(os.getcwd()+"/haarcascade_frontalface_alt.xml")cv2.CascadeClassifier(...):加載預(yù)訓(xùn)練的 Haar 級(jí)聯(lián)分類器,用于檢測(cè)人臉。os.getcwd()+"/haarcascade_frontalface_alt.xml":指定分類器文件的路徑。
6. 設(shè)置邊框顏色
# 識(shí)別出人臉后要畫的邊框的顏色,RGB格式, color是一個(gè)不可增刪的數(shù)組
color = (0, 255, 0)color = (0, 255, 0):定義邊框顏色為綠色。
7. 主循環(huán)
num = 0
while cap.isOpened():
ok, frame = cap.read() # 讀取一幀數(shù)據(jù)
if not ok:
break
# 將當(dāng)前楨圖像轉(zhuǎn)換成灰度圖像
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 人臉檢測(cè),1.2和2分別為圖片縮放比例和需要檢測(cè)的有效點(diǎn)數(shù)
faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(faceRects) > 0: # 大于0則檢測(cè)到人臉
for faceRect in faceRects: # 單獨(dú)框出每一張人臉
x, y, w, h = faceRect
num = num + 1
# 將當(dāng)前幀保存為圖片
img_name = "%s/%d.jpg" % (path_name, num)
image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
cv2.imwrite(img_name, image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
# 延遲 60s,不要太頻繁的發(fā)送,知道來了就可以了
# time.sleep(60)
# 畫出矩形框
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
# 顯示當(dāng)前捕捉到了多少人臉圖片了
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame, 'num:%d/1000' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4)
# 顯示圖像 Linux 下注釋掉即可
cv2.imshow(window_name, frame)
c = cv2.waitKey(10)
if c & 0xFF == ord('q'):
breaknum = 0:初始化計(jì)數(shù)器。while cap.isOpened()::進(jìn)入無限循環(huán),實(shí)時(shí)讀取攝像頭圖像。ok, frame = cap.read():從攝像頭讀取一幀圖像。if not ok::檢查讀取是否成功,如果失敗則退出循環(huán)。grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY):將圖像轉(zhuǎn)換為灰度圖像。faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32)):檢測(cè)圖像中的人臉。if len(faceRects) > 0::檢查是否檢測(cè)到人臉。for faceRect in faceRects::遍歷檢測(cè)到的每個(gè)人臉。x, y, w, h = faceRect:獲取人臉的位置和大小。num = num + 1:增加計(jì)數(shù)器。img_name = "%s/%d.jpg" % (path_name, num):生成保存圖像的文件名。image = frame[y - 10: y + h + 10, x - 10: x + w + 10]:裁剪人臉區(qū)域并擴(kuò)大邊界。cv2.imwrite(img_name, image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9]):保存圖像。cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2):在圖像上繪制矩形框。font = cv2.FONT_HERSHEY_SIMPLEX:設(shè)置字體樣式。cv2.putText(frame, 'num:%d/1000' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4):在圖像上顯示當(dāng)前捕捉到的人臉數(shù)量。cv2.imshow(window_name, frame):顯示帶有矩形標(biāo)記的圖像。c = cv2.waitKey(10):等待 10 毫秒,等待用戶按鍵。if c & 0xFF == ord('q')::按 ‘q’ 鍵退出循環(huán)。
8. 釋放資源
# 釋放攝像頭并銷毀所有窗口
cap.release()
cv2.destroyAllWindows()cap.release():釋放攝像頭資源。cv2.destroyAllWindows():關(guān)閉所有 OpenCV 窗口。
9. 主程序入口
if __name__ == '__main__':
camera("watchdog", os.getcwd()+"/face")if __name__ == '__main__'::檢查是否直接運(yùn)行此腳本。camera("watchdog", os.getcwd()+"/face"):調(diào)用camera函數(shù),傳入窗口名稱和保存截圖的路徑。
完整代碼
# -*- coding: utf-8 -*-
# import 進(jìn)openCV的庫(kù)
import cv2
import os
import time
# 調(diào)用攝像頭檢測(cè)人臉并截圖
def camera(window_name, path_name):
# Linux 不顯示圖形界面
cv2.namedWindow(window_name)
# 視頻來源,來自USB攝像頭
cap = cv2.VideoCapture(0)
# 告訴OpenCV使用人臉識(shí)別分類器
classfier = cv2.CascadeClassifier(os.getcwd()+"/haarcascade_frontalface_alt.xml")
# 識(shí)別出人臉后要畫的邊框的顏色,RGB格式, color是一個(gè)不可增刪的數(shù)組
color = (0, 255, 0)
num = 0
while cap.isOpened():
ok, frame = cap.read() # 讀取一幀數(shù)據(jù)
if not ok:
break
# 將當(dāng)前楨圖像轉(zhuǎn)換成灰度圖像
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 人臉檢測(cè),1.2和2分別為圖片縮放比例和需要檢測(cè)的有效點(diǎn)數(shù)
faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(faceRects) > 0: # 大于0則檢測(cè)到人臉
for faceRect in faceRects: # 單獨(dú)框出每一張人臉
x, y, w, h = faceRect
num = num+1
# 將當(dāng)前幀保存為圖片
img_name = "%s/%d.jpg" % (path_name, num)
image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
cv2.imwrite(img_name, image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
# 延遲 60s,不要太頻繁的發(fā)送,知道來了就可以了
# time.sleep(60)
# 畫出矩形框
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
# 顯示當(dāng)前捕捉到了多少人臉圖片了
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame, 'num:%d/1000' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4)
# 顯示圖像 Linux 下注釋掉即可
cv2.imshow(window_name, frame)
c = cv2.waitKey(10)
if c & 0xFF == ord('q'):
break
# 釋放攝像頭并銷毀所有窗口
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
camera("watchdog", os.getcwd()+"/face")測(cè)試
- 確保你的攝像頭正常工作。
- 運(yùn)行腳本:
python3 face_detection.py
- 打開攝像頭后,你會(huì)看到一個(gè)窗口顯示實(shí)時(shí)視頻流,并且在檢測(cè)到的人臉周圍繪制綠色矩形。
- 按 ‘q’ 鍵退出程序。
總結(jié)
本文詳細(xì)介紹了如何使用 Python 和 OpenCV 庫(kù)實(shí)現(xiàn)攝像頭人臉檢測(cè)并截圖,并通過具體的代碼示例展示了整個(gè)過程。通過使用 cv2.VideoCapture 打開攝像頭,cv2.CascadeClassifier 加載預(yù)訓(xùn)練的 Haar 級(jí)聯(lián)分類器,cv2.cvtColor 轉(zhuǎn)換圖像顏色空間,cv2.rectangle 繪制矩形,cv2.imwrite 保存圖像,最終實(shí)現(xiàn)了在實(shí)時(shí)視頻流中檢測(cè)并保存人臉圖像的功能。
到此這篇關(guān)于使用 Python 和 OpenCV 實(shí)現(xiàn)攝像頭人臉檢測(cè)并截圖的文章就介紹到這了,更多相關(guān)Python OpenCV 人臉檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 人臉檢測(cè)實(shí)戰(zhàn)終極之OpenCV+Python實(shí)現(xiàn)人臉對(duì)齊
- python基于Opencv實(shí)現(xiàn)人臉口罩檢測(cè)
- Python OpenCV利用筆記本攝像頭實(shí)現(xiàn)人臉檢測(cè)
- python opencv人臉檢測(cè)提取及保存方法
- python版opencv攝像頭人臉實(shí)時(shí)檢測(cè)方法
- Python3.6.0+opencv3.3.0人臉檢測(cè)示例
- Python+OpenCV人臉檢測(cè)原理及示例詳解
- python利用OpenCV2實(shí)現(xiàn)人臉檢測(cè)
- python結(jié)合opencv實(shí)現(xiàn)人臉檢測(cè)與跟蹤
- python中使用OpenCV進(jìn)行人臉檢測(cè)的例子
相關(guān)文章
對(duì)Python3中列表乘以某一個(gè)數(shù)的示例詳解
今天小編就為大家分享一篇對(duì)Python3中列表乘以某一個(gè)數(shù)的示例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07
基于opencv實(shí)現(xiàn)手勢(shì)控制音量(案例詳解)
這篇文章主要介紹了基于opencv的手勢(shì)控制音量和ai換臉,通過定義了一個(gè)名為 handDetector 的類,用于檢測(cè)和跟蹤手部,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
用Django寫天氣預(yù)報(bào)查詢網(wǎng)站
今天小編就為大家分享一篇關(guān)于用Django寫天氣預(yù)報(bào)查詢網(wǎng)站的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10
Python列表切片操作實(shí)例探究(提取復(fù)制反轉(zhuǎn))
在Python中,列表切片是處理列表數(shù)據(jù)非常強(qiáng)大且靈活的方法,本文將全面探討Python中列表切片的多種用法,包括提取子列表、復(fù)制列表、反轉(zhuǎn)列表等操作,結(jié)合豐富的示例代碼進(jìn)行詳細(xì)講解2024-01-01

