QT连接OpenCV库完成人脸识别

1.相关的配置

1> 该项目所用环境:qt-opensource-windows-x86-mingw491_opengl-5.4.0

2> 配置opencv库路径:

1、在D盘下创建一个opencv的文件夹,用于存放所需材料

2、在opencv的文件夹下创建一个名为:opencv3.4-qt-intall 文件夹

3、将资料中的opencv_library的install文件,复制到opencv3.4-qt-intall 文件夹中

4、将路径:D:\opencv\opencv3.4-qt-intall\install\x86\mingw\bin 放入电脑的系统路径中

3> 测试是否配置好

创建一个新的qt工程,将对应配置文件和头文件放入后,不报错就说明配置成功

2.关于图像处理的相关类和函数 

1> Mat类,图像容器

2> 读取图像

Mat imread( const String& filename, int flags = IMREAD_COLOR );
//功能:读取出图像
//参数:图像路径
//返回值:读取的图像

3> 命名展示图像的窗口 

void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
功能:命名一个图像窗口
参数1:窗口名称
参数2:窗体尺寸,默认为自适应大小
返回值:无

4> 展示图像 

void imshow(const String& winname, const ogl::Texture2D& tex);
//功能:展示图像
//参数1:要展示图像的窗口名称
//参数2:要展示的二维图像
//返回值:无
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();//1、定义一个图像容器Mat src;//2、将图像加载进来//函数原型:Mat imread( const String& filename, int flags = IMREAD_COLOR );//参数:图像的路径//返回值:图像容器src = imread("D:/opencv/resource/age.jpg");//4、命名一个展示图像的窗口//namedWindow("Test");//5、展示图像//函数原型:void imshow(const String& winname, const ogl::Texture2D& tex);//参数1:要展示图像的窗口名称//参数2:要展示的图像//返回值:无imshow("Test", src);return a.exec();
}

 3.视频流相关类和函数

1> 视频流类:VideoCapture

2> 打开视频:

 virtual bool open(const String& filename);//参数:要打开视频的路径//返回值:成功返回true失败返回false

3> 打开摄像头只需在构造时,调用构造函数参数传递0即可

4> 读取视频流中图像

virtual bool read(OutputArray image);
功能:读取视频流中的图像
参数:图像容器
返回值:成功读取返回true,失败或者视频结束返回false

 5> 图像翻转

void flip(InputArray src, OutputArray dst, int flipCode);
//将图像进行旋转
//参数1:要处理的图像
//参数2:处理后的图像容器
//参数3:处理规则:0:表示沿x翻转,1表示沿y轴翻转,-1表示沿xy轴翻转

6> 休眠阻塞函数

int waitKey(int delay = 0);
功能:阻塞等待用户输入数据,如果delay=0,则一直等待
参数:毫秒数
返回值:在等待过程中用户按下键的值
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();//1、定义视频流对象VideoCapture v(0);             //表明使用摄像头构造一个视频流对象//2、读取摄像头中的图像Mat src;                   //用于存放读取出来的图像//函数原型:virtual bool read(OutputArray image);//功能:从视频流中读取一张图像放入参数中//参数:图像容器//返回值:成功返回真,失败或者读取视频结束返回假while(v.read(src)){//将图像进行翻转//函数原型:void flip(InputArray src, OutputArray dst, int flipCode);//参数1:要翻转的图像//参数2:翻转后的图像容器//参数3:翻转规则:正数表示按y轴翻转,0表示按x轴翻转,负数表示按xy轴翻转flip(src, src, 1);//展示图像imshow("Test1", src);//加延时函数//函数原型:int waitKey(int delay = 0);//参数:等待时间//返回值:在等待期间用户按下的键盘的ascii值    ESC键对应的值为27if(waitKey(20)==27){break;}}return a.exec();
}

4.图像处理

1> 灰度处理

void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
功能:转换图像色彩空间
//参数1:要转换的图像
//参数2:转变后图像容器
//参数3:转换规则:BGR to gray
返回值:无

2> 均衡化处理

void equalizeHist( InputArray src, OutputArray dst ); 
参数1:输入的灰度图像,必须是8-bit的单通道图像  
参数2:输出的图像 
图像直方图:对整个图像在灰度范围内的像素值(0-255)统计出现的频率,据此生成直方图,直 方图反应了图像的灰度分布情况。
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();//1、定义视频流对象VideoCapture v(0);             //表明使用摄像头构造一个视频流对象//2、读取摄像头中的图像Mat src;                   //用于存放读取出来的图像Mat gray;                   //用于存储灰度图的图像容器Mat dst;                     //用于存储均衡化处理后的图像容器//函数原型:virtual bool read(OutputArray image);//功能:从视频流中读取一张图像放入参数中//参数:图像容器//返回值:成功返回真,失败或者读取视频结束返回假while(v.read(src)){//将图像进行翻转//函数原型:void flip(InputArray src, OutputArray dst, int flipCode);//参数1:要翻转的图像//参数2:翻转后的图像容器//参数3:翻转规则:正数表示按y轴翻转,0表示按x轴翻转,负数表示按xy轴翻转flip(src, src, 1);//3、将图像灰度处理//函数原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );//参数1:要转换的图像//参数2:转换后的图像容器//参数3:转换规则  CV_BGR2GRAY表示将bgr彩色图转换为gray灰度图//返回值:无cvtColor(src, gray, CV_BGR2GRAY);//4、对图像进行均衡化处理//函数原型:void equalizeHist( InputArray src, OutputArray dst );//参数1:要进行均衡化处理的图像,必须是单通道灰度图//参数2:均衡化处理后的图像容器//返回值:无equalizeHist(gray, dst);//展示彩色图像imshow("Test1", src);//展示灰度图像imshow("Test2", gray);//展示均衡化处理后的图像imshow("Test3", dst);//加延时函数//函数原型:int waitKey(int delay = 0);//参数:等待时间//返回值:在等待期间用户按下的键盘的ascii值    ESC键对应的值为27if(waitKey(20)==27){break;}}return a.exec();
}

5.级联分类器 

1> opencv级联分类器工具类 : CascadeClassifier //struct Student

2> 加载级联分类器配置文件 : bool load( const String& filename )

参数1:分类器数据文件的名字

返回值:成功true,失败false

3> 找到人脸所在位置的矩形区域

void detectMultiScale(
const Mat& image, 
CV_OUT vector& objects,    //int arr[4]; 
double scaleFactor = 1.1,
int minNeighbors = 3, 
int flags = 0, 
Size ize = Size(24,24))
参数1:待检测灰度图像(数据少处理起来简单) 
参数2:被检测物体的矩形框向量( 人脸Rect矩形区域,其中objects.size()是人脸个数 ) 
参数3:前后两次相继的扫描中搜索窗口的比例系数,默认为1.1 即每次搜索窗口扩大10% 
参数4:构成检测目标的相邻矩形的最小个数 如果组成检测目标的小矩形的个数和小于 minneighbors - 1 都会被除 
参数5:若设置为CV_HAAR_DO_CANNY_PRUNING 函数将会使用Canny边缘检测来排除边缘过多 或过少的区域,,一般采用默认值0 
参数6:用来限制得到的目标区域的范围,一般检测人脸使用Size(24, 24)

4> 人脸部分的矩形区域显示出来

void rectangle(CV_IN_OUT Mat& img, Rect rec,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);
img:图像。 
rec:表征矩形的位置和长宽。 
color:线条颜色 (RGB) 。 
thickness:组成矩形的线条的粗细程度。 
line_type:线条的类型。 
shift:坐标点的小数点位数,0表示没有小数点。
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();//1、定义视频流对象VideoCapture v(0);             //表明使用摄像头构造一个视频流对象//2、读取摄像头中的图像Mat src;                   //用于存放读取出来的图像Mat gray;                   //用于存储灰度图的图像容器Mat dst;                     //用于存储均衡化处理后的图像容器//5、实例化一个级联分类器的对象,用于找到图像中的人脸矩形区域CascadeClassifier c;//给类对象装载人脸识别模型//函数原型:bool load( const String& filename );//功能:给级联分类器对象,下载一个识别模型//参数:人脸识别模型的文件路径//返回值:成功下载返回真,失败返回假if(!c.load("D:/opencv/resource/haarcascade_frontalface_alt2.xml")){QMessageBox::information(NULL,"失败", "人脸识别模型装载失败");return -1;}//定义容器存放人脸分类后的矩形框vector<Rect> faces;//函数原型:virtual bool read(OutputArray image);//功能:从视频流中读取一张图像放入参数中//参数:图像容器//返回值:成功返回真,失败或者读取视频结束返回假while(v.read(src)){//将图像进行翻转//函数原型:void flip(InputArray src, OutputArray dst, int flipCode);//参数1:要翻转的图像//参数2:翻转后的图像容器//参数3:翻转规则:正数表示按y轴翻转,0表示按x轴翻转,负数表示按xy轴翻转flip(src, src, 1);//3、将图像灰度处理//函数原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );//参数1:要转换的图像//参数2:转换后的图像容器//参数3:转换规则  CV_BGR2GRAY表示将bgr彩色图转换为gray灰度图//返回值:无cvtColor(src, gray, CV_BGR2GRAY);//4、对图像进行均衡化处理//函数原型:void equalizeHist( InputArray src, OutputArray dst );//参数1:要进行均衡化处理的图像,必须是单通道灰度图//参数2:均衡化处理后的图像容器//返回值:无equalizeHist(gray, dst);//6、使用级联分类器对象,获取人脸矩形区域//函数原型:void detectMultiScale( InputArray image,CV_OUT std::vector<Rect>& objects)//参数1:要进行识别的图像//参数2:对该图像识别后,的矩形框存放的数组容器c.detectMultiScale(dst, faces);//7、将上述得到的矩形框,全部都绘制到图像上for(int i=0; i<faces.size(); i++){//将任意一个矩形框,全部都绘制到图像上//函数原型:void rectangle(CV_IN_OUT Mat& img, Rect rec,const Scalar& color, int thickness = 1)//参数1:要被绘制的图像//参数2:要绘制的矩形框//参数3:矩形框的颜色//参数4:矩形框的粗细//返回值:无rectangle(src, faces[i], Scalar(0,0,255), 2);}//8、像素反差for(int i=0; i<src.rows; i++)        //外层循环控制行数{for(int j=0; j<src.cols; j++)        //内层循环控制列数{//找到任意一个像素:src.at<Vec3b>(i,j)//找到任意一个像素中的通道中的值src.at<Vec3b>(i,j)[k]for(int k=0; k<3; k++){src.at<Vec3b>(i,j)[k] = 255 - src.at<Vec3b>(i,j)[k];  //对像素进行反差}}}//展示彩色图像imshow("Test1", src);//展示灰度图像imshow("Test2", gray);//展示均衡化处理后的图像imshow("Test3", dst);//加延时函数//函数原型:int waitKey(int delay = 0);//参数:等待时间//返回值:在等待期间用户按下的键盘的ascii值    ESC键对应的值为27if(waitKey(20)==27){break;}}return a.exec();
}

6. 介绍 

机器学习的作用:根据提供的图片模型通过算法生成数据模型,从而在其它图片中查找相关的目 标。

级联分类器:是用来人脸识别。 在判断之前,我们要先进行学习,生成人脸的模型以便后续识别使用。

人脸识别器:判断是谁的面部。 FaceRecognizer类是opencv提供的人脸识别器基类,LBPHFaceRecognizer是根据LBPH算法实 现的识别器类,其中LBPHFaceRecognizer识别器支持在原有模型基础上继续学习(模型数据可以累 计)。

7.创建LBPHFaceRecognizer识别器对象

 所需的头文件:#include 、using namespace cv::face;创建空的人脸识别器对象:Ptr<FaceRecognizer> recognizer =LBPHFaceRecognizer::create();​根据已有的模型创建人脸识别器对象,在创建人脸识别器的时候,需要一个已经学习好的模型文件:Ptr<FaceRecognizer> recognizer = FaceRecognizer::load<LBPHFaceRecognizer>("模型文件.xml");

8.机器学习并更新模型

 容器:容器中装了n张人脸Mat对象,先采集脸,装到容器中,存储标签,人的身份证,每一张脸给一个编号:1 张三脸 2 李四脸 3 王五脸。功能函数1:void update(InputArrayOfArray src,InputArray labels)//机器学习并更新模型功能函数2:void train(InputArrayOfArrays src,InputArray labels);//只是学习,不更新//参数1src:图片模型数组 vector<Mat>//参数2labels:标签数组,每个模型识别后的标签vector<int>

9.保存模型

功能函数:void save(const String& filename);//参数1:模型文件的名字
例如:
recognizer->update(study_faces,study_label);//学习
recognizer->save("face.xml");//将学习的成果,保存到face.xml模型文件中,生成模型:
study_faces.clear();、study_labels.clear();

10.预测目标

判断这个人脸到底是谁。
功能函数:
void predict(InputArray src,  int &label,  double &confidence)
//参数1:预测图形 Mat src
//参数2::预测后的标签,学习时对应的标签
//参数3:预测出结果的可信度,数值越小可信度越高
例如:
int label = -1;//预测后的标签,学习时对应的标签
double confidence = 0;//可信度
Mat face = frame(faces[0]);//人脸区域
cvtColor(face,face,CV_BGR2GRAY);//更改色彩空间
cv::resize(face,face,Size(90,90));//设置人脸的大小
recognizer->predict(face,label,confidence); //预测,相当于识别人脸,预测出人脸是谁的
面部,label的值就那张脸对应的标签,如果预测不到,label的值是-1。

11.设置可信度

功能函数:void setThreshold(double val);
//参数1:预测可信度极值,预测可信度超出极值则预测失败。

12.完整项目代码 

.pro文件:

#-------------------------------------------------
#
# Project created by QtCreator 2023-09-04T19:10:16
#
#-------------------------------------------------QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = 01_demo
TEMPLATE = appSOURCES += main.cpp\widget.cppHEADERS  += widget.hFORMS    += widget.uiINCLUDEPATH += C:/opencv/opencv3.4-qt-install/install/include
INCLUDEPATH += C:/opencv/opencv3.4-qt-install/install/include/opencv
INCLUDEPATH += C:/opencv/opencv3.4-qt-install/install/include/opencv2
LIBS += C:/opencv/opencv3.4-qt-install/install/x86/mingw/lib/libopencv_*.a

头文件:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QWidget>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
#include <opencv2/face.hpp>
#include <vector>
#include <map>
#include <QMessageBox>
#include <QDebug>
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QTimerEvent>
#include <QtSerialPort/QtSerialPort>
#include <QtSerialPort/QSerialPortInfo>
using namespace  cv;
using namespace cv::face;
using namespace std;namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private slots:void on_openCameraBtn_clicked();void on_closeCameraBtn_clicked();void on_inputFaceBtn_clicked();private:Ui::Widget *ui;/***************************第一模块:关于摄像头的相关组件*****************************/VideoCapture v;            //视频流对象Mat src;                   //原图像Mat rgb;                   //存放rgb图像,因为qt能识别的图像色彩空间为rgbMat gray;                  //灰度图Mat dst;                   //均衡化图像CascadeClassifier c;       //级联分类器vector<Rect> faces;        //存储人脸举行的容器int cameraId;              //摄像头的定时器void timerEvent(QTimerEvent *event);   //定时器事件处理函数/***************************第二模块:录入人脸的相关组件*****************************/Ptr<FaceRecognizer> recognizer;           //人脸识别器vector<Mat> study_face;                   //要录入的人脸容器vector<int> study_lab;                    //要录入的人脸的标签int studyId;                              //人脸录入的定时器int flag;                                 //表示是否正在录入人脸int count;                                //记录学习的次数/***************************第三模块:人脸检测的相关组件*****************************/int checkId;                   //人脸检测的定时器
};#endif // WIDGET_H

源文件: 

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//将登录按钮设置成不可用ui->loginBtn->setEnabled(false);//启动摄像头if(!v.open(0)){QMessageBox::information(this,"错误","打开摄像头失败");return;}//将级联分类器加载进来if(!c.load("C:/opencv/resource/haarcascade_frontalface_alt.xml")){QMessageBox::information(this,"失败","人脸识别模型装载失败");return;}//配置人脸识别器QFile file("C:/opencv/resource/myFace.xml");//判断文件是否存在,如果存在,则直接下载,如果不存在,则创建一个人脸识别器if(file.exists()){//人脸模型存在,直接下载即可recognizer = FaceRecognizer::load<LBPHFaceRecognizer>("C:/opencv/resource/myFace.xml");}else{//人脸模型不存在,则需要创建recognizer = LBPHFaceRecognizer::create();}//启动人脸检测到的定时器checkId = this->startTimer(3000);//设置人脸识别的可信度recognizer->setThreshold(100);flag = 0;          //表明开始时就处于检测
}Widget::~Widget()
{delete ui;
}//打开摄像头按钮对应的槽函数
void Widget::on_openCameraBtn_clicked()
{//启动定时器cameraId = this->startTimer(20);ui->cameraLab->show();
}//关闭摄像头按钮对应的槽函数
void Widget::on_closeCameraBtn_clicked()
{//关闭定时器this->killTimer(cameraId);ui->cameraLab->hide();
}//定时器事件处理函数
void Widget::timerEvent(QTimerEvent *event)
{//判断是哪个定时器到位if(event->timerId() == cameraId){//1.从摄像头中读取一张图像v.read(src);      //得到原图//2.将图像翻转flip(src,src,1);//3.将src的bgr图像转换为rgb图像cvtColor(src,rgb,CV_BGR2RGB);//4.重新设置大小cv::resize(rgb,rgb,Size(300,300));//5.灰度处理cvtColor(rgb,gray,CV_RGB2GRAY);//6.均衡化处理equalizeHist(gray,dst);//7.使用级联分类器获取人脸矩形区域c.detectMultiScale(dst,faces);//8.将矩形框绘制到rgb图像上for(int i=0; i<faces.size(); i++){rectangle(rgb,faces[i],Scalar(255,0,0),2);}//9.使用rgb图像,将Mat图,构造出一个qt能识别的图像QImage img(rgb.data,rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);//功能:通过其他图像构造出一个QImage图像//参数1:其他图像的数据//参数2:图像的宽度//参数3:图像的高度//参数4:每一行的字节数//参数5:图像格式,24位图,每一种颜色使用8位表示//10.将图像展示到lab中ui->cameraLab->setPixmap(QPixmap::fromImage(img));}//判断是否是人脸录入定时器到位if(event->timerId() == studyId){//判断ui界面是否有矩形框if(faces.empty())return;//判断人脸识别器是否存在if(recognizer.empty())return;//提示正在录入人脸qDebug() << "正在录入人脸...";//获取ui界面中矩形框框起来的人脸区域Mat face = src(faces[0]);//将该图像进行重新设置大小cv::resize(face,face,Size(100,100));//灰度处理cvtColor(face,face,CV_BGR2GRAY);//均衡化处理equalizeHist(face,face);//将人脸放入学习容器中study_face.push_back(face);study_lab.push_back(1);count++;                     //表明完成一次人脸的存放if(count == 50)              //已经收集50张人脸进行学习{count = 0;               //以便于下一次录入//更新人脸模型//函数原型:CV_WRAP virtual void update(InputArrayOfArrays src, InputArray labels);//参数1:要进行更新的人脸数组//参数2:要更新的人脸标签数组//返回值:无recognizer->update(study_face,study_lab);//将数据模型保存到本地磁盘中recognizer->save("C:/opencv/resource/myFace.xml");//殿后工作study_face.clear();       //清空人脸数组study_lab.clear();        //清空标签数组flag = 0;                 //表明录入已经结束,可以进行人脸检测了ui->inputFaceBtn->setEnabled(true);    //按钮设置成可用状态this->killTimer(studyId);              //关闭人脸录入的定时器QMessageBox::information(this,"成功","人脸录入成功");}}//判断是否是人脸检测的定时器到位if(event->timerId() == checkId){qDebug() << "正在检测...";//判断是否处于检测if(flag == 0){QFile file("C:/opencv/resource/myFace.xml");if(file.exists())              //表明人脸模型存在的基础上进行识别{if(faces.empty() || recognizer.empty()) return;              //ui界面无矩形框或者没有人脸识别器//到此表明可以进行检测Mat face = src(faces[0]);//重新设置大小,保持跟保存人脸时一致cv::resize(face,face,Size(100,100));//灰度处理cvtColor(face,face,CV_BGR2GRAY);//均衡化处理equalizeHist(face,face);//定义记录检测后返回的结果的变量int lab = -1;                //返回的图像的标签double conf = 0.0;           //返回图像的可信度//将该人脸进行预测recognizer->predict(face,lab,conf);qDebug() << "lab = " << lab << "  conf = " << conf;//对人脸识别后的结果进行判断if(lab != -1){ui->loginBtn->setEnabled(true);}}}}}//录入人脸按钮对应的槽函数
void Widget::on_inputFaceBtn_clicked()
{//启动人脸录入的定时器qDebug() << "开始进行人脸录入...";studyId = this->startTimer(60);//将按钮设置成不可用状态ui->inputFaceBtn->setEnabled(false);//将flag设置成1,表示正在录入人脸,不要进行人脸检测了flag = 1;count = 0;       //清空计数器}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试Pytest实现接口自动化应该如何在用例执行后打印日志到日志目录生成日志文件?

Pytest可以使用内置的logging模块来实现接口自动化测试用例执行后打印日志到日志目录以生成日志文件。以下是实现步骤&#xff1a; 1、在pytest配置文件&#xff08;conftest.py&#xff09;中&#xff0c;定义一个日志输出路径&#xff0c;并设置logging模块。 import loggi…

Visual Studio Code 终端配置使用 MySQL

Visual Studio Code 终端配置使用 MySQL 找到 MySQL 的 bin 目录 在导航栏中搜索–》服务 找到MySQL–>双击 在终端切换上面找到的bin目录下输入指令 终端为Git Bash 输入命令 ./mysql -u root -p 接着输入密码&#xff0c;成功在终端使用 MySQL 数据库。

Kafka知识点总结

常见名词 生产者和消费者 同一个消费组下的消费者订阅同一个topic时&#xff0c;只能有一个消费者收到消息 要想让订阅同一个topic的消费者都能收到信息&#xff0c;需将它们放到不同的组中 分区机制 启动方法 生成者和消费者监听客户端

Vue项目案例-头条新闻

目录 1.项目介绍 1.1项目功能 1.2数据接口 1.3设计思路 2.创建项目并安装依赖 2.1创建步骤 2.2工程目录结构 2.3配置文件代码 3.App主组件开发 3.1设计思路 3.2对应代码 4.共通组件开发 4.1设计思路 4.2对应代码 5.头条新闻组件开发 5.1设计思路 5.2对应代码 …

Python之父加入微软三年后,Python嵌入Excel!

近日&#xff0c;微软传发布消息&#xff0c;Python被嵌入Excel&#xff0c;从此Excel里可以平民化地进行机器学习了。只要直接在单元格里输入“PY”&#xff0c;回车&#xff0c;调出Python&#xff0c;马上可以轻松实现数据清理、预测分析、可视化等等等等任务&#xff0c;甚…

Docker的基本组成和安装

Docker的基本组成 镜像&#xff08;image&#xff09;&#xff1a; docker镜像就好比是一个模板&#xff0c;可以通过这个模板来创建容器服务&#xff0c;tomcat镜像 > run > tomcat01容器&#xff08;提供服务&#xff09; 通过这个镜像可以创建多个容器&#xff08;最…

DAY08_MyBatisPlus——入门案例标准数据层开发CRUD-Lombok-分页功能DQL编程控制DML编程控制乐观锁快速开发-代码生成器

目录 一 MyBatisPlus简介1. 入门案例问题导入1.1 SpringBoot整合MyBatisPlus入门程序①&#xff1a;创建新模块&#xff0c;选择Spring初始化&#xff0c;并配置模块相关基础信息②&#xff1a;选择当前模块需要使用的技术集&#xff08;仅保留JDBC&#xff09;③&#xff1a;手…

SpringCloud实战项目(1)---创建空项目 jdk17

创建空项目 New ProjectAdd Jdk17创建空白标准Maven项目不要选择Create from archetype选项填写相关项目信息创建项目得到一个标准的maven项目&#xff0c;作为一个Parent project存在的&#xff0c;需删除src文件夹。 New Project 使用Idea, File -> New ->Project Add …

AutoSar Com模块

文章目录 Com模块功能通信传输控制整体 communication 结构Signal 发送流程设置信号的 UpdateBit信号的超时处理信号的传输方式 Signal 发送时序图Signal 接收流程接收信号的 UpdateBit Signal 接收时序图Com_TxPduInfo / Com_RxPduInfo、Com_PduGrpVector 数据来源Com_TxSigGr…

RabbitMQ基础

目录 MQ MQ概述 MQ 的优势 1.应用解耦 2.异步提速 3.削峰填谷 MQ 的劣势 1.系统可用性降低 2.系统复杂度提高 3.一致性问题 使用 MQ 需要满足什么条件呢&#xff1f; RabbitMQ 简介 ​编辑RabbitMQ 中的相关概念 RabbitMQ 提供了 6 种工作模式 JMS java实现Ra…

成都睿趣科技:现在开一家抖音小店还来得及吗

随着社交媒体的迅猛发展&#xff0c;抖音已经成为了一个全球范围内广受欢迎的社交平台。在这个短视频应用上&#xff0c;人们分享着各种各样的内容&#xff0c;从搞笑段子到美食教程&#xff0c;再到时尚搭配和手工艺品制作。随着用户数量的不断增长&#xff0c;很多人都在思考…

python基础运用例子

python基础运用例子 1、⼀⾏代码交换 a , b &#xff1a;a, b b, a2、⼀⾏代码反转列表 l[::-1]3、合并两个字典 res {**dict1, **dict2}**操作符合并两个字典for循环合并dict(a, **b) 的方式dict(a.items() b.items()) 的方式dict.update(other_dict) 的方式 4、⼀⾏代码列…

软件生命周期及流程

软件生命周期&#xff1a; 软件生命周期(SDLC&#xff0c;Systems Development Life Cycle)是软件开始研制到最终被废弃不用所经历的各个阶段. 需求分析阶段--输出需求规格说明书&#xff08;原型图&#xff09; 测试介入的晚--回溯成本高 敏捷开发模型&#xff1a; 从1990年…

【AWS实验】 使用 Lake Formation 设置数据湖

文章目录 实验概览目标实验环境任务 1&#xff1a;探索实验环境任务 1.1&#xff1a;在 S3 存储桶中创建文件夹任务 1.2&#xff1a;加载 AWS Cloud9 IDE任务 1.3&#xff1a;将数据复制到 S3 存储桶 任务 2&#xff1a;设置 AWS Lake Formation任务 2.1&#xff1a;注册 Amazo…

基于nRF52840 Dongle配合Wireshark对Mesh网络抓包并解析(Nordic)

Mesh网络抓包解析 准备说明配置过滤解密分析 准备 1&#xff09;nRF52840 Dongle 2&#xff09;Mesh节点 3&#xff09;手机作为配网器&#xff08;苹果手机安装nRF Mesh APP&#xff09; 说明 1&#xff09;节点使用的例程目录&#xff1a;nrf5sdkformeshv500src\examples\…

MLC-LLM 部署RWKV World系列模型实战(3B模型Mac M2解码可达26tokens/s)

0x0. 前言 我的 ChatRWKV 学习笔记和使用指南 这篇文章是学习RWKV的第一步&#xff0c;然后学习了一下之后决定自己应该做一些什么。所以就在RWKV社区看到了这个将RWKV World系列模型通过MLC-LLM部署在各种硬件平台的需求&#xff0c;然后我就开始了解MLC-LLM的编译部署流程和…

4.正则提取html中的img标签的src内容

我们以百度贴吧的1吧举例 目录 1 把网页搞下来 2 收集url 3 处理url 4 空的src 5 容错 6 不使用数字作为文件名 7 并不是所有的图片都用img标签表示 8 img标签中src请求下来不一定正确 9 分页 1 把网页搞下来 搞下来之后&#xff0c;双击打开是这样的 2 收…

【数据结构与算法】十大经典排序算法

文章目录 前言一、常见十大排序算法总结1、名词解释2、时间复杂度 二、排序算法与C语言实现1、冒泡排序2、选择排序3、插入排序4、希尔排序5、归并排序6、快速排序7、堆排序8、计数排序9、桶排序10、基数排序 总结 前言 排序算法是《数据结构与算法》中最基本的算法之一。 排序…

智能合约安全,著名的区块链漏洞:双花攻击

智能合约安全&#xff0c;著名的区块链漏洞&#xff1a;双花攻击 介绍: 区块链技术通过提供去中心化和透明的系统彻底改变了各个行业。但是&#xff0c;与任何技术一样&#xff0c;它也不能免受漏洞的影响。一个值得注意的漏洞是双花攻击。在本文中&#xff0c;我们将深入研究…

论文阅读:SERE: Exploring Feature Self-relation for Self-supervised Transformer

Related Work Self-supervised 学习目的是在无人工标注的情况下通过自定制的任务&#xff08;hand-crafted pretext tasks&#xff09;学习丰富的表示。 Abstract 使用自监督学习为卷积网络&#xff08;CNN&#xff09;学习表示已经被验证对视觉任务有效。作为CNN的一种替代…