雪泥鸿爪 发表于 2017-12-30 23:24:56

树莓派基于opencv和百度ai平台的宿舍环境检测系统(二)

本帖最后由 ky123 于 2018-1-31 14:12 编辑

感谢e络盟提供的助赛基金。本帖主要描述百度ai人脸识别的调用
(一)百度ai人脸识别sdk
通过调用百度ai的sdk可以方便地实现高精度的人脸识别,并且可以摆脱树莓派性能的弊端

(二)jsoncpp安装
在更新过的人脸库中调用,即可返回识别结果的json结构,通过jsoncpp库解码可以获得结构的string字符串,因而首先要安装jsoncpp库,debain的系统下apt可以获得:sudo apt-get install libjsoncpp-dev(三)sdk调用的小demo
探索的过程中写了个百度ai人脸识别sdk的小demo:(关于app_id\api_key等私人性的数据用了***代替)#include <QCoreApplication>
#include <face.h>         // 人脸识别交互类
std::string app_id = "*****";
std::string api_key = "******";
std::string secret_key = "******";

aip::Face client(app_id, api_key, secret_key);

//**************hong declear****************
std::string group_id = "group_tinnu";
std::string uid1 = "jie";
std::string user_info1 = "jie_info";

//**************discount****************
Json::Value add_user_one();             //从人脸库中新增用户,可以设定多个用户所在组,及组内用户的人脸图片
Json::Value check_user();               //查询人脸库中某用户的详细信息
Json::Value check_group();            //查询用户组的列表
Json::Value check_all_user_of_group();//查询指定用户组中的用户列表
Json::Value delete_user_in_a_group();   //将用户从某个组中删除,但不会删除用户在其它组的信息

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Json::Value result;

    std::string image;
    aip::get_file_content("frame.jpg", &image);

    // 调用人脸识别
    result = client.identify(group_id, image, aip::null);
    Json::Value middle_num =result["result"]["scores"];
    double num = middle_num.asDouble();

    std::cout << result << std::endl
            << result["result"]["scores"] << std::endl
            << num << std::endl;

    return 0;
}


//**************hanshu****************
Json::Value add_user_one()
{
    Json::Value result;

    std::string image;
    aip::get_file_content("<路径>/face1.jpg", &image);

    // 调用人脸注册
    result = client.user_add(uid1, user_info1, group_id, image, aip::null);

    std::cout << result << std::endl;

    return result;
}

Json::Value check_user()
{
    Json::Value result;

    std::string uid = uid1;

    // 调用用户信息查询
    result = client.user_get(uid, aip::null);

    /*// 如果有可选参数
    std::map<std::string, std::string> options;
    options["group_id"] = "group1";

    // 带参数调用用户信息查询
    result = client.user_get(uid, options);*/

    std::cout << result << std::endl;

    return result;
}

Json::Value check_group()
{
    Json::Value result;

    // 调用组列表查询
    result = client.group_getlist( aip::null);

    // 如果有可选参数
    /*std::map<std::string, std::string> options;
    options["start"] = "0";
    options["end"] = "50";

    // 带参数调用组列表查询
    result = client.group_getlist(, options);*/

    std::cout << result << std::endl;

    return result;
}

Json::Value check_all_user_of_group()
{
    Json::Value result;

    //std::string group_id = "group_try";

    // 调用组内用户列表查询
    result = client.group_getusers(group_id, aip::null);

    /*// 如果有可选参数
    std::map<std::string, std::string> options;
    options["start"] = "0";
    options["end"] = "50";

    // 带参数调用组内用户列表查询
    result = client.group_getusers(group_id, options);*/

    std::cout << result << std::endl;

    return result;
}

//将用户从某个组中删除,但不会删除用户在其它组的信息
Json::Value delete_user_in_a_group()
{
    Json::Value result;

    std::string group_id = "group_try";

    std::string uid = "name_try";

    // 调用组内删除用户
    result = client.group_deleteuser(group_id, uid, aip::null);

    std::cout << result << std::endl;

    return result;
}
pro文件也非常讲究:包含包裹jsoncpp在内的几个库,还有数个头文件以及用c++11编译,至于opencv的库倒是没有用到,不过为了方便后面程序的使用还是加上了。QT += core
QT -= gui

TARGET = face_check
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp \
    opencv_operate.cpp

HEADERS += \
    base/base.h \
    base/base64.h \
    base/http.h \
    base/utils.h \
    other/face.h \
    other/image_censor.h \
    other/image_classify.h \
    other/image_search.h \
    other/kg.h \
    other/nlp.h \
    other/ocr.h \
    other/speech.h \
    opencv_operate.h

LIBS += /usr/local/lib/libopencv_highgui.so \
      /usr/local/lib/libopencv_core.so    \
      /usr/local/lib/libopencv_features2d.so\
      /usr/local/lib/libopencv_calib3d.so \
      /usr/local/lib/libopencv_xfeatures2d.so \
      /usr/local/lib/libopencv_tracking.so    \
      /usr/local/lib/libopencv_videoio.so \
      /usr/local/lib/libopencv_video.so   \
      /usr/local/lib/libopencv_imgproc.so \
      /usr/local/lib/libopencv_ml.so      \
      /usr/local/lib/libopencv_flann.so   \
      /usr/local/lib/libopencv_objdetect.so   \
      /usr/local/lib/libopencv_imgcodecs.so

DISTFILES += \
    other/out_put_message \
    other/README.md



OTHER_FILES += \
    other/README.md

INCLUDEPATH += /usr/local/include   \
                /usr/local/include/opencv   \
                /usr/local/include/opencv2\
                /usr/include/jsoncpp \
                base    \
                other

LIBS += -lcurl -lcrypto -ljsoncpp

CONFIG += c++11

DISTFILES += \
    ../other/README.md \
    other/out_put_message
(四)调用函数
通过sdk中的identify函数可以获得与人脸库对比的结果:void* check( void *ptr )
{
    Json::Value result;

    std::string image;
    aip::get_file_content("frame.jpg", &image);

    // 调用人脸识别
    result = client.identify(group_id, image, aip::null);
    double num = result["result"]["scores"].asDouble();

    std::cout << result << num << std::endl;

    if(num >= 70) check_flag = 1;
    thread_num = 0;

    return ptr;
}由于访问百度ai云端会导致阻塞,因此开辟一个子线程调用是必要的,否则会遗失关键画面://************** pthread ****************
pthread_t thread;
bool thread_num=0;
void* check( void *ptr );

//************** main ****************
int main()
{
    int counter = 0;
    int calcul = 0;

    VideoCapture capture;
    capture.open("/home/tinnu/baidu_ai/face_picture/4***");
    Mat frame;

    while(!check_flag)
    {
      /*VideoCapture结构体,保存图像信息,open()参数为int index(0为默认摄像头),读入摄像头视频,
             *                           open()参数为路径,读入视频文件*/


      //double rate = capture.get(CV_CAP_PROP_FPS); //获取视频文件的帧率
      //int delay = cvRound(1000.000 / rate);       //延时参数

      while(1)
      {
            /*采用>>的方式读入视频*/
            capture >> frame;
            if(frame.empty())
                break;
            if(face_detect(frame))
            {
                std::cout << "people\t" << std::endl;
                counter++;
            }
            else
                counter = 0;

            std::cout << calcul++ << '\t';

            if(counter >= 5)
            {
                counter = 0;
                break;
            }

            /*imshow()在窗口中显示*/
            imshow("read",frame);

            /*WaitKey()控制帧率*/
            //waitKey(1);
      }



      std::cout << "judge";

      imwrite("frame.jpg", frame);   //将image图像保存为my.jpg

      if(!thread_num)
      {
            pthread_create(&thread, NULL, check, NULL);
            thread_num = 1;      //多线程资源占用
      }

    }

    capture.release();
    std::cout << "finish";

    return 0;
}
(五)结果展示

雪泥鸿爪 发表于 2017-12-31 10:27:57

树莓派基于OpenCV的和百度的AI平台的宿舍环境检测系统(一):https://www.cirmall.com/bbs/thread-98485-1-1.html
页: [1]
查看完整版本: 树莓派基于opencv和百度ai平台的宿舍环境检测系统(二)

Baidu
map