qt版本5.4.0:旧版本的qt,为啥要用旧版本的我也不知道
调用系统摄像头,用红框框住画面中的人头
- #-------------------------------------------------
- #
- # Project created by QtCreator 2023-10-23T16:19:56
- #
- #-------------------------------------------------
-
- QT += core gui
-
- greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
-
- TARGET = demo4
- TEMPLATE = app
-
-
- SOURCES += main.cpp\
- widget.cpp
-
- HEADERS += widget.h
-
- FORMS += widget.ui
-
- INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include
- INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include/opencv
- INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include/opencv2
- LIBS += D:/opencv/opencv3.4-qt-intall/install/x86/mingw/lib/libopencv_*.a
- #ifndef WIDGET_H
- #define WIDGET_H
-
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- using namespace cv;
- using namespace cv::face;
- using namespace std;
-
- namespace Ui {
- class Widget;
- }
-
- class Widget : public QWidget
- {
- Q_OBJECT
-
- public:
- explicit Widget(QWidget *parent = 0);
- ~Widget();
-
- private slots:
- void on_openBtn_clicked();
-
- void on_closeBtn_clicked();
-
- private:
- Ui::Widget *ui;
-
- //摄像头相关的成员设置
- //视频流对象
- VideoCapture video;
- //存放图像的容器对象
- Mat src;
- Mat gray;
- Mat rgb;//存放从bgr转化成rgb图的
- Mat dest;
-
- //级联对象
- CascadeClassifier c;
- //图像中人脸的容器集合
- vector
faces; -
- //定义一个打开摄像头的定时器
- int camer_time_id;
-
- void timerEvent(QTimerEvent *e);
-
- };
-
- #endif // WIDGET_H
- #include "widget.h"
- #include "ui_widget.h"
-
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::Widget)
- {
- ui->setupUi(this);
- ui->wechatBtn->setEnabled(false);
- //0代表打开摄像头
- if(!video.open(0)){
- QMessageBox::information(this,"提示","打开系统摄像头失败");
- return;
- }
- //级联分类器的配置
- if(!c.load("D:\\opencv\\heads\\haarcascade_frontalface_alt.xml")){
- QMessageBox::information(this,"提示","配置失败");
- return;
- }
-
-
- }
-
- Widget::~Widget()
- {
- delete ui;
- }
- //打开摄像头对应的槽函数处理
- void Widget::on_openBtn_clicked()
- {
- camer_time_id =startTimer(20);
-
- }
- //定时器处理函数
- void Widget::timerEvent(QTimerEvent *e)
- {
- //判断哪个定时器
- //1.打开摄像头的定时器超时
- if(e->timerId()==camer_time_id){
- video.read(src);
- //将bgr转化位rgb
- cvtColor(src,rgb,CV_BGR2RGB);
- //设置rgb的长宽
- cv::resize(rgb,rgb,Size(ui->label->width(),ui->label->height()));
- //转化为灰度
- cvtColor(rgb,gray,CV_RGB2GRAY);
- //转化为直方图
- equalizeHist(gray,dest);
- //获取人脸放入人脸集合容器
- c.detectMultiScale(dest,faces);
- //绘制矩形框
- for(int i=0;i
size();i++){ - rectangle(rgb,faces[i],Scalar(255,0,0),4);
- }
- flip(rgb,rgb,1);//0表示x轴的反转,1y轴反转,-1表示xy轴翻转
-
- //定义一个QImage
- QImage img(rgb.data,rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);
- //放入label
- ui->label->setPixmap(QPixmap::fromImage(img));
-
-
- }
- }
-
- void Widget::on_closeBtn_clicked()
- {
- killTimer(camer_time_id);
- }
大概分为视频的调用和红框的实现:
视频的调用:视频是由一帧一帧的像素帧(也就是图片)实现,到底也是对图片的操作
首先实例化视频流对象video,打开摄像头系统video.open,通过定时器来实现画面获取(之前的demo是用while循环),获取图片video.read(src),(src为Mat对象,存储图片),根据需要对其进行处理(灰度图、直方图。。)
红框的实现:
,定义一个级联分类器CascadeClassifier c(用来后面获取人脸位置),并加载其配置文件c.load("配置文件路径"),然后调用detectMutiScale,获取人脸位置,调用循环绘制矩形,将绘制矩形后的图片以合适的格式放到label标签上就可以
virtual bool open(const String& filename); //参数:要打开视频的路径 //返回值:成功返回true失败返回false。打开摄像头只需在构造时,调用构造函数参数传递0即可
virtual bool read(OutputArray image); 功能:读取视频流中的图像 参数:图像容器 返回值:成功读取返回true,失败或者视频结束返回false
void flip(InputArray src, OutputArray dst, int flipCode); //将图像进行旋转 //参数1:要处理的图像 //参数2:处理后的图像容器 //参数3:处理规则:0:表示沿x翻转,1表示沿y轴翻转,-1表示沿xy轴翻转
色彩空间转化函数
函数原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 ); //功能:将给定的图像进行色彩空间转化 //参数1:要转化的图像 //参数2:转化后的图像容器 //参数3:转化规则CV_BGR2GRAY 将彩色图转为灰度图
均衡化处理
函数原型:void equalizeHist( InputArray src, OutputArray dst ); //功能:将灰度图进行均衡化直方图拉伸 //参数1:要处理的图像,灰度图 //参数2:均衡化处理后的图像容器
下载级联分类器函数
bool load( const String& filename ); 功能:将本地的分类器模型,加载到程序中 参数:级联分类器模型的路径 返回值:bool
获取人脸矩形框
函数原型:void detectMultiScale( InputArray image,CV_OUT std::vector
& objects) //功能:通过给定的图像,获取矩形框人脸所在区域的矩形框 //参数1:要识别的人脸图像 //参数2:识别后矩形框容器
函数原型:void rectangle(CV_IN_OUT Mat& img, Rect rec,const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);*/ //功能:在给定的图像上,绘制给定的矩形框 //参数1:要被绘制的图像 //参数2:要绘制的矩形框 //参数3:矩形框颜色 //参数4:矩形框线条粗细