OpenCV 人脸马赛克
这篇教学会介绍延伸“人脸侦测”文章的范例,搭配 OpenCV 马赛克的效果,自动侦测图像中的人脸,并将人脸加上马赛克。
快速导览:
因为程序中的 OpenCV 会需要使用镜头或 GPU,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda ) ,并安装 OpenCV 函数库 ( 参考:OpenCV 函数库 )。
下载人脸特征模型
OpenCV 的官方 Github 提供了许多训练好的特征模型,只需要下载后就能使用,请从下方网址进行下载,下载后将 xml 文件和 Python 的程序档放在同一层目录下。
- OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data
- 人脸特征模型:haarcascade_frontalface_default.xml
人脸加上马赛克
将“人脸侦测”和“马赛克效果”两篇文章的范例结合,当图像中侦测到人脸时,透过 x、y 坐标和 w、h 长宽,就能定义马赛克的位置和大小,下面的程序执行后,会自动将蒙娜丽莎的脸加上马赛克。
import cv2
img = cv2.imread('mona.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 影像轉換成灰階
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") # 載入人臉偵測模型
faces = face_cascade.detectMultiScale(gray,1.2,3) # 開始辨識影像中的人臉
for (x, y, w, h) in faces:
mosaic = img[y:y+h, x:x+w] # 馬賽克區域
level = 15 # 馬賽克程度
mh = int(h/level) # 根據馬賽克程度縮小的高度
mw = int(w/level) # 根據馬賽克程度縮小的寬度
mosaic = cv2.resize(mosaic, (mw,mh), interpolation=cv2.INTER_LINEAR) # 先縮小
mosaic = cv2.resize(mosaic, (w,h), interpolation=cv2.INTER_NEAREST) # 然後放大
img[y:y+h, x:x+w] = mosaic # 將指定區域換成馬賽克區域
cv2.imshow('oxxostudio', img)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
如果有多张人脸,也可以顺利侦测,并将侦测到的人脸加上马赛克 ( 图片为 Fusilamientos de Torrijos y sus compañeros en las playas de Málaga )。
即时侦测影片中的人脸
延伸“读取并播放影片”文章的范例,搭配人脸侦测的方法,就可以即时侦测摄影镜头里的人脸。
import cv2
cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("Cannot receive frame")
break
frame = cv2.resize(frame,(480,300)) # 縮小尺寸,避免尺寸過大導致效能不好
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 影像轉轉灰階
faces = face_cascade.detectMultiScale(gray) # 偵測人臉
for (x, y, w, h) in faces:
mosaic = frame[y:y+h, x:x+w]
level = 15
mh = int(h/level)
mw = int(w/level)
mosaic = cv2.resize(mosaic, (mw,mh), interpolation=cv2.INTER_LINEAR)
mosaic = cv2.resize(mosaic, (w,h), interpolation=cv2.INTER_NEAREST)
frame[y:y+h, x:x+w] = mosaic
cv2.imshow('oxxostudio', frame)
if cv2.waitKey(1) == ord('q'):
break # 按下 q 鍵停止
cap.release()
cv2.destroyAllWindows()
微信扫码关注
抖音扫码关注