色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于EAIDK的人臉算法應用-源碼解讀(2)

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-10 21:14 ? 次閱讀

1 本期內容介紹

上一期介紹了基于EAIDK的人臉算法應用,本期從應用角度,解讀一下該案例源碼。
本期案例源碼解讀,主要從源碼目錄結構、配置文件、模型目錄、源碼流程、重點源碼文件等進行解讀。

本期源碼解讀目標:

1. 讓EAIDK-310開發者對EAIDK-310環境更加熟練
2. 熟悉EAIDK-310人臉識別案例源碼
3. 方便開發者使用vision.sdk的調用流程,為二次開發做指引參考

2 目錄結構介紹

ftp://ftp.eaidk.net/EAIDK310/_Source/eaidk310/_face/_package/獲取源碼包后,直接解壓后得到eaidk310_face_package文件夾,文件夾內容如下圖所示:

eaidk310_face_demo.zip解壓后,源碼包整體目錄結構如下:

doc目錄:指文檔目錄,包含Vision.Face SDK手冊,Vision.Face SDK人臉算法Q&A手冊。其中Vision.Face SDK手冊,詳細介紹了人臉算法的各個API接口,本案例人臉應用調用的接口全部在該文檔中有介紹。

face-sdk目錄:vision.sdk人臉算法庫(libface.so

eaidk310/_face/_demo.zip:eaidk310人臉推廣案例的源代碼包,解壓后的目錄截圖如下:

build-eaidk/_visual/_embedded-Desktop-Debug:編譯目錄和運行目錄,里面有demo運行時必需的文件和目錄,比如配置文件demo.conf,models模型目錄。

eaidk/_visual/_embeded:源碼目錄,案例實現的源代碼都在該目錄下,下文也將重點介紹該目錄下源碼文件。

libs:本案例依賴的vision.sdk人臉庫,內容與上文提到的face-sdk目錄內容一致。

3 配置文件&模型文件

demo.conf,該文件必須在案例程序的運行的當前路徑,已配置好默認的參數,理解即可。

VideoWidth=1280      -->采集視頻圖像的寬
VideoHeight=720      -->采集視頻圖像的高
Scale=1              -->采集視頻圖像的縮放比例
MinFaceSize=40       -->人臉算法的最低像素要求
Clarity=200          -->人臉算法的最低清晰度要求
FaceAngle=0.4        -->人臉算法的最低角度要求
ThresHold=0.7        -->人臉識別的最低閾值要求
UseApi=0             -->人臉算法的調用策略
Dbsize=10000         -->人臉庫的最大存儲人臉數
RegisterMethod=0     -->人臉注冊策略
FacePicturePATH=./models/faces/   -->人臉存儲本地路徑

模型目錄
mfn.tmfile,mobilefacenet人臉識別模型文件
det1,det2,det3.tmfile,人臉檢測模型文件
face_attr.tmfile,人臉屬性模型文件

4 流程介紹及源碼解讀

4.1 實現流程

整體流程結構如下:

4.2 流程與源碼解讀

下面我們對此案例中的重要&核心的代碼內容進行解釋,為讀者提供參考,方便讀者了解vision.sdk算法應用。

4.2.1 mainwindow.cpp

程序從main函數入口,在main中創建顯示窗口,具體顯示內容在mainwindow.cpp中實現。mainwindow.cpp源程序中主要實現2個功能:

    1. UI布局
    2. 圖像采集

mainwindow.cpp源程序包含構造函數、updateImage函數、open_camera函數等重要函數。

4.2.1.1 構造函數

所有對象創建時,都需要初始化才可以使用,而構造函數就是用于給對象進行初始化,在堆內存中開辟出一個空間來存放建立的對象并賦初始值。

    /* connects */
    connect(&theTimer, &QTimer::timeout, this, &MainWindow::updateImage);

    connect(ui->face_attr_2, SIGNAL(clicked(bool)), this, SLOT(convert_to_face_attr()));
    connect(ui->face_rec_2, SIGNAL(clicked(bool)), this, SLOT(convert_to_face_rec()));
    connect(ui->rb_face_track, SIGNAL(clicked(bool)), this, SLOT(convert_to_face_track()));

updateImage,是theTimer對應的槽函數,每隔33ms調用一次,該函數是mainwindow.cpp文件中最重要的函數,它包含圖像的顯示、人臉算法處理結果的顯示。
其他connect均為顯示界面的各個按鈕及其對應槽函數:

    /* regist related */
    connect(ui->regist, SIGNAL(clicked(bool)), this, SLOT(user_regist()));
    connect(ui->cancel, SIGNAL(clicked(bool)), this, SLOT(user_cancel_regist()));
    connect(ui->ok, SIGNAL(clicked(bool)), this, SLOT(user_save_regist()));
    connect(ui->ok_2, SIGNAL(clicked(bool)), this, SLOT(get_user_name()));
    connect(ui->cancel_2, SIGNAL(clicked(bool)), this, SLOT(back_to_face_rec()));
4.2.1.2 updateImage函數

updateimage函數是UI顯示的核心函數,每隔33ms調用1次,填充視頻窗口的區域。

void MainWindow::updateImage()
{
    ui->label_diku->clear();
    ui->label_diku_2->clear();
    cam->videoCapL>>cam->srcImageL;

cam->videoCapL>>cam->srcImageL;該行功能是獲取攝像頭數據并存入srcImageL變量。

updateimage函數下調用了face_rec_enabledface_attr_enabledface_track_enabled等函數

face/_rec/_enabled,表示打開人臉識別功能,該{}內表示人臉識別的代碼處理部分。
人臉識別處理部分:

if(face_rec_enabled)
{
       algThd->setUseApiParams(0);
       algThd->face_rec_label = true;
       cv::resize(cam->srcImageL, ResImg, ResImgSiz, CV_INTER_LINEAR);
       algThd->sendFrame(ResImg, cam->srcImageL);
       Mface face_result = algThd->getFace();

獲取人臉的結果后,line函數對圖像中的人臉畫框,label_diku_2對人臉圖像做show(顯示)處理。

       if(face_result.drawflag && strcmp(face_result.name, "")!=0 && strcmp(face_result.name, "unknown")!=0){
           if(access(facepath, F_OK) < 0)
           {
               printf("%s:%d %s not exist./n", __func__, __LINE__, facepath);
               return;
           }

           int x = face_result.pos[0].x;
           int y = face_result.pos[0].y;
           int w = face_result.pos[0].width;
           int h = face_result.pos[0].height;
           line(cam->srcImageL, cvPoint(x, y), cvPoint(x, y + 20), cvScalar(0, 255, 0, 0), 2);
           line(cam->srcImageL, cvPoint(x, y), cvPoint(x + 20, y), cvScalar(0, 255, 0, 0), 2);

           line(cam->srcImageL, cvPoint(x + w - 20, y), cvPoint(x + w, y), cvScalar(0, 255, 0, 0), 2);
           line(cam->srcImageL, cvPoint(x + w, y), cvPoint(x + w, y + 20), cvScalar(0, 255, 0, 0), 2);

           line(cam->srcImageL, cvPoint(x, y + h), cvPoint(x + 20, y + h), cvScalar(0, 255, 0, 0), 2);
           line(cam->srcImageL, cvPoint(x, y + h), cvPoint(x, y + h - 20), cvScalar(0, 255, 0, 0), 2);

           line(cam->srcImageL, cvPoint(x + w, y + h), cvPoint(x + w, y + h - 20), cvScalar(0, 255, 0, 0), 2);
           line(cam->srcImageL, cvPoint(x + w, y + h), cvPoint(x + w - 20, y + h), cvScalar(0, 255, 0, 0), 2);

           Mat diku = cv::imread(facepath);
           cvtColor(diku, diku, CV_BGR2RGB);
           QImage imagel = QImage((uchar*)(diku.data), diku.cols, diku.rows, QImage::Format_RGB888);
           ui->label_diku->setPixmap(QPixmap::fromImage(imagel));
           ui->label_diku->resize(imagel.size());
           ui->label_diku->show();

           cv::Mat realtime_face;
           cam->srcImageL(Rect(face_result.pos[0].x, face_result.pos[0].y, face_result.pos[0].width, face_result.pos[0].height)).copyTo(realtime_face);
           cvtColor(realtime_face, realtime_face, CV_BGR2RGB);
           cv::resize(realtime_face, realtime_face, Size(120, 120), CV_INTER_LINEAR);
           QImage imagel2 = QImage((uchar*)(realtime_face.data), realtime_face.cols, realtime_face.rows, realtime_face.cols*realtime_face.channels(), QImage::Format_RGB888);
           ui->label_diku_2->setPixmap(QPixmap::fromImage(imagel2));
           ui->label_diku_2->resize(imagel2.size());
           ui->label_diku_2->show();

face_attr/enabled,表示打開人臉屬性功能,該{}內是人臉屬性演示的代碼部分。
人臉屬性處理部分:

else if(face_attr_enabled)
{
       algThd->setUseApiParams(1);

       cv::resize(cam->srcImageL, ResImg, ResImgSiz, CV_INTER_LINEAR);
       algThd->sendFrame(ResImg, cam->srcImageL);
       Mface face_result = algThd->getFace();

face/_track/_enabled,表示打開人臉跟蹤功能,該{}內是人臉跟蹤的處理部分。
人臉跟蹤處理部分:

else if(face_track_enabled)
{
       algThd->setUseApiParams(6);

       cv::resize(cam->srcImageL, ResImg, ResImgSiz, CV_INTER_LINEAR);
       algThd->Tracker(ResImg,cam->srcImageL);
       cv::resize(cam->srcImageL, ResImg, ResImgSiz, CV_INTER_LINEAR);
       algThd->sendFrame(ResImg, cam->srcImageL);
       Mface face_result = algThd->getFace();

上面人臉識別、人臉屬性、人臉跟蹤的處理部分都用到了setUseApiParams()sendFrame()getFace()函數:

setUseApiParams(),設置算法處理策略,0表示做人臉識別功能,1表示做人臉屬性功能,6表示做人臉跟蹤功能;
sendFrame(),將采集到的圖像發送到算法線程進行處理;
getFace(),獲取返回的人臉數據。當mainwindow采集圖象時,調用sendFrame()函數,把采集到的數據傳送給循環處理的線程,并通過getFace()函數獲取結果并顯示。
4.2.1.3 open_camera函數

open_camera是用來采集USB攝像頭視頻的函數,獲取的圖像用來輸入給人臉算法函數。其中參數0表示USB攝像頭的設備節點(/dev/video0),當該節點不存在或者非usb攝像頭設備時,采集圖像會失敗。

if(cam->videoCapL.open(0))
{
    cam->srcImageL = Mat::zeros(cam->videoCapL.get(CV_CAP_PROP_FRAME_HEIGHT), cam->videoCapL.get(CV_CAP_PROP_FRAME_WIDTH), CV_8UC3);
    theTimer.start(33);
}

4.2.2 AlgThread.cpp

mainwindow類的構造函數中,line131創建人臉算法處理的對象algThd,并調用start()函數開啟人臉處理線程,其內容的實現在AlgThread.cpp中。人臉算法的流程是輸入圖像、深度學習類型人臉算法處理、返回結果、窗口顯示。

    ConfigParam param;
    LoadConfig(param,false);

    algThd = new AlgThread(param);
    algThd->start();
    ResImgSiz = cv::Size(NORMAL_FRAME_W, NORMAL_FRAME_H);

AlgThread.cpp源程序包含線程函數run,來實現人臉跟蹤/人臉檢測/特征值提取/人臉特征值比對/人臉注冊等核心功能。

4.2.2.1 線程函數run

線程函數run()是一個while(1)循環函數,param.useapi為0時表示人臉識別,為1時表示人臉屬性,為6時表示人臉跟蹤。

void AlgThread::run()
{
    static unsigned long long tv_start, tv_end,t0,t1;
    float feature0[FEATURE_SIZE];
    float feature1[FEATURE_SIZE];
    float score;

    for (int i=0;i lck(m_mtx_reg);
        getframe(mat);
        getSrcframe(grayframe);
        if (mat.empty()) continue;
        int face_recognize_return_value = FaceRecognize(mat,grayframe,0);;++i)>

其他重要的函數如下,用黃色背景標注:
FaceRecognize,人臉識別函數
GetFeature,獲取特征值函數,提取檢測到的人臉的特征值
Register,人臉注冊,特征值存入數據庫函數
CompareFaceDB,人臉比對函數

        int face_recognize_return_value = FaceRecognize(mat,grayframe,0);

        if(0x0b == param.useapi)//liveness do not need compare feature
        {
            continue;
        }
        printf("%s %d face_recognize_return_value:%d/n", __FUNCTION__, __LINE__, face_recognize_return_value);
        if(face_recognize_return_value != SUCCESS){
            printf("%s %d face_recognize fail.../n", __FUNCTION__, __LINE__);
            t0=tv_start;
            if (param.useapi==2) {
                //gettimeofday(&tv_end, NULL);
                //tv_end = get_ms();
                //m_fps = (float)1000.0 /(tv_end.tv_sec * 1000 + tv_end.tv_usec / 1000 - tv_start.tv_sec * 1000 - tv_start.tv_usec / 1000);
            }
            continue;
        }
        else
        {
            printf("%s %d face_recognize success.../n", __FUNCTION__, __LINE__);
        }
        if(1 == param.useapi)
        {
            continue;
        }
        ret=faceapp::GetFeature(mFace,feature1,&res);
        if (ret!=SUCCESS) {
            printf("%s %d get feature fail..../n", __FUNCTION__, __LINE__);
            t0=tv_start;
            if(ret==ERROR_BAD_QUALITY)
                m_face.nam;
            continue;
        }

        if(regist_label){
            Register(mat, feature1, (char*)reg_name.c_str());
            regist_label = false;
            reg_name = "";
        }

        if(face_rec_label){
            ret = CompareFaceDB(feature1);

vision.sdk的使用,流程是初始化->人臉檢測->人臉特征值提取->人臉注冊->人臉比對函數使用,如上函數調用順序基本也是vision.sdk的調用順序:

5 總結

該案例解讀文檔主要主要從源碼目錄結構、源碼簡要流程、重點源碼函數幾個方面進行了解讀和介紹,并按照功能實現流程順序,介紹了基于EAIDK的人臉識別案例源碼中的重要函數及其實現的功能,并貼出實際使用代碼,方便開發者理解,為開發者進行二次開發提供參考。

審核編輯 黃昊宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4622

    瀏覽量

    93060
  • 人臉識別
    +關注

    關注

    76

    文章

    4012

    瀏覽量

    82033
  • 深度學習
    +關注

    關注

    73

    文章

    5507

    瀏覽量

    121298
收藏 人收藏

    評論

    相關推薦

    ElfBoard開源項目|百度智能云平臺的人臉識別項目

    百度智能云平臺的人臉識別項目,旨在利用其強大的人臉識別服務實現自動人臉識別。選擇百度智能云的原因是其高效的API接口和穩定的服務質量,能夠幫助開發者快速實現人臉識別應用。 本項目使用
    的頭像 發表于 12-24 10:54 ?394次閱讀
    ElfBoard開源項目|百度智能云平臺<b class='flag-5'>的人臉</b>識別項目

    如何選擇合適的人臉門禁系統?人臉打卡門禁哪款好?

    在當今這個智能化、高效化的時代,辦公場所的安全與管理效率成為了企業不可忽視的重要環節。隨著人臉識別技術的日益成熟,人臉門禁系統因其獨特的優勢,逐漸成為眾多辦公寫字樓出入口管理的首選方案。本文將探討人臉
    的頭像 發表于 12-17 15:19 ?151次閱讀
    如何選擇合適<b class='flag-5'>的人臉</b>門禁系統?<b class='flag-5'>人臉</b>打卡門禁哪款好?

    FacenetPytorch人臉識別方案--基于米爾全志T527開發板

    算法實現人臉識別深度神經網絡1.簡介 Facenet-PyTorch 是一個基于 PyTorch 框架實現的人臉識別庫。它提供了 FaceNet 模型的 PyTorch 實現,可以用于訓練自己
    發表于 11-28 15:57

    FacenetPytorch人臉識別方案--基于米爾全志T527開發板

    、facenet_pytorch算法實現人臉識別深度神經網絡1.簡介Facenet-PyTorch是一個基于PyTorch框架實現的人臉識別庫。它提供了FaceNet模型的PyTorc
    的頭像 發表于 11-28 15:12 ?353次閱讀
    FacenetPytorch<b class='flag-5'>人臉</b>識別方案--基于米爾全志T527開發板

    【「從算法到電路—數字芯片算法的電路實現」閱讀體驗】+內容簡介

    內容簡介這是一本深入解讀基礎算法及其電路設計,以打通算法研發到數字IC設計的實現屏障,以及指導芯片設計工程師從底層掌握復雜電路設計與優化方法為目標的專業技術書。任何芯片(如WiFi芯片、5G芯片
    發表于 11-21 17:14

    《DNK210使用指南 -CanMV版 V1.0》第四十五章 人臉識別實驗

    與先前錄入的人臉特征進行對比,如果得分高于閾值,則能成功識別人臉,最后將識別結果同原始圖像在LCD上進行顯示。2. 按下KEY0按鍵可以錄入當前人臉的特征。45.2.2 硬件資源本章實
    發表于 11-18 14:30

    如何用OpenCV的相機捕捉視頻進行人臉檢測--基于米爾NXP i.MX93開發板

    : breakvideo.release()cv2.destroyAllWindows() 保存后執行”python3 opencv_test.py OpenCV裝好后,可以為后面的人臉檢測提供可行性。 要實現人臉識別
    發表于 11-15 17:58

    隧道人臉識別門禁系統應用于隧道工程等場所的智能化安全管理系統

    一、系統組成 ? 1、人臉識別設備 高清攝像頭:能夠清晰捕捉人員的面部圖像,即使在光線較暗的隧道環境中也能有效識別。 識別算法:采用先進的人臉識別算法,快速準確地識別人員身份,誤識率低
    的頭像 發表于 09-04 16:38 ?423次閱讀
    隧道<b class='flag-5'>人臉</b>識別門禁系統應用于隧道工程等場所的智能化安全管理系統

    基于FPGA的人臉識別技術

    基于FPGA(現場可編程邏輯門陣列)的人臉識別技術,是一種結合了高效并行處理能力和靈活可編程性的先進圖像處理解決方案。這種技術在安全監控、身份認證、人機交互等領域具有廣泛應用前景。以下將詳細介紹基于FPGA的人臉識別技術,包括其基本原理、系統構成、
    的頭像 發表于 07-17 11:42 ?1517次閱讀

    基于OpenCV的人臉識別系統設計

    基于OpenCV的人臉識別系統是一個復雜但功能強大的系統,廣泛應用于安全監控、人機交互、智能家居等多個領域。下面將詳細介紹基于OpenCV的人臉識別系統的基本原理、實現步驟,并附上具體的代碼示例。
    的頭像 發表于 07-11 15:37 ?1.2w次閱讀

    卷積神經網絡在人臉識別中的應用

    人臉識別技術作為人工智能領域的一個重要分支,近年來取得了顯著的發展。其核心在于通過計算機對人臉圖像進行特征提取和識別,從而實現自動的人臉身份確認。隨著深度學習技術的興起,特別是卷積神經網絡
    的頭像 發表于 07-08 10:48 ?783次閱讀

    人臉識別模型訓練是什么意思

    人臉識別模型訓練是指通過大量的人臉數據,使用機器學習或深度學習算法,訓練出一個能夠識別和分類人臉的模型。這個模型可以應用于各種場景,如安防監控、身份認證、社交媒體等。下面將介紹
    的頭像 發表于 07-04 09:16 ?647次閱讀

    人臉檢測模型有哪些

    : Viola-Jones 算法 Viola-Jones 算法是一種基于 Haar 特征和 AdaBoost 算法的人臉檢測方法。它通過訓練一個級聯分類器來實現
    的頭像 發表于 07-03 17:05 ?1082次閱讀

    如何挑選理想的人臉識別考勤系統產品?人臉識別設備的選型

    如何挑選理想的人臉識別考勤系統產品?在挑選理想的人臉識別考勤系統產品時,需要綜合考慮多個方面,包括但不限于設備的性能、兼容性、數據存儲能力、環境適應性以及售后服務等因素。以下是根據提供的搜索結果
    的頭像 發表于 06-05 14:59 ?511次閱讀
    如何挑選理想<b class='flag-5'>的人臉</b>識別考勤系統產品?<b class='flag-5'>人臉</b>識別設備的選型

    人臉識別技術的原理是什么 人臉識別技術的特點有哪些

    人臉識別技術的原理 人臉識別技術是一種通過計算機以圖像或視頻為輸入,識別、檢測、跟蹤和分析人臉的技術。其原理基于計算機視覺和模式識別等領域的理論和算法。下面將詳細介紹
    的頭像 發表于 02-18 13:52 ?1998次閱讀
    主站蜘蛛池模板: 国产综合在线观看| 男人插女人动态图| 日日噜噜夜夜狠狠视频| 公和我做好爽添厨房中文字幕| 色噜噜狠狠一区二区三区| 国产精品一区第二页| 又黄又粗又爽免费观看| 欧美videos人牛交| 国产精品成人影院在线观看| 亚洲欧美一区二区三区四区| 奶大B紧17p| 国产人成无码视频在线观看| 中文无码字慕在线观看| 色综合久久天天影视网| 久久妇女高潮几次MBA| 被窝伦理电影午夜| 亚洲人成网站在线播放| 欧美一区二区视频97色伦| 国产色青青视频在线观看| 最近免费中文MV在线字幕| 日本无卡无吗在线| 久久精品视频在线看15| 俄罗斯bbbb| 中文字幕在线观看亚洲视频| 手机看片国产免费| 久久综合电影| 国产精品久久久久影院| 99手机在线视频| 亚洲字幕在线观看| 色小姐电影qvod播放| 久久夜色撩人精品国产| 国产精品嫩草影院在线观看免费 | 日本在线免费播放| 韩国女人高潮嗷嗷叫视频| 99久久国产露脸精品国产麻豆 | 四虎国产精品永久免费入口| 久久视频这有精品63在线国产| 国产传媒18精品免费1区| 最近中文字幕在线看免费完整版| 十分钟在线观看免费视频高清WWW| 老头扒开粉缝亲我下面|