視訊人臉檢測——OpenCV版(三)

王磊的部落格發表於2018-04-24

視訊人臉檢測是圖片人臉檢測的高階版本,圖片檢測詳情點選檢視我的上一篇《圖片人臉檢測——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()  # 釋放視窗資源

 

 

相關文章