LinkSVP例子之六:机器视觉基础演示,利用NNIE性能进行人脸识别

背景

    参见LinkSVP例子之一背景介绍。

LinkSVP简介

    参见LinkSVP例子之一LinkSVP介绍。

FaceRecognition人脸识别示例

该示例程序演示了在3519A、3559A平台上如何利用NNIE性能进行人脸识别。
该项目包括主程序、网页、模型数据、人脸数据、rpc通信等环节,是一个完整的人脸识别工程示例。

准备工作

  • 参照用户手册搭建开发环境、编译LinkSVP工程、配置网络启动参数。
  • 连接好镜头、对焦,放置到适合采集人脸的位置
  • 将评估板的HDMI-OUT接显示器(支持1080P即可,程序默认输出1080P60)。
  • 上电,运行Face目录
  • 运行FaceDetectRecognition程序
  • 打开浏览器,访问开发板ip
  • 登陆,账号密码均为admin
  • 进入高级功能>人脸识别
  • 采集阶段需要保持画面中只有一个人脸,进行多角度采集
  • 每个角度取不同的命名,比如正脸XX-0,左转15度XX-1,抬头15度XX-2之类的
  • 随后可以在界面上看到识别结果
  • 识别阶段可以多人,但是需要距离镜头较近才能识别

运行结果

在这里插入图片描述

完整工程

完整工程参见:https://gitee.com/LinkPi/LinkSVP/tree/master/FaceRecognition

主要源代码

main.cpp

#include <QCoreApplication>
#include "Link.h"
#include "Worker.h"
#include "maiaXmlRpcServer.h"

int main(int argc, char *argv[])
{
    
    
    QCoreApplication a(argc, argv);
    Link::init();

    Worker worker;
    worker.init();

    MaiaXmlRpcServer *rpcServer;

    rpcServer = new MaiaXmlRpcServer(8080);
    rpcServer->addMethod("addFace", &worker, "addFace");
    rpcServer->addMethod("faceBox", &worker, "faceBox");

    return a.exec();
}

Worker.cpp

#include "Worker.h"

Worker::Worker(QObject *parent) : QObject(parent)
{
    
    

}

void Worker::init()
{
    
    
    input=Link::create("InputIsp");
    input->start();

    detect=Link::create("FaceDetect");
    detect->start();

    recognition=Link::create("FaceRecognition");
    recognition->start();

    crop=Link::create("Crop");
    crop->start();

    encV=Link::create("EncodeV");
    QVariantMap dataEnc;
    dataEnc["width"]=1920;
    dataEnc["height"]=1080;
    dataEnc["bitrate"]=4096;
    dataEnc["rcmode"]="avbr";
    encV->start(dataEnc);

    mux=Link::create("Mux");
    QVariantMap dataMux;
    dataMux["path"]="rtmp://127.0.0.1/live/test";
    dataMux["mute"]=true;
    mux->start(dataMux);

    vo=Link::create("OutputVo");
    vo->start();

    input->linkV(detect);
    input->linkV(encV)->linkV(mux);
    input->linkV(recognition)->linkV(vo);
    detect->linkE(recognition);

    connect(recognition,SIGNAL(newEvent(QString,QVariant)),this,SLOT(onNewEvent(QString,QVariant)));
}

bool Worker::addFace(QString name)
{
    
    
    recognition->invoke("addFace",name);
    return true;
}

QVariantList Worker::faceBox()
{
    
    
    return faceList;
}

void Worker::onNewEvent(QString type, QVariant info)
{
    
    
    if(type=="face")
    {
    
    
        faceList=info.toList();
//        qDebug()<<faceList;
    }
}

Guess you like

Origin blog.csdn.net/weixin_45326556/article/details/102968579