OpenCV 五官侦测
这篇教学会介绍使用 OpenCV,搭配眼睛、嘴巴和鼻子的特征模型,侦测图像中人的五官,并透过绘制形状的方式,使用方框标记侦测到的眼睛、鼻子和嘴巴,实现类似 AI 图像辨识的效果。
快速导览:
因为程序中的 OpenCV 会需要使用镜头或 GPU,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda ) ,并安装 OpenCV 函数库 ( 参考:OpenCV 函数库 )。
下载人脸特征模型
从下方网址下载对应的特征模型,下载后将 xml 文件和 Python 的程序档放在同一层目录下。
- OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data
- atduskgreg Github:opencv-processing
- 眼睛特征模型:haarcascade_eye.xml
- 嘴巴特征模型:haarcascade_mcs_mouth.xml
- 鼻子特征模型:haarcascade_mcs_nose.xml
侦测眼睛、鼻子和嘴巴
下方的例子执行后,会侦测图片中人的眼睛、鼻子和嘴巴,并透过绘制形状的方式,使用方框标记侦测到的人脸,通常鼻子和嘴巴的准确度较低,容易侦测到其他类似的形状,至于眼睛的准确度则较高 ( 图片使用海伦娜弗尔曼肖像 )。
import cv2
img = cv2.imread('girl.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 圖片轉灰階
#gray = cv2.medianBlur(gray, 5) # 如果一直偵測到雜訊,可使用模糊的方式去除雜訊
eye_cascade = cv2.CascadeClassifier("haarcascade_eye.xml") # 使用眼睛模型
eyes = eye_cascade.detectMultiScale(gray) # 偵測眼睛
for (x, y, w, h) in eyes:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) # 標記綠色方框
mouth_cascade = cv2.CascadeClassifier("haarcascade_mcs_mouth.xml") # 使用嘴巴模型
mouths = mouth_cascade.detectMultiScale(gray) # 偵測嘴巴
for (x, y, w, h) in mouths:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2) # 標記紅色方框
nose_cascade = cv2.CascadeClassifier("haarcascade_mcs_nose.xml") # 使用鼻子模型
noses = nose_cascade.detectMultiScale(gray) # 偵測鼻子
for (x, y, w, h) in noses:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) # 標記藍色方框
cv2.imshow('oxxostudio', img)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
即时侦测影片中的五官
延伸“读取并播放影片”文章的范例,搭配上述的侦测方法,就可以即时侦测摄影镜头里的眼睛、鼻子和嘴巴。
import cv2
cap = cv2.VideoCapture(0)
eye_cascade = cv2.CascadeClassifier("haarcascade_eye.xml") # 使用眼睛模型
mouth_cascade = cv2.CascadeClassifier("haarcascade_mcs_mouth.xml") # 使用嘴巴模型
nose_cascade = cv2.CascadeClassifier("haarcascade_mcs_nose.xml") # 使用鼻子模型
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("Cannot receive frame")
break
img = cv2.resize(frame,(540,320))
gray = cv2.medianBlur(img, 1)
gray = cv2.cvtColor(gray, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray, 5)
eyes = eye_cascade.detectMultiScale(gray) # 偵測眼睛
for (x, y, w, h) in eyes:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
mouths = mouth_cascade.detectMultiScale(gray) # 偵測嘴巴
for (x, y, w, h) in mouths:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)
noses = nose_cascade.detectMultiScale(gray) # 偵測鼻子
for (x, y, w, h) in noses:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
cv2.imshow('oxxostudio', img)
if cv2.waitKey(1) == ord('q'):
break # 按下 q 鍵停止
cap.release()
cv2.destroyAllWindows()
微信扫码关注
抖音扫码关注