• C++ 语言学习 day15 复习 (7)


    linux 上面:

    操作步骤:
    1. 

    2.找到 share 这个文件夹

    3.找到 opencv  这个文件夹

    4.

     

    1.今天学习的摄像头 识别 人脸( 独立开一个窗口) ,

    mian.cpp

    1. #include <iostream>
    2. #include "opencv2/core/core.hpp" /* 编译的时候 -lopencv_core 连接到core核心库*/
    3. #include "opencv2/highgui/highgui.hpp" /* 编译的时候 -lopencv_highgui  连接到highgui图像处理库*/
    4. #include "opencv2/imgproc/imgproc.hpp" /* 编译的时候 -lopencv_imgproc  连接到imgproc图像处理库*/
    5. #include "opencv2/video/video.hpp" /* 编译的时候 -lopencv_video 连接到video摄像头 */
    6. #include "opencv2/objdetect/objdetect.hpp" /* 编译的时候 -lopencv_objdetect 连接到objdetect级联处理 */
    7. //#include "aip-cpp-sdk-0.8.1/face.h" /* 引入百度云人脸识别 */
    8. using namespace cv; /** 引入命名空间 **/
    9. using namespace std;/** 引入标准库 **/
    10. //using namespace aip; /*引入百度SDK命名空间*/
    11. bool flag = false;
    12. int main()
    13. {
    14. VideoCapture cap(0); /*创建一个摄像头对象 0号摄像头*/
    15. if(!cap.isOpened()) return -1;/*打开摄像头*/
    16. Mat frame, edges; /* 建立图像对象 */
    17. namedWindow("edges",1); /* 生成一个窗体名为 edges */
    18. /****** 1.创建级联类对象 ******/
    19. CascadeClassifier Classifier("haarcascades/haarcascade_frontalface_alt2.xml");
    20. std::vector<cv::Rect> objects; /*矩形容器*/
    21. Mat MatFace; /*图像截取后存放*/
    22. vector<uchar> buf; /*转码后存放的图片*/
    23. namedWindow("MatFace",1); /* 生成一个窗体名为 MatFace */
    24. for(;;)
    25. {
    26. cap >> frame; /* 拍照 */
    27. edges = frame;
    28. //cvtColor(frame, edges, CV_BGR2GRAY); //灰度处理
    29. /***** 2.人脸检测 *****/
    30. Classifier.detectMultiScale(edges,objects); /* 算法 -> 算力 -> 时间复杂度 */
    31. cout << "检测到:" << objects.size() << "人脸" << endl;
    32. /***** 3.绘制矩形 *****/
    33. for(int i = 0; i < objects.size() ;i++)
    34. {
    35. rectangle(edges,objects[i],Scalar(0,255,255)); /** 绘制矩形框 **/
    36. }
    37. /***** 4.绘制文字 *****/
    38. putText(edges,"WangTinghu",Point(30,30),FONT_HERSHEY_DUPLEX,1,Scalar(0,255,0));
    39. /***** 5.图像截取 ******/
    40. for(int i = 0; i < objects.size() ;i++)
    41. {
    42. MatFace = edges(objects[i]); /* 截取图片 *
    43. imshow("MatFace", MatFace); /*现实截取画面,使用图像对象 edges */
    44. }
    45. imshow("edges", edges); /*现实画面,使用图像对象 edges */
    46. if(waitKey(30) >= 0) break; /*延时 30毫秒 */
    47. }
    48. return 0;
    49. }

    makefile 

    1. #编译方式
    2. CC = g++
    3. #源码文件
    4. SOURCES = main.cpp
    5. #编译标志
    6. CONFIG = -g
    7. CONFIG += -lopencv_highgui
    8. CONFIG += -lopencv_core
    9. CONFIG += -lopencv_video
    10. CONFIG += -lopencv_objdetect
    11. CONFIG += -lopencv_imgproc
    12. #百度库需要C++11版本支持
    13. CONFIG += -std=c++11
    14. #头文件
    15. HEADERS =
    16. #应用名称
    17. APP = a.out
    18. #编译
    19. ${APP}:${SOURCES}
    20. ${CC} $^ ${CONFIG} -o $@
    21. #伪操作:删除
    22. clean:
    23. rm -rf ${APP}


    2.百度云,上进行人脸识别操作

    预备操作

    这个包是:aip-cpp-sdk-0.8.1,  把这个包解压,放到你的linux 运行程序的文件夹下面,

    (资源里面)

    然后再  linux  上面输入这些命令:   (编译运行程序的时候要保证,设备打开,USB 为 3.1)

    1. 下载 curl 库 :sudo apt-get install libcurl-dev
    2. "由于 curl 库很多,我们选择openssl的" : sudo apt-get install libcurl4-openssl-dev
    3. 下载 openssl 库 :sudo apt-get install openssl
    4. 下载 jsoncpp 库 :sudo apt-get install libjsoncpp-dev

    还有一些问题,自己上百度搜索!!!


    1.首先百度云的账号 (人脸识别  开始有一年的免费使用  )

    地址:  d百度智能云-登录

    2.领取福利

     这个的地址: 


    3.创建对比库!!!

     

     

     

    main.cpp

    1. #include <iostream>
    2. #include "opencv2/core/core.hpp" /* 编译的时候 -lopencv_core 连接到core核心库*/
    3. #include "opencv2/highgui/highgui.hpp" /* 编译的时候 -lopencv_highgui  连接到highgui图像处理库*/
    4. #include "opencv2/imgproc/imgproc.hpp" /* 编译的时候 -lopencv_imgproc  连接到imgproc图像处理库*/
    5. #include "opencv2/video/video.hpp" /* 编译的时候 -lopencv_video 连接到video摄像头 */
    6. #include "opencv2/objdetect/objdetect.hpp" /* 编译的时候 -lopencv_objdetect 连接到objdetect级联处理 */
    7. #include "aip-cpp-sdk-0.8.1/face.h" /* 引入百度云人脸识别 */
    8. using namespace cv; /** 引入命名空间 **/
    9. using namespace std;/** 引入标准库 **/
    10. using namespace aip; /*引入百度SDK命名空间*/
    11. /***** 1.关联的知识 *****
    12. * 1.软件库SDK的概念
    13. * 2.JSON数据传输概念(明天)
    14. * *********************/
    15. /****** 百度对接函数 *******/
    16. Json::Value Baidu(vector<uchar> &buf)
    17. {
    18. // 设置APPID/AK/SK
    19. std::string app_id = "287";//写自己的
    20. std::string api_key = "Xu10NdF";
    21. std::string secret_key = "u1mHDy9De";
    22. // 实例化百度客户端对象
    23. aip::Face client(app_id, api_key, secret_key);
    24. /**** BASE64转码 ****/
    25. std::string image = base64_encode((char *)buf.data(),buf.size());
    26. std::string image_type = "BASE64";
    27. std::string group_id_list = "Student";
    28. // 调用人脸搜索
    29. return client.search(image, image_type, group_id_list, aip::null);
    30. }
    31. Json::Value Baidu_Register(vector<uchar> &buf,string group,string user)
    32. {
    33. // 设置APPID/AK/SK
    34. std::string app_id = "28765";
    35. std::string api_key = "Xu10NdQ4F5zH";
    36. std::string secret_key = "u1mHD7jtzyI93D9De";
    37. // 实例化百度客户端对象
    38. aip::Face client(app_id, api_key, secret_key);
    39. /**** BASE64转码 ****/
    40. std::string image = base64_encode((char *)buf.data(),buf.size());
    41. std::string image_type = "BASE64";
    42. std::string group_id = group;
    43. std::string user_id = user;
    44. // 调用人脸注册
    45. return client.user_add(image, image_type, group_id, user_id, aip::null);
    46. }
    47. bool flag = false;
    48. int main()
    49. {
    50. VideoCapture cap(0); /*创建一个摄像头对象 0号摄像头*/
    51. if(!cap.isOpened()) return -1;/*打开摄像头*/
    52. Mat frame, edges; /* 建立图像对象 */
    53. namedWindow("edges",1); /* 生成一个窗体名为 edges */
    54. /****** 1.创建级联类对象 ******/
    55. CascadeClassifier Classifier("haarcascades/haarcascade_frontalface_alt2.xml");
    56. std::vector<cv::Rect> objects; /*矩形容器*/
    57. Mat MatFace; /*图像截取后存放*/
    58. vector<uchar> buf; /*转码后存放的图片*/
    59. namedWindow("MatFace",1); /* 生成一个窗体名为 MatFace */
    60. for(;;)
    61. {
    62. cap >> frame; /* 拍照 */
    63. edges = frame;
    64. //cvtColor(frame, edges, CV_BGR2GRAY); //灰度处理
    65. /***** 2.人脸检测 *****/
    66. Classifier.detectMultiScale(edges,objects); /* 算法 -> 算力 -> 时间复杂度 */
    67. cout << "检测到:" << objects.size() << "人脸" << endl;
    68. /***** 3.绘制矩形 *****/
    69. for(int i = 0; i < objects.size() ;i++)
    70. {
    71. rectangle(edges,objects[i],Scalar(0,255,255)); /** 绘制矩形框 **/
    72. }
    73. /***** 4.绘制文字 *****/
    74. putText(edges,"Gongwei",Point(30,30),FONT_HERSHEY_DUPLEX,1,Scalar(0,255,0));
    75. /***** 5.图像截取 ******/
    76. for(int i = 0; i < objects.size() ;i++)
    77. {
    78. MatFace = edges(objects[i]); /* 截取图片 */
    79. imencode(".jpg",MatFace,buf); /*转码为.jpg格式*/
    80. //imwrite("MatFace.jpg",MatFace); /*保存到本地*/
    81. Json::Value json_value = Baidu(buf);
    82. //cout << "百度的返回值:\n" << json_value << endl;
    83. if(json_value["error_msg"] == "SUCCESS")
    84. {
    85. //cout << "user_list" << json_value["result"]["user_list"] << endl;
    86. cout << "组:" << json_value["result"]["user_list"][0]["group_id"] << endl;
    87. cout << "用户:" << json_value["result"]["user_list"][0]["user_id"] << endl;
    88. cout << "匹配度:" << json_value["result"]["user_list"][0]["score"] << endl;
    89. }
    90. // if(flag == false)
    91. // {
    92. // cout << "注册结果:" << Baidu_Register(buf,"Student","PanDan") << endl;
    93. // flag = true;
    94. // }
    95. imshow("MatFace", MatFace); /*现实截取画面,使用图像对象 edges */
    96. }
    97. imshow("edges", edges); /*现实画面,使用图像对象 edges */
    98. if(waitKey(30) >= 0) break; /*延时 30毫秒 */
    99. }
    100. return 0;
    101. }

    makefile

    1. #编译方式
    2. CC = g++
    3. #源码文件
    4. SOURCES = main.cpp
    5. #编译标志
    6. CONFIG = -g
    7. CONFIG += -lopencv_highgui
    8. CONFIG += -lopencv_core
    9. CONFIG += -lopencv_video
    10. CONFIG += -lopencv_objdetect
    11. CONFIG += -lopencv_imgproc
    12. #链接百度支持库
    13. CONFIG += -lcurl -lcrypto -ljsoncpp
    14. #百度库需要C++11版本支持
    15. CONFIG += -std=c++11
    16. #头文件
    17. HEADERS =
    18. #应用名称
    19. APP = a.out
    20. #编译
    21. ${APP}:${SOURCES}
    22. ${CC} $^ ${CONFIG} -o $@
    23. #伪操作:删除
    24. clean:
    25. rm -rf ${APP}

    3.还有一些小的知识,

    lambda 函数

    [capture] (parameters)  mutable->return-type{statement}
     

    [capture]:捕捉列表,捕捉列表可以捕捉上下文中的变量以供lambda函数使用。
    (parameters):参数列表,与普通函数列表一致,如果不需要传参,那么可以连()一起省略。
    mutable:mutable修饰符,默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。在使用该修饰符时,参数列表不可省略。
    ->return-type:返回类型,一般而言,可以省略,使用auto进行自动推导。
    {statement}:函数体,可以使用参数及补捕获的变量。
      如下是一个lambda函数的声明示例:

    int main()
    {
        int a = 3;
        int b = 4;
        auto fun = [=,&b](int c)->int{return b += a+c ;}
    }

           捕获列表
      捕获列表是lambda函数中极具特色的一部分,在捕获时,主要有以下几种形式:

    [var] 表示值传递方式捕获变量var。
    [=] 表示值传递方式捕获所有作用域的变量,包括this。
    [&var] 表示引用传递方式捕获变量var。
    [&] 表示引用传递方式捕获所有父作用域的变量,包括this。
    [this] 表示值传递方式捕获当前的this指针。
      需要注意的是,在捕获时,不允许重复传递,否则会导致编译时的错误:

    [=,a] : = 已经表示以值传递的方式捕获了所有变量,捕捉a重复。
    [&,&this]:&已经以引用传递方式捕捉了所有变量,再捕捉this也是一种重复。



    4.  C++11 特性


     5.异常,抛出,接收,与尝试

  • 相关阅读:
    使用python获取浏览器收藏夹和历史浏览记录,然后可以...
    超六成专科生的月薪不足5000元?网友:本科和研究生也是
    虚拟机作为master远程控制台式机中的机器人在仿真环境中进行slam地图构建与自主导航
    ssm基于微信小程序的学习资料销售平台+ssm+uinapp+Mysql+计算机毕业设计
    2023年中国半导体检测仪器设备销售收入、产值及市场规模分析[图]
    SpringBoot 注解简介(持续更新)
    做UI设计师是否需要美术功底?
    企业如何通过CRM系统赢得客户?
    Golang 中的静态类型和动态类型
    ImageEn FMX内置图像效果对话框
  • 原文地址:https://blog.csdn.net/she666666/article/details/128130037