图像容器:Mat类
读取图像:
- Mat imread( const String& filename, int flags = IMREAD_COLOR );
- 功能:读取出图像
- 参数:图像路径
- 返回值:读取的图像
命名展示图像的窗口:
- void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
- 功能:命名一个图像窗口
- 参数1:窗口名称
- 参数2:窗体尺寸,默认为自适应大小
- 返回值:无
展示图像:
- void imshow(const String& winname, const ogl::Texture2D& tex);
- 功能:展示图像
- 参数1:要展示图像的窗口名称
- 参数2:要展示的二维图像
- 返回值:无
示例:
- #include "widget.h"
- #include
- 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();
- }
视频流类:VideoCapture
打开视频:
- 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轴翻转
休眠阻塞函数:
- int waitKey(int delay = 0);
- 功能:阻塞等待用户输入数据,如果delay=0,则一直等待
- 参数:毫秒数
- 返回值:在等待过程中用户按下键的值
示例:
- #include "widget.h"
- #include
- 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键对应的值为27
- if(waitKey(20)==27)
- {
- break;
- }
- }
- return a.exec();
- }
灰度处理:
- void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
- 功能:转换图像色彩空间
- 参数1:要转换的图像
- 参数2:转变后图像容器
- 参数3:转换规则:BGR to gray
- 返回值:无
均衡化处理:
- void equalizeHist( InputArray src, OutputArray dst );
- 参数1:输入的灰度图像,必须是8-bit的单通道图像
- 参数2:输出的图像
- 图像直方图:对整个图像在灰度范围内的像素值(0-255)统计出现的频率,据此生成直方图,直方图反应了图像的灰度分布情况。
示例:
- #include "widget.h"
- #include
- 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键对应的值为27
- if(waitKey(20)==27)
- {
- break;
- }
- }
- return a.exec();
- }
opencv级联分类器工具类 : CascadeClassifier
加载级联分类器配置文件 :
- bool load( const String& filename )
- 参数1:分类器数据文件的名字
- 返回值:成功true,失败false
找到人脸所在位置的矩形区域:
- void detectMultiScale(
- const Mat& image,
- CV_OUT vector& objects,
- 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)
显示矩形区域:
- 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
- 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
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
& objects) - //参数1:要进行识别的图像
- //参数2:对该图像识别后,的矩形框存放的数组容器
- c.detectMultiScale(dst, faces);
-
-
- //7、将上述得到的矩形框,全部都绘制到图像上
- for(int i=0; i
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
//外层循环控制行数 - {
- for(int j=0; j
//内层循环控制列数 - {
- //找到任意一个像素:src.at
(i,j) - //找到任意一个像素中的通道中的值src.at
(i,j)[k] - for(int k=0; k<3; k++)
- {
- src.at
(i,j)[k] = 255 - src.at(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();
- }