中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt怎么實現人臉識別客戶端

發布時間:2021-12-15 10:14:08 來源:億速云 閱讀:273 作者:iii 欄目:互聯網科技

這篇文章主要講解了“Qt怎么實現人臉識別客戶端”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Qt怎么實現人臉識別客戶端”吧!

一、前言

人臉識別客戶端程序,不需要和人臉識別相關的庫在一起,而是通過協議通信來和人臉識別服務端通信交互,人臉識別客戶端和服務端程序框架,主要是為了提供一套通用的框架,按照定好的協議,實現人臉識別的相關處理,很多廠家都會有也都會做類似的機制,以便第三方廠家或者自家的其他設備按照這個通信協議來處理,比如客戶端程序可以在PC機上,也可以是網頁,還可以是安卓客戶端,前端設備比如人工訪客機,訪客機本地是不需要做人臉識別等處理的,而是發送到服務端處理完以后再拿到結果進行展示,這樣就可以利用服務端強大的運算能力。

自定義人臉識別協議功能:

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

  2. 支持多個連接并發,自動排隊處理,返回的時候帶上唯一標識區分。

  3. 傳入單張圖片返回人臉區域。

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

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

  6. 傳入兩張圖片返回比對結果。

  7. 傳入兩個特征值返回比對結果。

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

  9. 指定唯一標識符刪除人臉。

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

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

二、功能特點

  1. 支持的功能包括人臉識別、人臉比對、人臉搜索、活體檢測等。

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

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

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

  5. 每個功能的執行除了返回結果還返回執行用時時間。

  6. 多線程處理,通過type控制當前處理類型。

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

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

  9. 可設置等待處理圖片隊列中的數量。

  10. 每次執行都有成功或者失敗的信號返回。

  11. 人臉搜索的返回結果包含了原圖+最大相似度圖+相似度等。

  12. 人臉比對同時支持兩張圖片和兩個特征值比對。

  13. 相關功能自定義一套協議用于客戶端和服務端,可以通過TCP通信進行交互。

  14. 自定義人臉識別協議非常適用于中心一臺服務器,現場若干設備請求的場景。

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

三、效果圖

Qt怎么實現人臉識別客戶端

四、核心代碼

FaceSdkClient::FaceSdkClient(QObject *parent) : QObject(parent)
{
    isOk = false;
    timeout = 10;
    lastTime = QDateTime::currentDateTime();

    //隨機生成IP用于測試
    clientIP = QString("192.168.1.%1").arg(qrand() % 255);
    serverIP = "192.168.1.239";
    serverPort = 6662;

    //實例化連接對象
    tcpSocket = new QTcpSocket(this);
    connect(tcpSocket, SIGNAL(connected()), this, SLOT(connected()));
    connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(disconnected()));
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readData()));

    //定時器處理數據
    timerData = new QTimer(this);
    connect(timerData, SIGNAL(timeout()), this, SLOT(checkData()));
    timerData->setInterval(100);

    //定時器處理重連
    timerConn = new QTimer(this);
    connect(timerConn, SIGNAL(timeout()), this, SLOT(checkConn()));
    timerConn->setInterval(3000);

    //定時器發送心跳
    timerHeart = new QTimer(this);
    connect(timerHeart, SIGNAL(timeout()), this, SLOT(sendHeart()));
    timerHeart->setInterval(2000);
}

void FaceSdkClient::connected()
{
    isOk = true;
    sendHeart();
}

void FaceSdkClient::disconnected()
{
    isOk = false;
    emit receiveAnaly(serverIP, "服務器斷開");
}

void FaceSdkClient::checkConn()
{
    QDateTime now = QDateTime::currentDateTime();
    if (lastTime.secsTo(now) >= timeout) {
        isOk = false;
        start();
        emit receiveAnaly(serverIP, "重連服務器");
    }
}

void FaceSdkClient::readData()
{
    lastTime = QDateTime::currentDateTime();
    QMutexLocker locker(&mutex);
    buffer.append(tcpSocket->readAll());
}

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

    //逐個取出節點判斷數據
    emit receiveData(serverIP, dom.toString());
    QDomElement element = dom.documentElement();
    if (element.tagName() == "FaceServer") {
        //查找時間字段屬性
        QString nowTime = element.attribute("NowTime");
        QString year, month, day, hour, min, sec;
        DeviceFun::getNowTime(nowTime, year, month, day, hour, min, sec);
        //QUIHelper::setSystemDateTime(year, month, day, hour, min, sec);

        //根據子節點處理
        QDomNode childNode = element.firstChild();
        QString name = childNode.nodeName();
        QString value = element.text();
        //qDebug() << TIMEMS << name << value;

        //取出faceID和耗時
        element = childNode.toElement();
        QString faceID = element.attribute("FaceID");
        int msec = element.attribute("TimeUsed").toInt();

        if (name == "Msg") {
            if (value.startsWith("Init Face Finsh")) {
                emit receiveFaceFeatureFinsh();
            } else if (value.startsWith("Find Face Rect Fail")) {
                emit receiveFaceRectFail(faceID);
            } else if (value.startsWith("Find Face Feature Fail")) {
                emit receiveFaceFeatureFail(faceID);
            } else if (value.startsWith("Find Face Compare Fail")) {
                emit receiveFaceCompareFail(faceID);
            } else if (value.startsWith("Find Face Live Fail")) {
                emit receiveFaceLiveFail(faceID);
            } else if (value.startsWith("Image Size Is Too Large")) {
                emit receiveAnaly(serverIP, "圖片尺寸過大");
            } else {
                emit receiveAnaly(serverIP, value);
            }
        } else if (name == "FaceRect") {
            QStringList list = value.split(",");
            QRect faceRect(list.at(0).toInt(), list.at(1).toInt(), list.at(2).toInt(), list.at(3).toInt());
            emit receiveFaceRect(faceID, faceRect, msec);
        } else if (name == "FaceFeature") {
            QStringList list = value.split("|");
            QList<float> feature;
            for (int i = 0; i < 256; i++) {
                feature << list.at(i).toFloat();
            }

            emit receiveFaceFeature(faceID, feature, msec);
        } else if (name == "FaceLive") {
            float result = element.attribute("Result").toFloat();
            emit receiveFaceLive(faceID, result, msec);
        } else if (name == "FaceCompare") {
            float result = element.attribute("Result").toFloat();
            emit receiveFaceCompare(faceID, result, msec);
        } else if (name == "FaceCompareOne") {
            QStringList list = value.split("|");
            QImage image1 = DeviceFun::getImage(list.at(0));
            QImage image2 = DeviceFun::getImage(list.at(1));
            QString targetName = element.attribute("TargetName");
            float result = element.attribute("Result").toFloat();
            emit receiveFaceCompareOne(faceID, image1, image2, targetName, result, msec);
        } else if (name == "FaceConfig") {
            QString findFast = element.attribute("FindFast");
            QString facePercent = element.attribute("FacePercent");
            QString info = QString("模式: %1  比例: %2").arg(findFast == "true" ? "快速模式" : "正常模式").arg(facePercent);
            emit receiveAnaly(serverIP, "人臉配置  " + info);
        } else {
            emit receiveAnaly(serverIP, "心跳回復");
        }
    }
}

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

void FaceSdkClient::setServerIP(const QString &serverIP)
{
    this->serverIP = serverIP;
}

void FaceSdkClient::setServerPort(int serverPort)
{
    this->serverPort = serverPort;
}

bool FaceSdkClient::start()
{
    tcpSocket->abort();
    tcpSocket->connectToHost(serverIP, serverPort);

    timerData->start();
    timerConn->start();
    timerHeart->start();
    return true;
}

void FaceSdkClient::stop()
{
    tcpSocket->disconnectFromHost();

    timerData->stop();
    timerConn->stop();
    timerHeart->stop();
}

void FaceSdkClient::sendData(const QString &body)
{
    if (!isOk) {
        return;
    }

    //構建xml字符串
    QStringList list;
    list.append(QString("<FaceClient DeviceIP=\"%1\">").arg(clientIP));
    list.append(body);
    list.append("</FaceClient>");

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

void FaceSdkClient::sendHeart()
{
    if (!isOk) {
        return;
    }

    sendData("<DeviceHeart/>");
    emit sendAnaly(clientIP, "發送心跳");
}

void FaceSdkClient::sendFindFace(const QString &faceID, const QImage &image)
{
    if (!isOk) {
        return;
    }

    QString data = QString("<FindFace FaceID=\"%1\">%2</FindFace>").arg(faceID).arg(DeviceFun::getImageData(image));
    sendData(data);
    emit sendAnaly(clientIP, "請求人臉區域");
}

void FaceSdkClient::sendFindFeature(const QString &faceID, const QImage &image)
{
    if (!isOk) {
        return;
    }

    QString data = QString("<FindFeature FaceID=\"%1\">%2</FindFeature>").arg(faceID).arg(DeviceFun::getImageData(image));
    sendData(data);
    emit sendAnaly(clientIP, "請求人臉特征");
}

void FaceSdkClient::sendFindLive(const QString &faceID, const QImage &image)
{
    if (!isOk) {
        return;
    }

    QString data = QString("<FindLive FaceID=\"%1\">%2</FindLive>").arg(faceID).arg(DeviceFun::getImageData(image));
    sendData(data);
    emit sendAnaly(clientIP, "請求活體檢測");
}

void FaceSdkClient::sendCompareByImage(const QString &faceID1, const QImage &image1,
                                       const QString &faceID2, const QImage &image2)
{
    if (!isOk) {
        return;
    }

    QStringList list;
    list.append("<CompareByImage>");
    list.append(QString("<FaceImage1 FaceID=\"%1\">%2</FaceImage1>").arg(faceID1).arg(DeviceFun::getImageData(image1)));
    list.append(QString("<FaceImage2 FaceID=\"%1\">%2</FaceImage2>").arg(faceID2).arg(DeviceFun::getImageData(image2)));
    list.append("</CompareByImage>");

    sendData(list.join(""));
    emit sendAnaly(clientIP, "請求人臉比對");
}

void FaceSdkClient::sendCompareByFeature(const QString &faceID1, const QString &feature1,
        const QString &faceID2, const QString &feature2)
{
    if (!isOk) {
        return;
    }

    QStringList list;
    list.append("<CompareByFeature>");
    list.append(QString("<FaceFeature1 FaceID=\"%1\">%2</FaceFeature1>").arg(faceID1).arg(feature1));
    list.append(QString("<FaceFeature2 FaceID=\"%1\">%2</FaceFeature2>").arg(faceID2).arg(feature2));
    list.append("</CompareByFeature>");

    sendData(list.join(""));
    emit sendAnaly(clientIP, "請求人臉比對");
}

void FaceSdkClient::sendAppendFace(const QString &faceID, const QImage &image)
{
    if (!isOk) {
        return;
    }

    QString data = QString("<AppendFace FaceID=\"%1\">%2</AppendFace>").arg(faceID).arg(DeviceFun::getImageData(image));
    sendData(data);
    emit sendAnaly(clientIP, "添加人臉");
}

void FaceSdkClient::sendDeleteFace(const QString &faceID)
{
    if (!isOk) {
        return;
    }

    QString data = QString("<DeleteFace FaceID=\"%1\" />").arg(faceID);
    sendData(data);
    emit sendAnaly(clientIP, "刪除人臉");
}

void FaceSdkClient::sendFindByImage(const QString &faceID, const QImage &image)
{
    if (!isOk) {
        return;
    }

    QString data = QString("<FindByImage FaceID=\"%1\">%2</FindByImage>").arg(faceID).arg(DeviceFun::getImageData(image));
    sendData(data);
    emit sendAnaly(clientIP, "查找最大人臉");
}

void FaceSdkClient::sendFindByFeature(const QString &faceID, const QString &feature)
{
    if (!isOk) {
        return;
    }

    QString data = QString("<FindByFeature FaceID=\"%1\">%2</FindByFeature>").arg(faceID).arg(feature);
    sendData(data);
    emit sendAnaly(clientIP, "查找最大人臉");
}

感謝各位的閱讀,以上就是“Qt怎么實現人臉識別客戶端”的內容了,經過本文的學習后,相信大家對Qt怎么實現人臉識別客戶端這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

qt
AI

革吉县| 昭觉县| 大荔县| 明星| 勃利县| 蕉岭县| 门源| 武威市| 个旧市| 光泽县| 邯郸县| 马山县| 柏乡县| 东安县| 昭觉县| 石家庄市| 庄浪县| 那坡县| 五常市| 安阳县| 邹城市| 临潭县| 五家渠市| 怀远县| 长泰县| 郎溪县| 衢州市| 名山县| 吉隆县| 宣汉县| 册亨县| 贡山| 甘肃省| 桑植县| 罗源县| 环江| 昭平县| 通河县| 乌苏市| 定兴县| 江华|