河北网站建设电话,网站怎么做到秒收录,如何给网站做备份,清华紫光是可以做网站的吗1.相关的配置 1 该项目所用环境#xff1a;qt-opensource-windows-x86-mingw491_opengl-5.4.0 2 配置opencv库路径#xff1a; 1、在D盘下创建一个opencv的文件夹#xff0c;用于存放所需材料 2、在opencv的文件夹下创建一个名为#xff1a;opencv3.4-qt-intall 文…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 QApplicationint 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);
功能阻塞等待用户输入数据如果delay0则一直等待
参数毫秒数
返回值在等待过程中用户按下键的值
#include widget.h
#include QApplicationint 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 QApplicationint 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 QApplicationint 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;}//定义容器存放人脸分类后的矩形框vectorRect 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::vectorRect objects//参数1要进行识别的图像//参数2对该图像识别后的矩形框存放的数组容器c.detectMultiScale(dst, faces);//7、将上述得到的矩形框全部都绘制到图像上for(int i0; ifaces.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 i0; isrc.rows; i) //外层循环控制行数{for(int j0; jsrc.cols; j) //内层循环控制列数{//找到任意一个像素:src.atVec3b(i,j)//找到任意一个像素中的通道中的值src.atVec3b(i,j)[k]for(int k0; k3; k){src.atVec3b(i,j)[k] 255 - src.atVec3b(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;创建空的人脸识别器对象PtrFaceRecognizer recognizer LBPHFaceRecognizer::create();根据已有的模型创建人脸识别器对象在创建人脸识别器的时候需要一个已经学习好的模型文件PtrFaceRecognizer recognizer FaceRecognizer::loadLBPHFaceRecognizer(模型文件.xml);
8.机器学习并更新模型 容器容器中装了n张人脸Mat对象先采集脸装到容器中存储标签人的身份证每一张脸给一个编号1 张三脸 2 李四脸 3 王五脸。功能函数1void update(InputArrayOfArray src,InputArray labels)//机器学习并更新模型功能函数2void train(InputArrayOfArrays src,InputArray labels);//只是学习不更新//参数1src图片模型数组 vectorMat//参数2labels标签数组每个模型识别后的标签vectorint
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; //级联分类器vectorRect faces; //存储人脸举行的容器int cameraId; //摄像头的定时器void timerEvent(QTimerEvent *event); //定时器事件处理函数/***************************第二模块录入人脸的相关组件*****************************/PtrFaceRecognizer recognizer; //人脸识别器vectorMat study_face; //要录入的人脸容器vectorint study_lab; //要录入的人脸的标签int studyId; //人脸录入的定时器int flag; //表示是否正在录入人脸int count; //记录学习的次数/***************************第三模块人脸检测的相关组件*****************************/int checkId; //人脸检测的定时器
};#endif // WIDGET_H源文件
#include widget.h
#include ui_widget.hWidget::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::loadLBPHFaceRecognizer(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 i0; ifaces.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; //清空计数器}