這篇文章主要講解了“Qt怎么實現(xiàn)人臉識別客戶端”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Qt怎么實現(xiàn)人臉識別客戶端”吧!
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、做網(wǎng)站服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)綏江免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
人臉識別客戶端程序,不需要和人臉識別相關(guān)的庫在一起,而是通過協(xié)議通信來和人臉識別服務(wù)端通信交互,人臉識別客戶端和服務(wù)端程序框架,主要是為了提供一套通用的框架,按照定好的協(xié)議,實現(xiàn)人臉識別的相關(guān)處理,很多廠家都會有也都會做類似的機制,以便第三方廠家或者自家的其他設(shè)備按照這個通信協(xié)議來處理,比如客戶端程序可以在PC機上,也可以是網(wǎng)頁,還可以是安卓客戶端,前端設(shè)備比如人工訪客機,訪客機本地是不需要做人臉識別等處理的,而是發(fā)送到服務(wù)端處理完以后再拿到結(jié)果進行展示,這樣就可以利用服務(wù)端強大的運算能力。
自定義人臉識別協(xié)議功能:
離線使用,同時支持百度的離線包和嵌入式linux人臉識別靜態(tài)庫。
支持多個連接并發(fā),自動排隊處理,返回的時候帶上唯一標(biāo)識區(qū)分。
傳入單張圖片返回人臉區(qū)域。
傳入單張圖片返回人臉特征值。
傳入單張圖片或者多張圖片返回是否是活體。
傳入兩張圖片返回比對結(jié)果。
傳入兩個特征值返回比對結(jié)果。
傳入單張圖片添加人臉。
指定唯一標(biāo)識符刪除人臉。
傳入單張照片返回相似度最大的人臉信息。
修改人臉服務(wù)的配置參數(shù)比如是否快速查找、人臉占比等。
支持的功能包括人臉識別、人臉比對、人臉?biāo)阉鳌⒒铙w檢測等。
在線版還支持身份證、駕駛證、行駛證、銀行卡等識別。
在線版的協(xié)議支持百度、曠視,離線版的支持百度,可定制。
除了支持X86架構(gòu),還支持嵌入式linux比如contex-A9、樹莓派等。
每個功能的執(zhí)行除了返回結(jié)果還返回執(zhí)行用時時間。
多線程處理,通過type控制當(dāng)前處理類型。
支持單張圖片檢索相似度最高的圖片。
支持指定目錄圖片用來生成人臉特征值文件。
可設(shè)置等待處理圖片隊列中的數(shù)量。
每次執(zhí)行都有成功或者失敗的信號返回。
人臉?biāo)阉鞯姆祷亟Y(jié)果包含了原圖+最大相似度圖+相似度等。
人臉比對同時支持兩張圖片和兩個特征值比對。
相關(guān)功能自定義一套協(xié)議用于客戶端和服務(wù)端,可以通過TCP通信進行交互。
自定義人臉識別協(xié)議非常適用于中心一臺服務(wù)器,現(xiàn)場若干設(shè)備請求的場景。
每個模塊全部是獨立的一個類,代碼整潔、注釋完善。
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())); //定時器處理數(shù)據(jù) 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); //定時器發(fā)送心跳 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, "服務(wù)器斷開"); } void FaceSdkClient::checkConn() { QDateTime now = QDateTime::currentDateTime(); if (lastTime.secsTo(now) >= timeout) { isOk = false; start(); emit receiveAnaly(serverIP, "重連服務(wù)器"); } } 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; } //逐個取出節(jié)點判斷數(shù)據(jù) 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); //根據(jù)子節(jié)點處理 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, "心跳回復(fù)"); } } } 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; } //構(gòu)建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, "發(fā)送心跳"); } 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, "請求人臉區(qū)域"); } 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怎么實現(xiàn)人臉識別客戶端”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Qt怎么實現(xiàn)人臉識別客戶端這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
網(wǎng)站欄目:Qt怎么實現(xiàn)人臉識別客戶端
文章出自:http://chinadenli.net/article42/jieehc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、定制網(wǎng)站、網(wǎng)站設(shè)計公司、手機網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、品牌網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)