基于ARM-Linux开发板的人脸检测,通过opencv的人脸模型,对人脸检测并框出,再输出显示到开发板上。开发板获取摄像头图像需要通过V4L2获取。
运行结果:
部分代码如下:
void MyThreadCamera::get_image(QImage image) //V4L2获取的图像
{
QPixmap map = QPixmap::fromImage(image); //将QImage转为QPixmap
map = map.scaled(ui->label->size()); //图像适应窗口大小
ui->label->setPixmap(map); //显示
if(count==100) //当count为100时,才进行一次识别
{
count = 0; //count置0
if( !face_cascade.load( face_cascade_name ) ){
qDebug()<<("Face_Cascade Error loading\n"); }; //加载人脸检测模型
if( !eyes_cascade.load( eyes_cascade_name ) ){
qDebug()<<("Eyes_Cascade Error loading\n"); }; //加载人眼检测模型
vector<Rect> faces;
frame = Mat(image.height(),image.width(),CV_8UC3,(void *)image.bits(),image.bytesPerLine()); //通过QImage构造Mat
cvtColor( frame, frame_gray, COLOR_BGR2GRAY ); //转为灰度图
equalizeHist( frame_gray, frame_gray );
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30) ); //识别
flag = 0;
//检测出人脸
for(uint i=0; i < faces.size(); i++) //识别成功
{
flag = 1; //识别成功标志位置1
qDebug()<<"Recognition Succeed";
Rect feceRect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
rectangle(frame, feceRect, Scalar(0,0,255), 2, LINE_AA); //框出人脸
QImage img=QImage((const unsigned char*)(frame.data),frame.cols,frame.rows,frame.step,QImage::Format_RGB888);
map = QPixmap::fromImage(img);
ui->label_success->setPixmap(map); //框出人脸后显示
}
if(flag == 0) //识别成功标志位置0
{
qDebug()<<"Recognition Failed"; //识别成功截图显示框清空
ui->label_success->clear();
}
}
count++;
}
detectMultiScale函数参数意义:
1.image表示的是要检测的输入图像
2.objects表示检测到的人脸目标序列
3.scaleFactor表示每次图像尺寸减小的比例
4. minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),
5.minSize为目标的最小尺寸
6.minSize为目标的最大尺寸
完整工程代码:https://download.csdn.net/download/weixin_43793181/13508133