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.首先百度云的账号 (人脸识别 开始有一年的免费使用 )
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.异常,抛出,接收,与尝试
