目录
效果:
原理
轮廓识算法,别说白了就是用算法去抠图;想办法找到目标图像与背景的边界,然后通过边界把目标图像抠出来。
如下图所示,最清晰的边界就是黑与白:
但是,将这个方法用在人脸上,还需要一些复杂的处理。需要找出眼睛、鼻子、嘴的大致位置,才能知道这是人的脸。
标定眼睛、鼻子、嘴的轮廓:
以邻域中心像素为阈值,相邻的8个像素的灰度值与邻域中心的像素值进行比较,若周围像素大于中心像素值,则该像素点的位置被标记为1,否则为0。将整个标定的过程,放入到级联算法中去优化。
代码实现
import numpy as np
import cv2
face = 'Cascades/haarcascade_frontalface_default.xml'
eye = 'Cascades/haarcascade_eye.xml'
smile = 'Cascades/haarcascade_smile.xml'
faceCascade = cv2.CascadeClassifier(face)
image_path = "C:\\picture\\1.png"
img = cv2.imread(image_path,cv2.IMREAD_COLOR)
print(img.shape)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.2,
minNeighbors=5
,
minSize=(20, 20)
)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
cv2.imshow("window1", img)
k = cv2.waitKey(0)
if k == 27: # 回车
pass
elif k == ord('s'):
pass
cv2.destroyAllWindows()
更详细的项目代码,在我的代码仓库。 可自行下载:
十四万四千人的歌/人脸轮廓识别https://gitee.com/rli07/opencv-face-contour-recognition
更详细的原理说明可以查看 《OpenCV-Python-Toturial-中文版》
链接:https://pan.baidu.com/s/1PhhLWoyMKXOyoVr0KmrQnw
提取码:af2o