人生第一次寫博客,有錯誤的地方,給我回復下 , 話不多說,直接上代碼
#include <dlib/opencv.h>
#include <opencv2/opencv.hpp>
//#include<opencv2/photo.hpp>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing/render_face_detections.h>
#include <dlib/image_processing.h>
#include<facedetect-dll.h>
#include"ColorT.h"
#include<vector>
dlib::shape_predictor sp;
int detectctFace(cv::Mat &mat, std::vector<cv::Point> &point) //使用的是於仕琪老師的人臉檢測
{
dlib::full_object_detection shape1;
cv::Mat mat1, gra;
mat.copyTo(mat1);
cv::cvtColor(mat1, gra, CV_BGR2GRAY);
int * pResults = NULL;
unsigned char * pBuffer = (unsigned char *)malloc(0x20000);
if (!pBuffer)
{
fprintf(stderr, "Can not alloc buffer.\n");
return -1;
}
pResults = facedetect_multiview_reinforce(pBuffer, (unsigned char*)(gra.ptr(0)), gra.cols, gra.rows, (int)gra.step, 1.15f, 5, 15, 0, 0);
std::vector<cv::Point>().swap(point);
point.clear();
if (*pResults > 0)
{
for (int i = 0; i < (pResults ? *pResults : 0); i++)
{
dlib::rectangle det;
short * p = ((short*)(pResults + 1)) + 142 * i;
int x = p[0];
int y = p[1];
int w = p[2];
int h = p[3];
if (w > 0 && h > 0 && x + w < gra.cols&&y + h < gra.rows)
{
det.set_top(y);
det.set_left(x);
det.set_bottom(y + h);
det.set_right(x + w);
dlib::cv_image<dlib::bgr_pixel> cimg(mat);
shape1 = sp(cimg, det); //特徵點檢測
for (int s = 0; s < 17; s++)
{
cv::Point2f pt(shape1.part(s).x(), shape1.part(s).y());
point.push_back(pt);
}
for (int s = 26; s > 16; s--)
{
cv::Point2f pt(shape1.part(s).x(), shape1.part(s).y());
point.push_back(pt);
}
}
}
}
free(pBuffer);
pResults = NULL;
}
//這個函數是將三角剖分後的三角對點與人臉的特徵點位置相匹配,拿出三角對的序列
void getImgTriangleList(Size size, Subdiv2D &subdiv, vector<Point> &point, vector<int>&triangleSeq)
{
Rect rect(0, 0, size.width, size.height);
vector<Vec6f> triangleList;
subdiv.getTriangleList(triangleList);
vector<Point> pt(3);
cout << "triangleList Size is:" << triangleList.size() << endl;
for (size_t i = 0; i < triangleList.size(); i++)
{
Vec6i t = triangleList[i];
pt[0] = Point(t[0], t[1]);
pt[1] = Point(t[2], t[3]);
pt[2] = Point(t[4], t[5]);
if (rect.contains(pt[0]) && rect.contains(pt[1]) && rect.contains(pt[2]))
{
for (int j = 0; j < 3; j++)
for (int k = 0; k < point.size(); k++)
{
if (pt[j].x == point[k].x&& pt[j].y == point[k].y)
{
triangleSeq.push_back(k);
break;
}
}
}
}
}
//人臉融合函數
void morphFaceFunc(Mat srcA, Mat &srcB, vector<cv::Point> pointA, vector<cv::Point> pointB, vector<int> triangleSeq)
{
Mat srcBCopy;
srcB.copyTo(srcBCopy); //原圖複製一個
int size = triangleSeq.size();
for (int j = 0; j < size; j += 3) //對所有的三角形遍歷並進行復制
{
vector<Point> pointAFace(3);
vector<Point> pointBFace(3);
//A圖人臉上的三個點
Point2f pointBf[3];
//計算相對於剛纔rectA 的點,以及對應於rectB 的點 ,爲之後的仿射變換做準備
//用三個點做一個三角形的mask
Mat outMaskB(rectB.size(), CV_8UC1);//), outImg2;
//將 a 臉上的一個三角形紋理向b臉上進行仿射變換,同時把mask也進行仿射變換,如果直接用b圖的三角形 mask
//進行復制,人臉上會有縫隙產生
cout << "開始人臉檢測" << endl;
//人臉檢測,以及特徵點檢測
}
原工程下載地址,哈哈,賺點積分而已
http://download.csdn.net/download/wz9ixk58/10269365