視訊人臉檢測是圖片人臉檢測的高階版本,圖片檢測詳情點選檢視我的上一篇《圖片人臉檢測——OpenCV版(二)》
往期目錄
視訊人臉檢測——Dlib版(六)
OpenCV新增中文(五)
圖片人臉檢測——Dlib版(四)
視訊人臉檢測——OpenCV版(三)
圖片人臉檢測——OpenCV版(二)
OpenCV環境搭建(一)
更多更新,歡迎訪問我的github:https://github.com/vipstone/faceai
實現思路:
呼叫電腦的攝像頭,把攝像的資訊逐幀分解成圖片,基於圖片檢測標識出人臉的位置,把處理的圖片逐幀繪製給使用者,使用者看到的效果就是視訊的人臉檢測。
效果預覽:
實現步驟
使用OpenCV呼叫攝像頭並展示
獲取攝像頭:
cap = cv2.VideoCapture(0)
引數0表示,獲取第一個攝像頭。
顯示攝像頭 逐幀顯示,程式碼如下:
while (1):
ret, img = cap.read()
cv2.imshow("Image", img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release() # 釋放攝像頭
cv2.destroyAllWindows() # 釋放視窗資源
cv2.waitKey(1) & 0xFF使用了“&”位元演算法,含義是獲取使用者輸入的最後一個字元的ASCII碼,如果輸入的是“q”,則跳出迴圈。
視訊的人臉識別
這個時候,用到了上一節的《圖片人臉檢測——OpenCV版(二)》 把人臉識別的程式碼封裝成方法,程式碼如下:
def discern(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cap = cv2.CascadeClassifier(
"C:\Python36\Lib\site-packages\opencv-master\data\haarcascades\haarcascade_frontalface_default.xml"
)
faceRects = cap.detectMultiScale(
gray, scaleFactor=1.2, minNeighbors=3, minSize=(50, 50))
if len(faceRects):
for faceRect in faceRects:
x, y, w, h = faceRect
cv2.rectangle(img, (x, y), (x + h, y + w), (0, 255, 0), 2) # 框出人臉
cv2.imshow("Image", img)
再迴圈攝像頭幀圖片的時候,呼叫圖片識別方法即可,程式碼如下:
# 獲取攝像頭0表示第一個攝像頭
cap = cv2.VideoCapture(0)
while (1): # 逐幀顯示
ret, img = cap.read()
# cv2.imshow("Image", img)
discern(img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release() # 釋放攝像頭
cv2.destroyAllWindows() # 釋放視窗資源
完整的程式碼如下:
# -*- coding:utf-8 -*-
# OpenCV版本的視訊檢測
import cv2
# 圖片識別方法封裝
def discern(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cap = cv2.CascadeClassifier(
"C:\Python36\Lib\site-packages\opencv-master\data\haarcascades\haarcascade_frontalface_default.xml"
)
faceRects = cap.detectMultiScale(
gray, scaleFactor=1.2, minNeighbors=3, minSize=(50, 50))
if len(faceRects):
for faceRect in faceRects:
x, y, w, h = faceRect
cv2.rectangle(img, (x, y), (x + h, y + w), (0, 255, 0), 2) # 框出人臉
cv2.imshow("Image", img)
# 獲取攝像頭0表示第一個攝像頭
cap = cv2.VideoCapture(0)
while (1): # 逐幀顯示
ret, img = cap.read()
# cv2.imshow("Image", img)
discern(img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release() # 釋放攝像頭
cv2.destroyAllWindows() # 釋放視窗資源