Fetch the repository succeeded.
This action will force synchronization from eezprince/Hand, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
#include "facerecognizerstrategy.h"
#include <QDebug>
FaceRecognizerStrategy::FaceRecognizerStrategy()
{
m_cascade.load("lbpcascade_frontalface.xml");
//m_nestedCascade.load("haarcascade_eye_tree_eyeglasses.xml");
m_nestedCascade.load("haarcascade_eye.xml");
m_scale = 2.0;
}
FaceRecognizerStrategy::~FaceRecognizerStrategy()
{
}
Mat FaceRecognizerStrategy::detect(Mat img)
{
int i = 0;
double t = 0;
//建立用于存放人脸的向量容器
vector<Rect> faces;
//定义一些颜色,用来标示不同的人脸
const static Scalar colors[] = { CV_RGB(0,0,255),
CV_RGB(0,128,255),
CV_RGB(0,255,255),
CV_RGB(0,255,0),
CV_RGB(255,128,0),
CV_RGB(255,255,0),
CV_RGB(255,0,0),
CV_RGB(255,0,255)} ;
//建立缩小的图片,加快检测速度
//nt cvRound (double value) 对一个double型的数进行四舍五入,并返回一个整型数!
Mat gray, smallImg( cvRound (img.rows/m_scale), cvRound(img.cols/m_scale), CV_8UC1 );
//转成灰度图像,Harr特征基于灰度图
cvtColor( img, gray, CV_BGR2GRAY );
//改变图像大小,使用双线性差值
resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
//变换后的图像进行直方图均值化处理
equalizeHist( smallImg, smallImg );
//程序开始和结束插入此函数获取时间,经过计算求得算法执行时间
t = (double)cvGetTickCount();
//检测人脸
//detectMultiScale函数中smallImg表示的是要检测的输入图像为smallImg,faces表示检测到的人脸目标序列,1.1表示
//每次图像尺寸减小的比例为1.1,2表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大
//小都可以检测到人脸),CV_HAAR_SCALE_IMAGE表示不是缩放分类器来检测,而是缩放图像,Size(30, 30)为目标的
//最小最大尺寸
m_cascade.detectMultiScale( smallImg, faces,
1.1, 3, 0
//|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
|CV_HAAR_SCALE_IMAGE
,
Size(30, 30));
t = (double)cvGetTickCount() - t;
qDebug( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
{
Mat smallImgROI;
vector<Rect> nestedObjects;
Point center;
Scalar color = colors[i%8];
int radius;
double aspect_ratio = (double)r->width/r->height;
if( 0.75 < aspect_ratio && aspect_ratio < 1.3 )
{
//标示人脸时在缩小之前的图像上标示,所以这里根据缩放比例换算回去
center.x = cvRound((r->x + r->width*0.5)*m_scale);
center.y = cvRound((r->y + r->height*0.5)*m_scale);
radius = cvRound((r->width + r->height)*0.25*m_scale);
circle( img, center, radius, color, 3, 8, 0 );
}
else
rectangle( img, cvPoint(cvRound(r->x*m_scale), cvRound(r->y*m_scale)),
cvPoint(cvRound((r->x + r->width-1)*m_scale), cvRound((r->y + r->height-1)*m_scale)),
color, 3, 8, 0);
if( m_nestedCascade.empty() )
continue;
smallImgROI = smallImg(*r);
//同样方法检测人眼
qDebug("finding");
m_nestedCascade.detectMultiScale( smallImgROI, nestedObjects,
1.1, 2, 0
//|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
//|CV_HAAR_DO_CANNY_PRUNING
|CV_HAAR_SCALE_IMAGE
,
Size(10, 10) );
for( vector<Rect>::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ )
{
qDebug("find eyes");
center.x = cvRound((r->x + nr->x + nr->width*0.5)*m_scale);
center.y = cvRound((r->y + nr->y + nr->height*0.5)*m_scale);
radius = cvRound((nr->width + nr->height)*0.25*m_scale);
circle( img, center, radius, color, 3, 8, 0 );
}
}
return img;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。