linux 上面:
操作步骤:
1.
2.找到 share 这个文件夹
3.找到 opencv 这个文件夹
4.
1.今天学习的摄像头 识别 人脸( 独立开一个窗口) ,
mian.cpp
#include
#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 objects; /*矩形容器*/
Mat MatFace; /*图像截取后存放*/
vector 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
#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 &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 &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 objects; /*矩形容器*/
Mat MatFace; /*图像截取后存放*/
vector 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.异常,抛出,接收,与尝试