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

news2024/12/24 8:33:47

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.异常,抛出,接收,与尝试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nnDetection复现Luna16 附模型

前提概要&#xff1a; 淘论文发现nnDetection框架对肺结节的检测效果挺好&#xff0c;便跑了跑复现了下&#xff0c; 作者诚不欺人&#xff0c;确实挺好&#xff0c; 并附上我依据文档训练的模型。 复现步骤&#xff1a; 1.安装 cuda11.4, cudnn8.2.4 2.创建虚拟环境 cond…

JAVA12_01学习总结(MySQL,约束)

今日内容 1. MySql基本查询 --ifnull(字段名称,预期值)-如果两个int类型数据求和,其中一个为null,那么结果就是null,使用ifnull来解决 -- 需求--查询姓名和成绩和 -- 创建表 CREATE TABLE test(id INT , -- 编号NAME VARCHAR(20) , -- 姓名age INT , -- 年龄math INT , -- 数…

html转pdf(总结五种方法Java)

html转pdf&#xff08;总结五种方法Java&#xff09; Java 实现html转pdf&#xff0c;总结五种方法。 推荐使用wkhtmltopdf,Itext 方法一&#xff1a;使用wkhtmltopdf 1、下载插件wkhtmltopdf https://wkhtmltopdf.org/downloads.html 2、本机测试 本目录下cmd进入 输入命…

解读数仓中的数据对象及相关关系

摘要&#xff1a;为实现不同的功能&#xff0c;GaussDB&#xff08;DWS&#xff09;提供了不同的数据对象类型&#xff0c;包括索引、行存表、列存表及其辅助表等。这些数据对象在特定的条件下实现不同的功能&#xff0c;为数据库的快速高效提供了保证&#xff0c;本文对部分数…

深聊性能测试,从入门到放弃之: Windows系统性能监控(一) 性能监视器介绍及使用。

性能监视器介绍及使用1、引言2、性能监视器2.1 打开方式2.2 基本介绍2.3 计数器介绍2.3.1 处理器性能计数器2.3.2 内存性能计数器2.3.3 网络性能计数器2.4 创建及使用2.4.1 用户自定义创建2.4.2 直接添加计数器3、总结1、引言 小屌丝&#xff1a;鱼哥&#xff0c;你有没有监控…

G1D28-hinge loss fuction-RAGA pre总结-DeBERTa-杂七杂八visiomathtypeexcel

一、hinge loss和交叉熵对比 (一 )hinge loss主要思想 让正确分类和错误分类的距离达到λ。λ用于控制两种分类样本之间的距离。 &#xff08;二&#xff09;对比学习 自监督学习的一种&#xff0c;不依赖标注数据进行学习。蛮有意思的&#xff0c;但是今天没时间了&#x…

逻辑学三大定律是什么?

逻辑思维三大定律: 同一律&#xff0c;矛盾律&#xff0c; 排中律。 同一律&#xff1a;A 是 A。 前后思维中&#xff0c;概念要同一。白马非马论违反同一律。商家的买一赠一&#xff0c;前后两个一不是同一个概念。违反同一律。矛盾律&#xff1a;A 是 B&#xff0c; A 不是B,…

【Android App】发送BLE广播及通过主从BLE实现聊天应用讲解及实战(附源码和演示 超详细)

需要源码请点赞关注收藏后评论区留言私信~~~ 一、发送BLE广播 调用蓝牙适配器的getBluetoothLeAdvertiser方法&#xff0c;获得BluetoothLeAdvertiser广播器对象。 广播器的主要方法说明如下&#xff1a; startAdvertising方法表示开始发送BLE广播&#xff0c; stopAdvertis…

springBoot开源MES生产制造执行系统源码带文字搭建教程

源码分享&#xff01;需要源码学习参考可私信。 技术框架&#xff1a;springBoot mybatis-plus shiro hutool layui swagger freemarker mysql8 echarts 运行环境&#xff1a;IntelliJ IDEA 2022 maven nginx 宝塔面板 系统功能 用户管理&#xff1a;用户是系统操…

用VS开发一款“飞机大战“单机游戏<C++>

显示界面如上图所示 自己找的背景和飞机素材,先将素材奉上. 接下来我先简单分析一下这个单机游戏的运行逻辑: 就像显示界面所显示的那样,我们想要实现的是自己的飞机在发射子弹(子弹在上图没显示),然后当子弹射到敌方飞机,这里设置了两种类型的飞机,如果读者想定义更多类型的…

基于51单片机农业大棚温控系统

资料编号&#xff1a;197 大棚种植温控系统概述&#xff1a; 本文介绍的是一个由单片机构成的温度控制系统&#xff0c;主要用来提供测温的解决方案&#xff0c;同时还能实时监控温度变化趋势&#xff0c;以及报警功能。它利用STC89C52RC单片机&#xff0c;DS18B20&#xff0c…

概率图模型:HMM(隐马),MEMM(最大熵),CRF(条件随机场)

1.概率图模型&#xff1a;HMM&#xff08;隐马&#xff09;,MEMM&#xff08;最大熵&#xff09;,CRF&#xff08;条件随机场&#xff09;概率&#xff1a;既然是一个图那么就是一个有圈有边的结构&#xff0c;圈代表随机向量&#xff0c;随机变量之间有边&#xff0c;边上有概…

数字验证学习笔记——UVM学习2 覆盖方法

一、覆盖方法 覆盖机制可以将原来所属的类型替换为另外一个新的类型。 在覆盖之后&#xff0c;原本用来创建原属类型的请求&#xff0c;将由工厂来创建新的替换类型。 无需再修改原始代码&#xff0c;继而保证了原有代码的封装性。新的替换类型必须与被替换类型兼容&#xff…

OpenStack 学习之 OVN : L2网络 ( Logical switches 逻辑交换机)

OVN Manual install & Configuration Open vSwitch 官网 参考 OVN学习&#xff08;一&#xff09; OVN实战一之GNS3操作指南及OVN入门 简单理解和知识 按照 OVN Manual install & Configuration 分别叫做 Controller 节点和 Compute 节点 &#xff0c;其他一般叫做…

Android Studio 打一个正式签名的Apk

如何打一个带正式签名文件的app (给自己的劳动成果冠名) 1. 选择build -> generate signed bundle/apk 2. 这里有两个选择, bundle or apk, 我们选择apk 于是勾选 apk, 并点下一步 3. 来到选择证书文件的地方, 但是我们这是第一次做, 还没有证书文件, 所以选择新建一个证…

【Docker学习系列】Docker学习2-docker设置阿里云镜像加速器

在上一篇中&#xff0c;我们学会了在centos中安装docer。我们知道&#xff0c;镜像都是外网的&#xff0c;镜像一般都是比较大的&#xff0c;因为种种原因&#xff0c;我们知道&#xff0c;从外网下载比较慢的。所以&#xff0c;本文&#xff0c;凯哥就介绍怎么将docker的镜像拉…

keil5打开keil4工程无法编译的情况解决办法!!!!!!

目录 1.情况 1.keil5使用&#xff08;打开&#xff09;keil4文件工程的时候报错 2.解决办法 如果是kei5打开kei4工程文件出现 步骤1&#xff1a; 步骤2&#xff1a; 步骤3&#xff1a; 1.情况 1.keil5使用&#xff08;打开&#xff09;keil4文件工程的时候报错 --- Erro…

vscode插件开发

作为一个前端开发相信&#xff0c;大家对于vscode非常熟悉。vscode是微软开源的一款基于 Electron 开发的代码编辑器。并且vscode支持通过插件来扩展编辑器的功能&#xff0c;比如Prettier插件帮助我们快速格式化代码&#xff0c;ES7 React/Redux/React-Native snippets插件帮助…

Kotlin高仿微信-第31篇-支付-服务

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…