基于ARM-Linux开发板利用opencv交叉编译的人脸检测

基于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

猜你喜欢

转载自blog.csdn.net/weixin_43793181/article/details/110845973