ASM模型对人脸特征点的检测

<span style="font-size:18px;">// Face_ASM.cpp : 定义控制台应用程序的入口点。
//

//#include "stdafx.h"
#include <iostream>
#include <vector>
//#include "stdafx.h"

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#pragma comment(lib,"asmlibraryD.lib")

#include "asmfitting.h"

using namespace std;
using namespace cv;


int main()
{
	Point2D32f pt;
	int circle_x, circle_y, i, j;
	//IplImage* img = cvLoadImage("D:6.jpg");
	Mat img = imread("D:6.jpg");
	IplImage* img1;
	img1 = &IplImage(img);
	//*****************人脸检测****************************************************************************
	CascadeClassifier face_cascade;  //识别人脸的功能
	if (!face_cascade.load("haarcascade_frontalface_alt.xml"))
	{
		cout << "Cascadeclassifier load false!" << endl;
		return -1;
	}
	vector<Rect> face_vec; //保存人脸的个数,vector保存到容器中
	Mat pic_RGB, pic_GRAY;
	pic_RGB = img;
	cvtColor(pic_RGB, pic_GRAY, CV_RGB2GRAY);//进行灰度变换
	equalizeHist(pic_GRAY, pic_GRAY);//进行直方图均衡化
	face_cascade.detectMultiScale(pic_GRAY, face_vec, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(10, 10));  //检测数人脸
	if (!face_vec.size())
		cout << "检测不到人脸!" << endl;
	else
		cout << "检测到 " << face_vec.size() << "张人脸!" << endl;
	for (i = 0; i<(int)face_vec.size(); i++)
	{
		Point p1((int)face_vec[i].x, (int)face_vec[i].y);
		Point p2((int)(face_vec[i].x + face_vec[i].width), (int)(face_vec[i].y + face_vec[i].height*1.1));
		rectangle(img, p1, p2, Scalar(255, 0, 0), 1, 8, 0); 
	}                                                                  //矩形框显示出人脸
	//imshow("facedetect_test",pic_RGB);

	//***************ASM特征点匹配*************************************************************************
	if (!face_vec.size())
	{
		cout << "没有检测到人脸,无法ASM特征点匹配" << endl;
		return -1;
	}
	//下面上是ASM模型对人脸中特征点的检测
	asm_shape shape, detshape;
	asmfitting fit_asm;
	if (fit_asm.Read("my68-1d.amf") == false)
	{
		cout << "ASM特征点模版载入失败,退出!" << endl;
		return -1;
	}

	//模版位置初始化
	detshape.Resize(2);
	for (i = 0; i<(int)face_vec.size(); i++)
	{
		detshape[0].x = (float)face_vec[i].x;//face_rect是cvRect型结构体的实体,cvRect结构体的成员为x,y,width,height
		detshape[0].y = (float)face_vec[i].y;
		detshape[1].x = (float)(face_vec[i].x + face_vec[i].width);
		detshape[1].y = (float)(face_vec[i].y + face_vec[i].height);

		InitShapeFromDetBox(shape, detshape, fit_asm.GetMappingDetShape(), fit_asm.GetMeanFaceWidth());//给人脸图像贴上ASM模版
		bool b = fit_asm.ASMSeqSearch(shape, img1, 0, true, 30);//对准人脸特征点

		//提取特征点坐标位置
		//  for(j=0;j<68;j++)
		//  {
		//pt = shape[j];
		//   circle_x=cvRound(pt.x);
		//   circle_y=cvRound(pt.y);
		//   cvCircle( img,cvPoint(circle_x,circle_y), 2, cvScalar(255,0,0),1, 8, 0 );

		//  }
		pt = shape[27];
		circle_x = cvRound(pt.x);
		circle_y = cvRound(pt.y);
		circle(img, cvPoint(circle_x, circle_y), 2, cvScalar(0, 255, 0), 1, 8, 0);
		pt = shape[29];
		circle_x = cvRound(pt.x);
		circle_y = cvRound(pt.y);
		circle(img, cvPoint(circle_x, circle_y), 2, cvScalar(0, 255, 0), 1, 8, 0);
		pt = shape[34];
		circle_x = cvRound(pt.x);
		circle_y = cvRound(pt.y);
		circle(img, cvPoint(circle_x, circle_y), 2, cvScalar(0, 255, 0), 1, 8, 0);
		pt = shape[32];
		circle_x = cvRound(pt.x);
		circle_y = cvRound(pt.y);
		circle(img, cvPoint(circle_x, circle_y), 2, cvScalar(0, 255, 0), 1, 8, 0);

	}

	imshow("facedetect_test", img);
	if (cvWaitKey(0) >= 0)
		return 0;
	return 0;
}
</span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;">
</span>


代码下载地址:

http://download.csdn.net/detail/qq_18343569/9085929

点击打开链接

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值