譯者| 布加迪
審校| 重樓
出於幾個原因,您可能會使用人臉模糊來隱藏影片或影像中的人臉。隱私和安全問題是最主要的原因。大多數影片分享平台和影片編輯軟體都內建了人臉模糊功能。
您可以使用Python、OpenCV和NumPy函式庫從頭開始建立自己的人臉模糊程式。
要完成本文的學習,您需要熟悉Python的基礎知識,並對NumPy庫的使用有一番基本的了解。
開啟任何您熟悉的Python IDE。建立一個虛擬環境,用來安裝所需的庫。建立一個新的Python檔。進入到終端,執行以下命令來安裝所需的庫。將庫作為以空格分隔的列表來傳遞。
pip install OpenCV-python NumPy
您將使用OpenCV取得並預處理視訊輸入,使用NumPy處理陣列。
一旦您安裝了函式庫,等待IDE更新專案骨幹部分。更新完成、環境準備好後,您就可以開始編碼了。
注意:完整的原始程式碼可以在GitHub程式碼庫中找到(https://github.com/makeuseofcode/Face-Blurring)。
首先,導入OpenCV函式庫和NumPy函式庫。這將使您能夠調用和使用它們支援的任何函數。導入OpenCV-python作為cv2。
import cv2 import numpy as np
OpenCV-python模組使用名稱cv2作為OpenCV社群建立的約定。 OpenCV- Python是OpenCV函式庫的Python包裝器,用C 編寫。
建立一個變量,並初始化VideoCapture物件。如果您想使用電腦的主相機作為輸入來源,則應傳遞0作為參數。若要使用連接到電腦上的外部攝影機,請傳遞1。若要對預先錄製的影片執行人臉模糊處理,請改而傳遞影片的路徑。若要使用遠端攝影機,傳遞攝影機的URL,其中含有IP位址和連接埠號碼。
cap = cv2.VideoCapture(0)
要對輸入執行人臉模糊,您需要這三個函數:
建立一個輸入預處理函數,將輸入視訊的每個畫面作為其輸入。初始化CascadeClassifier類,您將用這個類別來偵測人臉。將畫面大小調整為640 * 640像素。將調整大小的畫面轉換成灰階以便處理,最後偵測輸入中的人臉,並將其與矩形綁定。
def image_preprocess(frame): face_detector = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') resized_image = cv2.resize(frame, (640, 640)) gray_image = cv2.cvtColor(resized_image, cv2.COLOR_BGR2GRAY) face_rects = face_detector.detectMultiScale( gray_image, 1.04, 5, minSize=(20, 20)) return resized_image, face_rects
該函數傳回一個元組,包含調整大小的圖像和表示檢測到的人臉的矩形列表。
建立一個模糊函數,將模糊輸入中的人臉。此函數將調整大小的幀和預處理函數傳回的包圍人臉的矩形列表作為輸入。循環處理人臉矩形。計算每個矩形的中心和模糊圓的半徑。透過將所有像素初始化為0,創建一個與調整大小的幀具有相同尺寸的黑色影像。使用計算出的半徑,在中心位於人臉矩形的黑色影像上繪製白圓。最後,它模糊白圓上的圖像。
def face_blur(resized_frame, face_rects): for (x, y, w, h) in face_rects: # Specifying the center and radius # of the blurring circle center_x = x + w // 3 center_y = y + h // 3 radius = h // 1 # creating a black image having similar # dimensions as the frame mask = np.zeros((resized_frame.shape[:3]), np.uint8) # draw a white circle in the face region of the frame cv2.circle(mask, (center_x, center_y), radius, (255, 255, 255), -1) # blurring the whole frame blurred_image = cv2.medianBlur(resized_frame, 99) # reconstructing the frame: # - the pixels from the blurred frame if mask > 0 # - otherwise, take the pixels from the original frame resized_frame = np.where(mask > 0, blurred_image, resized_frame) return resized_frame
此函數使用NumPy where()函數在模糊過程中重建幀。
建立一個主函數,充當程式的入口點。然後它將控製程序流程。該函數將開始一個無限循環,並不斷捕捉視訊輸入的幀。呼叫cap物件的讀取方法,從攝影機讀取幀。
然後,該函數將幀傳遞給預處理函數,並將返回值傳遞給另一個函數face_blur,以獲得模糊後的圖像。然後,它調整模糊函數傳回的幀的大小,並顯示輸出。
def main(): while True: success, frame = cap.read() resized_input, face_rects = image_preprocess(frame) blurred_image = face_blur(resized_input, face_rects) # Diplaying the blurred image cv2.imshow("Blurred image", cv2.resize(blurred_image, (500, 500))) if cv2.waitKey(1) == ord("q"): break
此函數也會在使用者按下q鍵時終止輸出顯示。
確保在執行腳本時先執行main函數。如果將腳本作為另一個程式中的模組匯入,則該條件將為假。
if __name__ == "__main__": main()
這允許您將腳本作為模組來使用或作為獨立程式來運行。當程式運行時,您應該會看到類似這樣的輸出:
#人臉已經過模糊處理,辨識不出來。
您可以在許多類型的應用程式環境中運用人臉模糊來保護隱私。街景和地圖服務使用模糊技術來模糊影像中人物的臉部。執法部門使用人臉模糊技術來保護證人的身分。
#許多影片分享平台也為使用者整合了人臉模糊功能。比較人臉模糊在這些領域的使用可以幫助您觀察其他平台如何整合這項技術。
原文連結:https://www.makeuseof.com/python-blur-human-faces-real-time/
以上是如何使用Python即時模糊人臉的詳細內容。更多資訊請關注PHP中文網其他相關文章!