溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Qt怎么實(shí)現(xiàn)人臉識(shí)別離線版

發(fā)布時(shí)間:2021-12-15 10:14:56 來(lái)源:億速云 閱讀:247 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“Qt怎么實(shí)現(xiàn)人臉識(shí)別離線版”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Qt怎么實(shí)現(xiàn)人臉識(shí)別離線版”吧!

一、前言

本篇文章采用的百度離線SDK作為解決方案??梢匀ス倬W(wǎng)申請(qǐng),默認(rèn)有6個(gè)免費(fèi)的密鑰使用三個(gè)月,需要與本地設(shè)備的指紋信息匹配,感興趣的同學(xué)可以自行去官網(wǎng)下載SDK。百度離線人臉識(shí)別SDK文件比較大,光模型文件就645MB,估計(jì)這也許是識(shí)別率比較高的一方面原因吧,不斷訓(xùn)練得出的模型庫(kù),本篇文章只放出Qt封裝部分源碼。官網(wǎng)對(duì)應(yīng)的使用說(shuō)明還是非常詳細(xì)的,只要是學(xué)過(guò)編程的人就可以看懂。

處理流程:

  1. 實(shí)例化BaiduFaceApi類,調(diào)用sdk_init初始化。

  2. 調(diào)用is_auth判斷授權(quán)是否成功,成功了才能繼續(xù)。

  3. 設(shè)置最小人臉比例(set_min_face_size)、光照閾值(set_illum_thr)等參數(shù)。

  4. 調(diào)用track_max_face函數(shù)獲取人臉區(qū)域。

  5. 調(diào)用rgb_liveness_check函數(shù)進(jìn)行活體檢測(cè)。

  6. 調(diào)用get_face_feature函數(shù)提取特征值。

  7. 調(diào)用compare_feature函數(shù)進(jìn)行人臉比對(duì)。

百度人臉識(shí)別在線版和離線版SDK的封裝:

  1. 離線版要求支持C++11的編譯器,而且必須為MSVC。不支持mingw編譯器。

  2. 在線版中的密鑰等信息,務(wù)必記得換成自己申請(qǐng)的。

  3. 離線版本只能在windows上使用。

  4. 離線版本需要自己申請(qǐng)密鑰。找到facebaidusdk文件夾下的LicenseTool.exe,填寫后臺(tái)離線SDK管理中申請(qǐng)到的序列號(hào),單擊激活按鈕。

  5. 離線版本對(duì)應(yīng)的動(dòng)態(tài)庫(kù)和模型文件自行從官網(wǎng)下載。

  6. 如果源碼包中有facebaidusdk+face-resource文件夾則說(shuō)明帶了動(dòng)態(tài)庫(kù)和模型庫(kù)文件夾,只需要將facebaidusdk文件夾下的所有文件復(fù)制到可執(zhí)行文件同一目錄,face-resource文件夾復(fù)制到可執(zhí)行文件夾目錄同等級(jí)目錄即可。目錄位置見(jiàn)snap文件夾下的示例圖。

  7. facebaidusdk目錄下的TestFaceApi.exe為百度提供的測(cè)試程序,先要將USB攝像頭插到電腦上,會(huì)實(shí)時(shí)找人臉框。

二、功能特點(diǎn)

  1. 支持的功能包括人臉識(shí)別、人臉比對(duì)、人臉?biāo)阉鳌⒒铙w檢測(cè)等。

  2. 在線版還支持身份證、駕駛證、行駛證、銀行卡等識(shí)別。

  3. 在線版的協(xié)議支持百度、曠視,離線版的支持百度,可定制。

  4. 除了支持X86架構(gòu),還支持嵌入式linux比如contex-A9、樹(shù)莓派等。

  5. 每個(gè)功能的執(zhí)行除了返回結(jié)果還返回執(zhí)行用時(shí)時(shí)間。

  6. 多線程處理,通過(guò)type控制當(dāng)前處理類型。

  7. 支持單張圖片檢索相似度最高的圖片。

  8. 支持指定目錄圖片用來(lái)生成人臉特征值文件。

  9. 可設(shè)置等待處理圖片隊(duì)列中的數(shù)量。

  10. 每次執(zhí)行都有成功或者失敗的信號(hào)返回。

  11. 人臉?biāo)阉鞯姆祷亟Y(jié)果包含了原圖+最大相似度圖+相似度等。

  12. 人臉比對(duì)同時(shí)支持兩張圖片和兩個(gè)特征值比對(duì)。

  13. 相關(guān)功能自定義一套協(xié)議用于客戶端和服務(wù)端,可以通過(guò)TCP通信進(jìn)行交互。

  14. 自定義人臉識(shí)別協(xié)議非常適用于中心一臺(tái)服務(wù)器,現(xiàn)場(chǎng)若干設(shè)備請(qǐng)求的場(chǎng)景。

  15. 每個(gè)模塊全部是獨(dú)立的一個(gè)類,代碼整潔、注釋完善。

三、效果圖

Qt怎么實(shí)現(xiàn)人臉識(shí)別離線版

四、核心代碼

void FaceLocalBaiDu::init()
{
    //如果已經(jīng)正常則無(wú)需初始化
    if (isOk) {
        return;
    }

    int res = api->sdk_init();
    res = api->is_auth();
    if (res != 1) {
        qDebug() << TIMEMS << QString("init sdk error: %1").arg(res);
    } else {
        //設(shè)置最小人臉,默認(rèn)30
        api->set_min_face_size(percent);
        //設(shè)置光照閾值,默認(rèn)40
        api->set_illum_thr(20);
        //設(shè)置角度閾值,默認(rèn)15
        //api->set_eulur_angle_thr(30, 30, 30);
        isOk = true;
        qDebug() << TIMEMS << "init sdk ok";
    }

    emit sdkInitFinsh(isOk);
}

bool FaceLocalBaiDu::getFaceRect(const QString &flag, const QImage &img, QRect &rect, int &msec)
{
    //qDebug() << TIMEMS << flag << "getFaceRect";

    QTime time;
    if (countTime) {
        time.start();
    }

    faces->clear();
    QByteArray imageData = FaceHelper::getImageData(img);
    int result = api->track_max_face(faces, imageData.constData(), 1);

    if (result == 1) {
        TrackFaceInfo info = faces->at(0);
        FaceInfo ibox = info.box;
        float width = ibox.mWidth;
        float x = ibox.mCenter_x;
        float y = ibox.mCenter_y;
        rect = QRect(x - width / 2, y - width / 2, width, width);
        msec = getTime(time);
        return true;
    }

    return false;
}

bool FaceLocalBaiDu::getFaceLive(const QString &flag, const QImage &img, float &result, int &msec)
{
    //qDebug() << TIMEMS << flag << "getFaceLive";

    QTime time;
    if (countTime) {
        time.start();
    }

    result = 0;
    QByteArray imageData = FaceHelper::getImageData(img);
    std::string value = api->rgb_liveness_check(imageData.constData(), 1);

    QString data = value.c_str();
    data = data.replace("\t", "");
    data = data.replace("\"", "");
    data = data.replace(" ", "");

    int index = -1;
    QStringList list = data.split("\n");
    foreach (QString str, list) {
        index = str.indexOf("score:");
        if (index >= 0) {
            result = str.mid(6, 4).toFloat();
            break;
        }
    }

    if (index >= 0) {
        msec = getTime(time);
        return true;
    }

    return false;
}

bool FaceLocalBaiDu::getFaceFeature(const QString &flag, const QImage &img, QList<float> &feature, int &msec)
{
    //qDebug() << TIMEMS << flag << "getFaceFeature" << img.width() << img.height() << img.size();

    QTime time;
    if (countTime) {
        time.start();
    }

    const float *fea = nullptr;
    QByteArray imageData = FaceHelper::getImageData(img);
    int result = api->get_face_feature(imageData.constData(), 1, fea);

    if (result == 512) {
        feature.clear();
        for (int i = 0; i < 512; i++) {
            feature.append(fea[i]);
        }

        msec = getTime(time);
        return true;
    }

    return false;
}

float FaceLocalBaiDu::getFaceCompare(const QString &flag, const QList<float> &feature1, const QList<float> &feature2)
{
    //qDebug() << TIMEMS << flag << "getFaceCompareXXX";

    std::vector<float> fea1, fea2;
    for (int i = 0; i < 512; i++) {
        fea1.push_back(feature1.at(i));
        fea2.push_back(feature2.at(i));
    }

    float result = api->compare_feature(fea1, fea2);
    //過(guò)濾非法的值
    result = result > 100 ? 0 : result;
    return result;
}

bool FaceLocalBaiDu::getFaceCompare(const QString &flag, const QImage &img1, const QImage &img2, float &result, int &msec)
{
    //qDebug() << TIMEMS << flag << "getFaceCompare";

    result = 0;
    bool ok1, ok2;
    QList<float> feature1, feature2;
    int msec1, msec2;
    QString flag1, flag2;
    if (flag.contains("|")) {
        QStringList list = flag.split("|");
        flag1 = list.at(0);
        flag2 = list.at(1);
    } else {
        flag1 = flag;
        flag2 = flag;
    }

    QTime time;
    if (countTime) {
        time.start();
    }

    ok1 = getFaceFeature(flag1, img1, feature1, msec1);
    if (ok1) {
        emit receiveFaceFeature(flag1, feature1, msec1);
    }

    ok2 = getFaceFeature(flag2, img2, feature2, msec2);
    if (ok2) {
        emit receiveFaceFeature(flag2, feature2, msec2);
    }

    if (ok1 && ok2) {
        result = getFaceCompare(flag, feature1, feature2);
        msec = getTime(time);
        return true;
    }

    return false;
}

到此,相信大家對(duì)“Qt怎么實(shí)現(xiàn)人臉識(shí)別離線版”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

qt
AI