午夜无码人妻aⅴ大片色欲张津瑜,国产69久久久欧美黑人A片,色妺妺视频网,久久久久国产综合AV天堂

Qt怎么實(shí)現(xiàn)人臉識(shí)別服務(wù)端

這篇文章主要介紹“Qt怎么實(shí)現(xiàn)人臉識(shí)別服務(wù)端”,在日常操作中,相信很多人在Qt怎么實(shí)現(xiàn)人臉識(shí)別服務(wù)端問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Qt怎么實(shí)現(xiàn)人臉識(shí)別服務(wù)端”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)公司是一家專業(yè)提供色尼企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、H5頁面制作、小程序制作等業(yè)務(wù)。10年已為色尼眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。

一、前言

自定義人臉識(shí)別協(xié)議采用的是tcp通信協(xié)議,其實(shí)也可以改成http協(xié)議,這也是大部分廠家的做法,畢竟現(xiàn)在http post非常流行,通用性好,返回個(gè)json數(shù)據(jù)非常規(guī)范,本程序目前采用的tcp協(xié)議是為了兼容以前的舊的系統(tǒng),畢竟之前的系統(tǒng)都是按照那個(gè)格式定義的,推翻重來那之前寫過的很多設(shè)備的程序都需要更改,一個(gè)人肯定忙不過來,而且之前的程序也是經(jīng)過大量的現(xiàn)場應(yīng)用檢驗(yàn)過的,非常穩(wěn)定,一旦改動(dòng)程序的話有需要很長時(shí)間的磨合測試。

自定義人臉識(shí)別協(xié)議功能:

  1. 離線使用,同時(shí)支持百度的離線包和嵌入式linux人臉識(shí)別靜態(tài)庫。

  2. 支持多個(gè)連接并發(fā),自動(dòng)排隊(duì)處理,返回的時(shí)候帶上唯一標(biāo)識(shí)區(qū)分。

  3. 傳入單張圖片返回人臉區(qū)域。

  4. 傳入單張圖片返回人臉特征值。

  5. 傳入單張圖片或者多張圖片返回是否是活體。

  6. 傳入兩張圖片返回比對結(jié)果。

  7. 傳入兩個(gè)特征值返回比對結(jié)果。

  8. 傳入單張圖片添加人臉。

  9. 指定唯一標(biāo)識(shí)符刪除人臉。

  10. 傳入單張照片返回相似度最大的人臉信息。

  11. 修改人臉服務(wù)的配置參數(shù)比如是否快速查找、人臉占比等。

二、功能特點(diǎn)

  1. 支持的功能包括人臉識(shí)別、人臉比對、人臉?biāo)阉?、活體檢測等。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

三、效果圖

Qt怎么實(shí)現(xiàn)人臉識(shí)別服務(wù)端

四、核心代碼

void FaceSdkSocket::checkData()
{
    QMutexLocker locker(&mutex);
    QDomDocument dom;
    if (!DeviceFun::getReceiveXmlData(buffer, dom, "IFACE:", 10)) {
        return;
    }

    //逐個(gè)取出節(jié)點(diǎn)判斷數(shù)據(jù)
    emit receiveData(clientIP, dom.toString());
    QDomElement element = dom.documentElement();
    if (element.tagName() == "FaceClient") {
        QString deviceIP = element.attribute("DeviceIP");
        QDomNode childNode = element.firstChild();
        QString name = childNode.nodeName();
        QString value = element.text();
        //qDebug() << TIMEMS << name << value;

        if (name == "DeviceHeart") {
            sendOk();
            emit receiveAnaly(deviceIP, "設(shè)備心跳");
        } else if (name == "FindFace") {
            element = childNode.toElement();
            value = element.text();
            if (value.length() == 0) {
                return;
            }

            //用連接的描述符加上用戶傳入的描述符組合,方便接收處判斷發(fā)送給那個(gè)連接
            QString faceID = element.attribute("FaceID");
            QString flag = QString("%1_%2").arg(this->socketDescriptor()).arg(faceID);
            QImage image = DeviceFun::getImage(value);
            checkImage(image);
            emit receiveAnaly(deviceIP, "請求人臉區(qū)域");

            //發(fā)送到人臉識(shí)別線程處理
#ifdef facelocal
            FaceLocalBaiDu::Instance()->setType(0);
            FaceLocalBaiDu::Instance()->append(flag, image);
#elif facearm
            FaceLocalArm::Instance()->setType(0);
            FaceLocalArm::Instance()->append(flag, image);
#endif
        } else if (name == "FindFeature") {
            element = childNode.toElement();
            value = element.text();
            if (value.length() == 0) {
                return;
            }

            //用連接的描述符加上用戶傳入的描述符組合,方便接收處判斷發(fā)送給那個(gè)連接
            QString faceID = element.attribute("FaceID");
            QString flag = QString("%1_%2").arg(this->socketDescriptor()).arg(faceID);
            QImage image = DeviceFun::getImage(value);
            checkImage(image);
            emit receiveAnaly(deviceIP, "請求人臉特征");

            //發(fā)送到人臉識(shí)別線程處理
#ifdef facelocal
            FaceLocalBaiDu::Instance()->setType(1);
            FaceLocalBaiDu::Instance()->append(flag, image);
#elif facearm
            FaceLocalArm::Instance()->setType(1);
            FaceLocalArm::Instance()->append(flag, image);
#endif
        } else if (name == "FindLive") {
            element = childNode.toElement();
            value = element.text();
            if (value.length() == 0) {
                return;
            }

            //用連接的描述符加上用戶傳入的描述符組合,方便接收處判斷發(fā)送給那個(gè)連接
            QString faceID = element.attribute("FaceID");
            QString flag = QString("%1_%2").arg(this->socketDescriptor()).arg(faceID);
            QImage image = DeviceFun::getImage(value);
            checkImage(image);
            emit receiveAnaly(deviceIP, "請求活體檢測");

            //發(fā)送到人臉識(shí)別線程處理
#ifdef facelocal
            FaceLocalBaiDu::Instance()->setType(5);
            FaceLocalBaiDu::Instance()->append(flag, image);
#endif
        } else if (name == "CompareByImage") {
            //取出子節(jié)點(diǎn)
            QDomNodeList nodeList = childNode.childNodes();
            int nodeCount = nodeList.count();
            if (nodeCount == 2) {
                QString faceID1, faceID2;
                QImage faceImage1, faceImage2;
                for (int i = 0; i < nodeCount; i++) {
                    childNode = nodeList.at(i);
                    element = childNode.toElement();
                    name = childNode.nodeName();
                    value = element.text();

                    if (name == "FaceImage1") {
                        faceID1 = element.attribute("FaceID");
                        faceImage1 = DeviceFun::getImage(value);
                    } else if (name == "FaceImage2") {
                        faceID2 = element.attribute("FaceID");
                        faceImage2 = DeviceFun::getImage(value);
                    }
                }

                checkImage(faceImage1);
                checkImage(faceImage2);

                QString flag1 = QString("%1_%2").arg(this->socketDescriptor()).arg(faceID1);
                QString flag2 = QString("%1_%2").arg(this->socketDescriptor()).arg(faceID2);
                emit receiveAnaly(deviceIP, "請求人臉照片比對");

                //發(fā)送到人臉識(shí)別線程處理
#ifdef facelocal
                FaceLocalBaiDu::Instance()->setType(2);
                FaceLocalBaiDu::Instance()->append(flag1 + "|" + flag2, faceImage1, faceImage2);
#elif facearm
                FaceLocalArm::Instance()->setType(2);
                FaceLocalArm::Instance()->append(flag1 + "|" + flag2, faceImage1, faceImage2);
#endif
            }
        } else if (name == "CompareByFeature") {
            element = childNode.toElement();
            QString faceID = element.attribute("FaceID");

            //取出子節(jié)點(diǎn)
            QDomNodeList nodeList = childNode.childNodes();
            int nodeCount = nodeList.count();
            if (nodeCount == 2) {
                QStringList faceFeature1, faceFeature2;
                for (int i = 0; i < nodeCount; i++) {
                    childNode = nodeList.at(i);
                    element = childNode.toElement();
                    name = childNode.nodeName();
                    value = element.text();

                    if (name == "FaceFeature1") {
                        faceFeature1 = value.split("|");
                    } else if (name == "FaceFeature2") {
                        faceFeature2 = value.split("|");
                    }
                }

                emit receiveAnaly(deviceIP, "請求人臉特征比對");

                //特征比對速度非???忽略不計(jì),立即比對并將結(jié)果返回
                int count1 = faceFeature1.count();
                int count2 = faceFeature2.count();
                if (count1 != 256 || count2 != 256) {
                    sendMsg("faceFeature count != 256");
                    return;
                }

                QList<float> feature1, feature2;
                for (int i = 0; i < 256; i++) {
                    feature1 << faceFeature1.at(i).toFloat();
                    feature2 << faceFeature2.at(i).toFloat();
                }

#ifdef facelocal
                float result = FaceLocalBaiDu::Instance()->getFaceCompare(faceID, feature1, feature2);
                sendFaceCompare(faceID, result, 1);
#elif facearm
                float result = FaceLocalArm::Instance()->getFaceCompare(faceID, feature1, feature2);
                sendFaceCompare(faceID, result, 1);
#endif
            }
        } else if (name == "AppendFace") {
            element = childNode.toElement();
            value = element.text();
            if (value.length() == 0) {
                return;
            }

            //用連接的描述符加上用戶傳入的描述符組合,方便接收處判斷發(fā)送給那個(gè)連接
            QString faceID = element.attribute("FaceID");
            QString flag = QString("%1_%2").arg(this->socketDescriptor()).arg(faceID);
            QImage image = DeviceFun::getImage(value);
            checkImage(image);
            emit receiveAnaly(deviceIP, "添加人臉");

            //發(fā)送到人臉識(shí)別線程處理
            QString file = QString("%1/%2.txt").arg(FACEPATH).arg(faceID);
#ifdef facelocal
            FaceLocalBaiDu::Instance()->appendFace(flag, image, file);
#elif facearm
            FaceLocalArm::Instance()->appendFace(flag, image, file);
#endif
        } else if (name == "DeleteFace") {
            element = childNode.toElement();
            value = element.text();
            if (value.length() == 0) {
                return;
            }

            //用連接的描述符加上用戶傳入的描述符組合,方便接收處判斷發(fā)送給那個(gè)連接
            QString faceID = element.attribute("FaceID");
            emit receiveAnaly(deviceIP, "刪除人臉");

            //發(fā)送到人臉識(shí)別線程處理
#ifdef facelocal
            FaceLocalBaiDu::Instance()->deleteFace(faceID);
#elif facearm
            FaceLocalArm::Instance()->deleteFace(faceID);
#endif
            sendOk();
        } else if (name == "FindByImage") {
            element = childNode.toElement();
            value = element.text();
            if (value.length() == 0) {
                return;
            }

            //用連接的描述符加上用戶傳入的描述符組合,方便接收處判斷發(fā)送給那個(gè)連接
            QString faceID = element.attribute("FaceID");
            QString flag = QString("%1_%2").arg(this->socketDescriptor()).arg(faceID);
            QImage image = DeviceFun::getImage(value);
            checkImage(image);
            emit receiveAnaly(deviceIP, "根據(jù)圖片查找人臉");

            //發(fā)送到人臉識(shí)別線程處理
#ifdef facelocal
            FaceLocalBaiDu::Instance()->setOneImg(flag, image);
#elif facearm
            FaceLocalArm::Instance()->setOneImg(flag, image);
#endif
        } else if (name == "FindByFeature") {
            element = childNode.toElement();
            value = element.text();
            if (value.length() == 0) {
                return;
            }

            //用連接的描述符加上用戶傳入的描述符組合,方便接收處判斷發(fā)送給那個(gè)連接
            QString faceID = element.attribute("FaceID");
            QStringList faceFeature = value.split("|");
            emit receiveAnaly(deviceIP, "根據(jù)特征查找人臉");

            int count = faceFeature.count();
            if (count != 256) {
                return;
            }

            QList<float> feature;
            for (int i = 0; i < 256; i++) {
                feature << faceFeature.at(i).toFloat();
            }

            //比對速度很快,立即比對并返回結(jié)果
            QString targetName;
            float result;
            int msec;
#ifdef facelocal
            FaceLocalBaiDu::Instance()->getFaceOne(faceID, feature, targetName, result, msec);
#elif facearm
            FaceLocalArm::Instance()->getFaceOne(faceID, feature, targetName, result, msec);
#endif
            if (!targetName.isEmpty()) {
                QString imageFile = QString("%1/%2").arg(FACEPATH).arg(targetName);
                sendFaceCompareOne(faceID, QImage(), QImage(imageFile), targetName, result, msec);
            }
        } else if (name == "UpdateConfig") {
            element = childNode.toElement();
            emit receiveAnaly(deviceIP, "修改人臉配置");

            bool findFast = (element.attribute("FindFast") == "true" ? true : false);
            int facePercent = element.attribute("FacePercent").toInt();
#ifdef facelocal
            FaceLocalBaiDu::Instance()->setFindFast(findFast);
            FaceLocalBaiDu::Instance()->setPercent(facePercent);
#elif facearm
            FaceLocalArm::Instance()->setFindFast(findFast);
            FaceLocalArm::Instance()->setPercent(facePercent);
#endif
            //立即回復(fù)
            sendFaceConfig(findFast, facePercent);
            emit configChanged(findFast, facePercent);
        }
    }
}

void FaceSdkSocket::checkImage(const QImage &image)
{
    //如果照片寬高過大則發(fā)出提示到客戶端
    if (image.width() >= 1280 || image.height() >= 720) {
        sendMsg("Image Size Is Too Large");
    }
}

void FaceSdkSocket::setClientIP(const QString &clientIP)
{
    this->clientIP = clientIP;
}

QString FaceSdkSocket::getClientIP()
{
    return this->clientIP;
}

void FaceSdkSocket::sendData(const QString &body)
{
    //構(gòu)建xml字符串
    QStringList list;
    list.append(QString("<FaceServer TargetIP=\"%1\" NowTime=\"%2\">").arg(clientIP).arg(DATETIME));
    list.append(body);
    list.append("</FaceServer>");

    QString data = DeviceFun::getSendXmlData(list.join(""), "IFACE:");
    this->write(data.toUtf8());
    emit sendData(clientIP, data);
}

void FaceSdkSocket::sendOk()
{
    sendData("");
    emit sendAnaly(clientIP, "心跳應(yīng)答");
}

void FaceSdkSocket::sendMsg(const QString &msg)
{
    sendData(QString("<Msg>%1</Msg>").arg(msg));
    emit sendAnaly(clientIP, "提示信息");
}

void FaceSdkSocket::sendFaceRect(const QString &faceID, const QString &faceRect, int msec)
{
    QString data = QString("<FaceRect FaceID=\"%1\" TimeUsed=\"%3\">%2</FaceRect>")
                   .arg(faceID).arg(faceRect).arg(msec);
    sendData(data);
    emit sendAnaly(clientIP, "返回人臉區(qū)域");
}

void FaceSdkSocket::sendFaceFeature(const QString &faceID, const QString &faceFeature, int msec)
{
    QString data = QString("<FaceFeature FaceID=\"%1\" TimeUsed=\"%3\">%2</FaceFeature>")
                   .arg(faceID).arg(faceFeature).arg(msec);
    sendData(data);
    emit sendAnaly(clientIP, "返回人臉特征");
}

void FaceSdkSocket::sendFaceCompare(const QString &faceID, float result, int msec)
{
    QString data = QString("<FaceCompare FaceID=\"%1\" TimeUsed=\"%3\" Result=\"%2\" />")
                   .arg(faceID).arg(result).arg(msec);
    sendData(data);
    emit sendAnaly(clientIP, "返回人臉比對結(jié)果");
}

void FaceSdkSocket::sendFaceCompareOne(const QString &faceID, const QImage &sourceImage, const QImage &targetImage, const QString &targetName, float result, int msec)
{
    QString data = QString("<FaceCompareOne FaceID=\"%1\" TimeUsed=\"%6\" Result=\"%2\" TargetName=\"%3\">%4|%5</FaceCompareOne>")
                   .arg(faceID).arg(result).arg(targetName).arg(DeviceFun::getImageData(sourceImage)).arg(DeviceFun::getImageData(targetImage)).arg(msec);
    sendData(data);
    emit sendAnaly(clientIP, "返回最相似人臉");
}

到此,關(guān)于“Qt怎么實(shí)現(xiàn)人臉識(shí)別服務(wù)端”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

分享文章:Qt怎么實(shí)現(xiàn)人臉識(shí)別服務(wù)端
本文來源:http://www.ekvhdxd.cn/article36/pdcosg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、Google軟件開發(fā)、虛擬主機(jī)品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營