#include "mainwindow.h"
#include <QApplication>
#include <opencv2/opencv.hpp>
#include <QMessageBox>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow 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("E:/opencv3.4.0/OpenCV-MinGW-Build-OpenCV-3.4.5/etc/haarcascades/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键对应的值为27
if(waitKey(20)==27)
{
break;
}
}
return a.exec();
}