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

linux 上面:

操作步骤:
1. 

2.找到 share 这个文件夹

3.找到 opencv  这个文件夹

4.

 

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

mian.cpp

#include <iostream>
#include "opencv2/core/core.hpp"            /* 编译的时候 -lopencv_core  连接到core核心库*/
#include "opencv2/highgui/highgui.hpp"      /* 编译的时候 -lopencv_highgui  连接到highgui图像处理库*/
#include "opencv2/imgproc/imgproc.hpp"      /* 编译的时候 -lopencv_imgproc  连接到imgproc图像处理库*/
#include "opencv2/video/video.hpp"          /* 编译的时候 -lopencv_video     连接到video摄像头 */
#include "opencv2/objdetect/objdetect.hpp"  /* 编译的时候 -lopencv_objdetect 连接到objdetect级联处理 */
//#include "aip-cpp-sdk-0.8.1/face.h" /* 引入百度云人脸识别 */

using namespace cv; /** 引入命名空间 **/
using namespace std;/** 引入标准库 **/
//using namespace aip; /*引入百度SDK命名空间*/
bool flag = false;
int main()
{
    VideoCapture cap(0); /*创建一个摄像头对象 0号摄像头*/
    if(!cap.isOpened()) return -1;/*打开摄像头*/

    Mat frame, edges; /* 建立图像对象 */
    namedWindow("edges",1); /* 生成一个窗体名为 edges */

    /****** 1.创建级联类对象 ******/
    CascadeClassifier Classifier("haarcascades/haarcascade_frontalface_alt2.xml");
    std::vector<cv::Rect> objects; /*矩形容器*/
    Mat MatFace; /*图像截取后存放*/
    vector<uchar> buf; /*转码后存放的图片*/
    namedWindow("MatFace",1); /* 生成一个窗体名为 MatFace */
    for(;;)
    {
        cap >> frame; /* 拍照 */
        edges = frame;

        //cvtColor(frame, edges, CV_BGR2GRAY);  //灰度处理

        /***** 2.人脸检测 *****/
        Classifier.detectMultiScale(edges,objects); /* 算法 -> 算力 -> 时间复杂度 */
        cout << "检测到:" << objects.size() << "人脸" << endl;  

        /***** 3.绘制矩形 *****/
        for(int i = 0; i < objects.size() ;i++)
        {
            rectangle(edges,objects[i],Scalar(0,255,255)); /** 绘制矩形框 **/
        }

        /***** 4.绘制文字 *****/
        putText(edges,"WangTinghu",Point(30,30),FONT_HERSHEY_DUPLEX,1,Scalar(0,255,0));
        
        /***** 5.图像截取 ******/
        for(int i = 0; i < objects.size() ;i++)
        {
            MatFace = edges(objects[i]); /* 截取图片 *
            imshow("MatFace", MatFace); /*现实截取画面,使用图像对象 edges */
        }


        imshow("edges", edges); /*现实画面,使用图像对象 edges */
        if(waitKey(30) >= 0) break; /*延时 30毫秒 */
    }

    return 0;
}

makefile 

#编译方式
CC = g++
#源码文件
SOURCES = main.cpp

#编译标志
CONFIG  = -g 
CONFIG += -lopencv_highgui
CONFIG += -lopencv_core
CONFIG += -lopencv_video
CONFIG += -lopencv_objdetect
CONFIG += -lopencv_imgproc

#百度库需要C++11版本支持
CONFIG += -std=c++11

#头文件
HEADERS = 

#应用名称
APP = a.out

#编译
${APP}:${SOURCES}
	${CC} $^ ${CONFIG} -o $@

#伪操作:删除
clean:
	rm -rf ${APP}


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

预备操作

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

(资源里面)

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

下载 curl 库       :sudo apt-get install libcurl-dev
"由于 curl 库很多,我们选择openssl的"  : sudo apt-get install libcurl4-openssl-dev

下载 openssl 库    :sudo apt-get install openssl
下载 jsoncpp 库    :sudo apt-get install libjsoncpp-dev

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


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

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

2.领取福利

 这个的地址: 


3.创建对比库!!!

 

 

 

main.cpp

#include <iostream>
#include "opencv2/core/core.hpp"            /* 编译的时候 -lopencv_core  连接到core核心库*/
#include "opencv2/highgui/highgui.hpp"      /* 编译的时候 -lopencv_highgui  连接到highgui图像处理库*/
#include "opencv2/imgproc/imgproc.hpp"      /* 编译的时候 -lopencv_imgproc  连接到imgproc图像处理库*/
#include "opencv2/video/video.hpp"          /* 编译的时候 -lopencv_video     连接到video摄像头 */
#include "opencv2/objdetect/objdetect.hpp"  /* 编译的时候 -lopencv_objdetect 连接到objdetect级联处理 */
#include "aip-cpp-sdk-0.8.1/face.h" /* 引入百度云人脸识别 */

using namespace cv; /** 引入命名空间 **/
using namespace std;/** 引入标准库 **/
using namespace aip; /*引入百度SDK命名空间*/

/***** 1.关联的知识 *****
 * 1.软件库SDK的概念
 * 2.JSON数据传输概念(明天)
 * *********************/
/****** 百度对接函数 *******/
Json::Value Baidu(vector<uchar> &buf)
{
    // 设置APPID/AK/SK
    std::string app_id = "287";//写自己的
    std::string api_key = "Xu10NdF";
    std::string secret_key = "u1mHDy9De";
    // 实例化百度客户端对象 
    aip::Face client(app_id, api_key, secret_key);

    /**** BASE64转码 ****/
    std::string image = base64_encode((char *)buf.data(),buf.size());
    std::string image_type = "BASE64";
    std::string group_id_list = "Student";
    // 调用人脸搜索
    return client.search(image, image_type, group_id_list, aip::null);
}

Json::Value Baidu_Register(vector<uchar> &buf,string group,string user)
{
    // 设置APPID/AK/SK
    std::string app_id = "28765";
    std::string api_key = "Xu10NdQ4F5zH";
    std::string secret_key = "u1mHD7jtzyI93D9De";
    // 实例化百度客户端对象 
    aip::Face client(app_id, api_key, secret_key);

    /**** BASE64转码 ****/
    std::string image = base64_encode((char *)buf.data(),buf.size());   
    std::string image_type = "BASE64";
    std::string group_id = group;
    std::string user_id = user;

    // 调用人脸注册
    return client.user_add(image, image_type, group_id, user_id, aip::null);
}

bool flag = false;
int main()
{
    VideoCapture cap(0); /*创建一个摄像头对象 0号摄像头*/
    if(!cap.isOpened()) return -1;/*打开摄像头*/

    Mat frame, edges; /* 建立图像对象 */
    namedWindow("edges",1); /* 生成一个窗体名为 edges */

    /****** 1.创建级联类对象 ******/
    CascadeClassifier Classifier("haarcascades/haarcascade_frontalface_alt2.xml");
    std::vector<cv::Rect> objects; /*矩形容器*/
    Mat MatFace; /*图像截取后存放*/
    vector<uchar> buf; /*转码后存放的图片*/
    namedWindow("MatFace",1); /* 生成一个窗体名为 MatFace */
    for(;;)
    {
        cap >> frame; /* 拍照 */
        edges = frame;

        //cvtColor(frame, edges, CV_BGR2GRAY);  //灰度处理

        /***** 2.人脸检测 *****/
        Classifier.detectMultiScale(edges,objects); /* 算法 -> 算力 -> 时间复杂度 */
        cout << "检测到:" << objects.size() << "人脸" << endl;  

        /***** 3.绘制矩形 *****/
        for(int i = 0; i < objects.size() ;i++)
        {
            rectangle(edges,objects[i],Scalar(0,255,255)); /** 绘制矩形框 **/
        }

        /***** 4.绘制文字 *****/
        putText(edges,"Gongwei",Point(30,30),FONT_HERSHEY_DUPLEX,1,Scalar(0,255,0));
        
        /***** 5.图像截取 ******/
        for(int i = 0; i < objects.size() ;i++)
        {
            MatFace = edges(objects[i]); /* 截取图片 */
            imencode(".jpg",MatFace,buf); /*转码为.jpg格式*/
            //imwrite("MatFace.jpg",MatFace); /*保存到本地*/
            Json::Value json_value = Baidu(buf);
            //cout << "百度的返回值:\n" << json_value << endl;
            if(json_value["error_msg"] == "SUCCESS")
            {
                //cout << "user_list" << json_value["result"]["user_list"] << endl;
                cout << "组:" << json_value["result"]["user_list"][0]["group_id"] << endl;
                cout << "用户:" << json_value["result"]["user_list"][0]["user_id"] << endl;
                cout << "匹配度:" << json_value["result"]["user_list"][0]["score"] << endl;
            }

            // if(flag == false)
            // {
            //     cout << "注册结果:" << Baidu_Register(buf,"Student","PanDan") << endl;
            //     flag = true;
            // }
            imshow("MatFace", MatFace); /*现实截取画面,使用图像对象 edges */
        }


        imshow("edges", edges); /*现实画面,使用图像对象 edges */
        if(waitKey(30) >= 0) break; /*延时 30毫秒 */
    }

    return 0;
}

makefile

#编译方式
CC = g++
#源码文件
SOURCES = main.cpp

#编译标志
CONFIG  = -g 
CONFIG += -lopencv_highgui
CONFIG += -lopencv_core
CONFIG += -lopencv_video
CONFIG += -lopencv_objdetect
CONFIG += -lopencv_imgproc
#链接百度支持库
CONFIG += -lcurl -lcrypto -ljsoncpp
#百度库需要C++11版本支持
CONFIG += -std=c++11

#头文件
HEADERS = 

#应用名称
APP = a.out

#编译
${APP}:${SOURCES}
	${CC} $^ ${CONFIG} -o $@

#伪操作:删除
clean:
	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.异常,抛出,接收,与尝试

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值