您好,登錄后才能下訂單哦!
本篇內容主要講解“Qt怎么實現人臉識別離線版”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Qt怎么實現人臉識別離線版”吧!
本篇文章采用的百度離線SDK作為解決方案。可以去官網申請,默認有6個免費的密鑰使用三個月,需要與本地設備的指紋信息匹配,感興趣的同學可以自行去官網下載SDK。百度離線人臉識別SDK文件比較大,光模型文件就645MB,估計這也許是識別率比較高的一方面原因吧,不斷訓練得出的模型庫,本篇文章只放出Qt封裝部分源碼。官網對應的使用說明還是非常詳細的,只要是學過編程的人就可以看懂。
處理流程:
實例化BaiduFaceApi類,調用sdk_init初始化。
調用is_auth判斷授權是否成功,成功了才能繼續。
設置最小人臉比例(set_min_face_size)、光照閾值(set_illum_thr)等參數。
調用track_max_face函數獲取人臉區域。
調用rgb_liveness_check函數進行活體檢測。
調用get_face_feature函數提取特征值。
調用compare_feature函數進行人臉比對。
百度人臉識別在線版和離線版SDK的封裝:
離線版要求支持C++11的編譯器,而且必須為MSVC。不支持mingw編譯器。
在線版中的密鑰等信息,務必記得換成自己申請的。
離線版本只能在windows上使用。
離線版本需要自己申請密鑰。找到facebaidusdk文件夾下的LicenseTool.exe,填寫后臺離線SDK管理中申請到的序列號,單擊激活按鈕。
離線版本對應的動態庫和模型文件自行從官網下載。
如果源碼包中有facebaidusdk+face-resource文件夾則說明帶了動態庫和模型庫文件夾,只需要將facebaidusdk文件夾下的所有文件復制到可執行文件同一目錄,face-resource文件夾復制到可執行文件夾目錄同等級目錄即可。目錄位置見snap文件夾下的示例圖。
facebaidusdk目錄下的TestFaceApi.exe為百度提供的測試程序,先要將USB攝像頭插到電腦上,會實時找人臉框。
支持的功能包括人臉識別、人臉比對、人臉搜索、活體檢測等。
在線版還支持身份證、駕駛證、行駛證、銀行卡等識別。
在線版的協議支持百度、曠視,離線版的支持百度,可定制。
除了支持X86架構,還支持嵌入式linux比如contex-A9、樹莓派等。
每個功能的執行除了返回結果還返回執行用時時間。
多線程處理,通過type控制當前處理類型。
支持單張圖片檢索相似度最高的圖片。
支持指定目錄圖片用來生成人臉特征值文件。
可設置等待處理圖片隊列中的數量。
每次執行都有成功或者失敗的信號返回。
人臉搜索的返回結果包含了原圖+最大相似度圖+相似度等。
人臉比對同時支持兩張圖片和兩個特征值比對。
相關功能自定義一套協議用于客戶端和服務端,可以通過TCP通信進行交互。
自定義人臉識別協議非常適用于中心一臺服務器,現場若干設備請求的場景。
每個模塊全部是獨立的一個類,代碼整潔、注釋完善。
void FaceLocalBaiDu::init() { //如果已經正常則無需初始化 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 { //設置最小人臉,默認30 api->set_min_face_size(percent); //設置光照閾值,默認40 api->set_illum_thr(20); //設置角度閾值,默認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); //過濾非法的值 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; }
到此,相信大家對“Qt怎么實現人臉識別離線版”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。