營銷型網(wǎng)站建設極速建站佛山疫情最新消息
概述
在現(xiàn)代應用中,人臉檢測是一項非常重要的技術,廣泛應用于安全監(jiān)控、身份驗證等領域。本文將詳細介紹如何使用 Python 和 OpenCV 庫實現(xiàn)攝像頭人臉檢測并截圖,并通過具體的代碼示例來展示整個過程。
環(huán)境準備
在開始編寫代碼之前,確保已經(jīng)安裝了 OpenCV 庫??梢允褂靡韵旅畎惭b:
pip install opencv-python
代碼詳解
# -*- coding: utf-8 -*-
# import 進openCV的庫
import cv2
import os
import time# 調用攝像頭檢測人臉并截圖
def camera(window_name, path_name):# Linux 不顯示圖形界面cv2.namedWindow(window_name)# 視頻來源,來自USB攝像頭cap = cv2.VideoCapture(0)# 告訴OpenCV使用人臉識別分類器classfier = cv2.CascadeClassifier(os.getcwd()+"/haarcascade_frontalface_alt.xml")# 識別出人臉后要畫的邊框的顏色,RGB格式, color是一個不可增刪的數(shù)組color = (0, 255, 0)num = 0while cap.isOpened():ok, frame = cap.read() # 讀取一幀數(shù)據(jù)if not ok:break# 將當前楨圖像轉換成灰度圖像grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點數(shù)faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))if len(faceRects) > 0: # 大于0則檢測到人臉for faceRect in faceRects: # 單獨框出每一張人臉x, y, w, h = faceRectnum = num + 1# 將當前幀保存為圖片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)# 顯示當前捕捉到了多少人臉圖片了font = cv2.FONT_HERSHEY_SIMPLEXcv2.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. 導入必要的模塊
# -*- coding: utf-8 -*-
# import 進openCV的庫
import cv2
import os
import time
# -*- coding: utf-8 -*-
:指定文件編碼為 UTF-8。import cv2
:導入 OpenCV 庫,用于圖像處理和人臉檢測。import os
:導入 os 模塊,用于文件路徑操作。import time
:導入 time 模塊,用于延遲操作。
2. 定義 camera
函數(shù)
def camera(window_name, path_name):
def camera(window_name, path_name):
:定義一個名為camera
的函數(shù),參數(shù)window_name
是窗口名稱,path_name
是保存截圖的路徑。
3. 創(chuàng)建窗口
# Linux 不顯示圖形界面cv2.namedWindow(window_name)
cv2.namedWindow(window_name)
:創(chuàng)建一個窗口,用于顯示視頻流。在 Linux 下可以注釋掉這行代碼以不顯示圖形界面。
4. 打開攝像頭
# 視頻來源,來自USB攝像頭cap = cv2.VideoCapture(0)
cv2.VideoCapture(0)
:打開默認攝像頭。參數(shù) 0 表示默認攝像頭。
5. 加載人臉識別分類器
# 告訴OpenCV使用人臉識別分類器classfier = cv2.CascadeClassifier(os.getcwd()+"/haarcascade_frontalface_alt.xml")
cv2.CascadeClassifier(...)
:加載預訓練的 Haar 級聯(lián)分類器,用于檢測人臉。os.getcwd()+"/haarcascade_frontalface_alt.xml"
:指定分類器文件的路徑。
6. 設置邊框顏色
# 識別出人臉后要畫的邊框的顏色,RGB格式, color是一個不可增刪的數(shù)組color = (0, 255, 0)
color = (0, 255, 0)
:定義邊框顏色為綠色。
7. 主循環(huán)
num = 0while cap.isOpened():ok, frame = cap.read() # 讀取一幀數(shù)據(jù)if not ok:break# 將當前楨圖像轉換成灰度圖像grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點數(shù)faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))if len(faceRects) > 0: # 大于0則檢測到人臉for faceRect in faceRects: # 單獨框出每一張人臉x, y, w, h = faceRectnum = num + 1# 將當前幀保存為圖片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)# 顯示當前捕捉到了多少人臉圖片了font = cv2.FONT_HERSHEY_SIMPLEXcv2.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
num = 0
:初始化計數(shù)器。while cap.isOpened():
:進入無限循環(huán),實時讀取攝像頭圖像。ok, frame = cap.read()
:從攝像頭讀取一幀圖像。if not ok:
:檢查讀取是否成功,如果失敗則退出循環(huán)。grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
:將圖像轉換為灰度圖像。faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
:檢測圖像中的人臉。if len(faceRects) > 0:
:檢查是否檢測到人臉。for faceRect in faceRects:
:遍歷檢測到的每個人臉。x, y, w, h = faceRect
:獲取人臉的位置和大小。num = num + 1
:增加計數(shù)器。img_name = "%s/%d.jpg" % (path_name, num)
:生成保存圖像的文件名。image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
:裁剪人臉區(qū)域并擴大邊界。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
:設置字體樣式。cv2.putText(frame, 'num:%d/1000' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4)
:在圖像上顯示當前捕捉到的人臉數(shù)量。cv2.imshow(window_name, frame)
:顯示帶有矩形標記的圖像。c = cv2.waitKey(10)
:等待 10 毫秒,等待用戶按鍵。if c & 0xFF == ord('q'):
:按 ‘q’ 鍵退出循環(huán)。
8. 釋放資源
# 釋放攝像頭并銷毀所有窗口cap.release()cv2.destroyAllWindows()
cap.release()
:釋放攝像頭資源。cv2.destroyAllWindows()
:關閉所有 OpenCV 窗口。
9. 主程序入口
if __name__ == '__main__':camera("watchdog", os.getcwd()+"/face")
if __name__ == '__main__':
:檢查是否直接運行此腳本。camera("watchdog", os.getcwd()+"/face")
:調用camera
函數(shù),傳入窗口名稱和保存截圖的路徑。
完整代碼
# -*- coding: utf-8 -*-
# import 進openCV的庫
import cv2
import os
import time
# 調用攝像頭檢測人臉并截圖
def camera(window_name, path_name):# Linux 不顯示圖形界面cv2.namedWindow(window_name)# 視頻來源,來自USB攝像頭cap = cv2.VideoCapture(0)# 告訴OpenCV使用人臉識別分類器classfier = cv2.CascadeClassifier(os.getcwd()+"/haarcascade_frontalface_alt.xml")# 識別出人臉后要畫的邊框的顏色,RGB格式, color是一個不可增刪的數(shù)組color = (0, 255, 0)num = 0while cap.isOpened():ok, frame = cap.read() # 讀取一幀數(shù)據(jù)if not ok:break# 將當前楨圖像轉換成灰度圖像grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點數(shù)faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))if len(faceRects) > 0: # 大于0則檢測到人臉for faceRect in faceRects: # 單獨框出每一張人臉x, y, w, h = faceRectnum = num+1# 將當前幀保存為圖片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)# 顯示當前捕捉到了多少人臉圖片了font = cv2.FONT_HERSHEY_SIMPLEXcv2.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")
測試
-
確保你的攝像頭正常工作。
-
運行腳本:
python3 face_detection.py
-
打開攝像頭后,你會看到一個窗口顯示實時視頻流,并且在檢測到的人臉周圍繪制綠色矩形。
-
按 ‘q’ 鍵退出程序。
總結
本文詳細介紹了如何使用 Python 和 OpenCV 庫實現(xiàn)攝像頭人臉檢測并截圖,并通過具體的代碼示例展示了整個過程。通過使用 cv2.VideoCapture
打開攝像頭,cv2.CascadeClassifier
加載預訓練的 Haar 級聯(lián)分類器,cv2.cvtColor
轉換圖像顏色空間,cv2.rectangle
繪制矩形,cv2.imwrite
保存圖像,最終實現(xiàn)了在實時視頻流中檢測并保存人臉圖像的功能。