얼굴 비교는 현재 일반적으로 사용되는 기능으로, 예를 들어 택시 기사의 얼굴을 운전 면허 사진과 비교하고 출입 통제 시스템의 출입자 얼굴을 얼굴 라이브러리의 얼굴과 비교합니다. 얼굴 비교를 위해 가장 먼저해야 할 일은 얼굴 인식인데, 카메라로 찍은 사진에서 얼굴의 위치를 정확하게 인식하고 얼굴을 추출합니다.
목차
1.1 68 포인트 보정 및 OpenCV 드로잉 포인트
1 원리 예언자
1.1 68 포인트 보정 및 OpenCV 드로잉 포인트
무료 및 오픈 소스를 고려할 때 OpenCV는이 기능을 잘 수행 할 수 있습니다.
여기서 우리는 OpenCV를 사용하여 좋은 얼굴 분류 모델 xml : haarcascade_frontalface_alt_tree.xml을 제공합니다.
동시에 Dlib의 공식 얼굴 인식 예측기 "shape_predictor_68_face_landmarks.dat"를 사용하여 68 포인트 보정을 수행합니다 (이미지 처리에 OpenCV 사용, 얼굴에 68 포인트 그리기, 일련 번호 표시).
참고 : OpenCV 얼굴 분류 모델 xml 및 Dlib 얼굴 인식 예측기 다운로드 주소
https://pan.baidu.com/s/1gZfYupoW9Zo_2lVV524cWA
추출 코드 : w536
얼굴의 68 포인트 포지셔닝 내용은 주로 다음과 같습니다 : 68 포인트 보정 및 OpenCV 그리기
- 68 점 보정 : dlib는 얼굴의 68 개 특징점을 인식 할 수있는 훈련 된 모델을 제공합니다.
- OpenCV 그리기 포인트 : 원 함수 cv2.circle () 및 출력 문자열 함수 cv2.putText ()
1.2 코딩 디자인 아이디어
- 얼굴 인식을 위해 dlib 라이브러리를 호출하고 예측기 "shape_predictor_68_face_landmarks.dat"를 호출합니다.
- 68 포인트 보정을 수행하고 68 포인트 좌표를 저장합니다.
- cv2.circle을 사용하여 68 점을 그립니다.
- cv2.putText () 함수를 사용하여 1-68 숫자를 그립니다.
1.3 OpenCV 그리기 기능 소개
- 원 그리기 cv2.circle (img, (p1, p2), r, (255,255,255))
img picture object
(p1, p2) circle center coordinates
r radius
(255,255,255) color array - 출력 문자 cv2.putText (img, "test", (p1, p2), font, 4, (255,255,255), 2, cv2, LINE_AA)
img 이미지 객체
"test" 는 문자 텍스트를 인쇄해야합니다 (숫자의 경우 use str () 문자로 변환 됨)
(p1, p2) 좌표 textOrg
글꼴 은 글꼴을 나타냅니다 fontFace (여기에 글꼴 = cv2.FONT_HERSHEY_SIMPLEX)
4 는 글꼴 크기를 나타냅니다 fontScale
(255,255,255) 색상 배열
2 선 너비 두께
LINE_AA 선 유형 line_type;
about 색상 배열 : (255,255,255), (파란색, 녹색, 빨간색), 각 값은 0-255입니다. 예 : 파란색 (255,0,0), 보라색 (255,0,255)
2 환경 설명
- Linux Ubuntu 16.04
- 파이썬 3.6
- PyCharm 커뮤니티 2018
- Opencv-python 3.4.0.12
3 실험 내용
- haarcascade_frontalface_alt_tree.xml 얼굴 분류 모델을 사용하여 얼굴을 감지합니다.
- 68 포인트 보정에는 Dlib의 공식 얼굴 인식 예측기 "shape_predictor_68_face_landmarks.dat"를 사용하고, 이미지 처리에는 OpenCV를 사용하고, 얼굴에 68 포인트를 그리고, 일련 번호를 표시합니다.
자세한 4 단계
4.1 OpenCV는 얼굴 감지를 실현합니다
먼저 그림을 회색으로 변환하십시오. OpenCV의 cvtColor ()를 사용하여 그림 색상을 변환하십시오.
import cv2
filepath = "/data/opencv12/mv.jpg"
img = cv2.imread(filepath)
# 转换灰色,目的是在人脸检测时排除色彩的干扰
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 显示图像
cv2.imshow("original", img)
cv2.imshow("Image", gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
그런 다음 훈련 분류기를 사용하여 얼굴을 찾습니다. OpenCV의 얼굴 감지를 사용하기 전에 얼굴 훈련 모델이 필요합니다. 형식은 xml입니다.이 실험에서는 OpenCV에서 제공하는 좋은 얼굴 분류 모델 xml 인 haarcascade_frontalface_alt_tree.xml을 사용합니다.
Haar 기능 분류기는 인체의 다양한 부분에 대한 Haar 기능 값을 설명하는 XML 파일입니다. 인간의 얼굴, 눈, 입술 등을 포함합니다.
OpenCV의 얼굴 감지는 detectMultiScale 기능을 사용합니다. 사진 속의 모든 얼굴을 감지하고 각 얼굴의 좌표와 크기를 벡터 (사각형으로 표시)로 저장할 수 있습니다.
# 加载OpenCV人脸识别分类器
face_detector = cv.CascadeClassifier("haarcascade_frontalface_alt_tree.xml")
# 调用函数识别人脸
faceRects = classifier.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
마지막으로 그림에 사각형을 그립니다. OpenCV의 rectangle ()을 사용하여 사각형을 그립니다.
color = (0, 255, 0)
if len(faceRects): # 大于0则检测到人脸
for faceRect in faceRects: # 单独框出每一张人脸
x, y, w, h = faceRect # x、y表示坐标;w、h表示矩形宽和高
# 框出人脸
cv2.rectangle(img, (x, y), (x + h, y + w), color, 2)
# 左眼
cv2.circle(img, (x + w // 4, y + h // 4 + 30), min(w // 8, h // 8),color)
#右眼
cv2.circle(img, (x + 3 * w // 4, y + h // 4 + 30), min(w // 8, h // 8),color)
#嘴巴
cv2.rectangle(img, (x + 3 * w // 8, y + 3 * h // 4),(x + 5 * w // 8, y + 7 * h // 8), color)
OpenCV 는 다음과 같이 얼굴 감지 를 위한 전체 코드를 구현합니다 .
import cv2
filepath = "/data/opencv12/mv.jpg"
img = cv2.imread(filepath)
cv2.imshow("original", img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
classifier = cv2.CascadeClassifier("/data/opencv12/haarcascade_frontalface_alt_tree.xml")
faceRects = classifier.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
color = (0, 255, 0)
if len(faceRects):
for faceRect in faceRects:
x, y, w, h = faceRect
cv2.rectangle(img, (x, y), (x + h, y + w), color, 2)
cv2.circle(img, (x + w // 4, y + h // 4 + 30), min(w // 8, h // 8),color)
cv2.circle(img, (x + 3 * w // 4, y + h // 4 + 30), min(w // 8, h // 8),color)
cv2.rectangle(img, (x + 3 * w // 8, y + 3 * h // 4),(x + 5 * w // 8, y + 7 * h // 8), color)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV는 아래와 같이 얼굴 인식의 실행 결과를 실현합니다 .
4.2 얼굴의 68 점 위치
OpenCV를 사용하여 얼굴 감지를 수행하는 것 외에도 OpenCV보다 더 정확한 이미지 얼굴 감지를 위해 Dlib 라이브러리를 사용하여 68 포인트 얼굴 위치를 얻을 수 있습니다.
먼저 호출해야하는 라이브러리를 가져옵니다.
import dlib #人脸识别的库dlib
from PIL import Image #图像处理的库PIL
import numpy as np #数据处理的库numpy
import cv2 #图像处理的库OpenCv
그런 다음 그림을 읽고 그림을 회색조로 변환합니다.
path = "/data/opencv12/mv.jpg"
img = cv2.imread(path)
cv2.imshow("original", img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
다음으로 학습 모델을 읽어 얼굴의 68 개 특징점을 감지 할 수 있습니다.
# 人脸分类器
detector = dlib.get_frontal_face_detector()
# 获取人脸检测器
predictor = dlib.shape_predictor("/data/opencv12/shape_predictor_68_face_landmarks.dat")
마지막으로 얼굴의 모든 감지 지점을 가로 질러 표시하고 숫자 1-68을 표시합니다.
rects = detector(gray, 0)
for i in range(len(rects)):
landmarks = np.matrix([[p.x, p.y] for p in predictor(img, rects[i]).parts()]) # 寻找人脸的68个标定点
# 遍历所有点,打印出其坐标,并圈出来,并标注1-68数字
for idx, point in enumerate(landmarks):
pos = (point[0, 0], point[0, 1])
# 利用cv2.circle给每个特征点画一个圈,共68个
cv2.circle(img, pos, 3, color=(0, 255, 0))
# 利用cv2.putText输出1-68
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, str(idx+1), pos, font, 0.3, (0, 0, 255), 1, cv2.LINE_AA)
68 점 얼굴 위치 지정을 위한 전체 코드 는 다음과 같습니다.
import cv2
import dlib
import numpy as np
path = "/data/opencv12/mv.jpg"
img = cv2.imread(path)
cv2.imshow("original", img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("/data/opencv12/shape_predictor_68_face_landmarks.dat")
rects = detector(gray, 0)
for i in range(len(rects)):
landmarks = np.matrix([[p.x, p.y] for p in predictor(img, rects[i]).parts()])
for idx, point in enumerate(landmarks):
pos = (point[0, 0], point[0, 1])
cv2.circle(img, pos, 3, color=(0, 255, 0))
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, str(idx+1), pos, font, 0.3, (0, 0, 255), 1, cv2.LINE_AA)
cv2.imshow("imgdlib", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
68 점 얼굴 위치 결정 작업 의 결과 는 다음과 같습니다.
아래 그림과 같이 dlib가 눈, 코, 입 등 얼굴을 감지하고 68 점으로 표시된 사진을 볼 수 있으며, 얼굴을 정확하게 찾아 감지 할 수 있습니다.
메시지를 남기고 함께 배우고 소통하는 것을 환영합니다 ~
읽어 주셔서 감사합니다