import cv2import dlibimport numpy as np#根据人脸框bbox,从一张完整图片裁剪出人脸def getface():bgrImg = cv2.imread('1.jpg')print bgrImg.shapergbImg = cv2.cvtColor(bgrImg, cv2.COLOR_BGR2RGB)detector=dlib.get_frontal_face_detector()#img = io.imread('1.jpg')faces = detector(rgbImg, 1)if len(faces) > 0:face=max(faces, key=lambda rect: rect.width() * rect.height())[x1,x2,y1,y2]=[face.left(),face.right(),face.top(),face.bottom()]
人脸特征点定位:需要先从网上下载预训练模型
/projects/dclib/files/dlib/v18.10/shape_predictor_68_face_landmarks.dat.bz2
import dlib#根据人脸框bbox,从一张完整图片裁剪出人脸,并保存问文件名cropimgname#如果未检测到人脸,那么返回false,否则返回trueface_detector=dlib.get_frontal_face_detector()landmark_predictor=dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")def geteye_rect(imgpath):bgrImg = cv2.imread(imgpath)if bgrImg is None:return FalsergbImg = cv2.cvtColor(bgrImg, cv2.COLOR_BGR2RGB)facesrect = face_detector(rgbImg, 1)if len(facesrect) <=0:return Falsefor k, d in enumerate(facesrect):shape = landmark_predictor(rgbImg, d)for i in range(68):pt=shape.part(i)plt.plot(pt.x,pt.y,'ro')plt.imshow(rgbImg)plt.show()
二、C++版使用
1、在cmake中添加:dlib是dlib解压出来后,里面有个dlib源码文件。
include(dlib/cmake)
2、在可执行文件中,添加链接:
target_link_libraries( lightpredict dlib)
这样一来,就可以使用dlib了。
CDlibFace::CDlibFace() {m_facedetector= dlib::get_frontal_face_detector();dlib::deserialize("dlib/shape_predictor_68_face_landmarks.dat") >> m_facelandmarkdetector;}CDlibFace::~CDlibFace() {}cv::Rect CDlibFace::getfacerect(std::string imagefile){dlib::array2d<unsigned char> img;dlib::load_image(img,imagefile);// dlib::pyramid_down(img);clock_t begin = clock();std::vector<dlib::rectangle> dets = m_facedetector(img);double elapsed_secs = double(clock() - begin) / CLOCKS_PER_SEC;std::cout<<"face detection time:"<<elapsed_secs<<std::endl;if (dets.empty()){return cv::Rect(0,0,0,0);}else{std::cout<<dets[0].left()<<"top"<<dets[0].top()<<std::endl;return cv::Rect(dets[0].left(),dets[0].top(),dets[0].width(),dets[0].height());}}std::vector<cv::Point2i>CDlibFace::getfacelandmark(std::string imagefile){dlib::array2d<unsigned char> img;dlib::load_image(img,imagefile);// dlib::pyramid_down(img);clock_t begin = clock();std::vector<dlib::rectangle> dets = m_facedetector(img);std::vector<cv::Point2i> pts;for (unsigned long j = 0; j < dets.size()&&j<1; ++j){dlib::full_object_detection shape = m_facelandmarkdetector(img, dets[j]);for (int i = 0; i <shape.num_parts() ; ++i) {cv::Point2i pt(shape.part(i).x(),shape.part(i).y());pts.push_back(pt);}}return pts;}