openCV 基础函数和类
OpenCV环境配置及测试
预热:
1、环境配置
在系统环境变量path中 追加路径:C:\openCV\install\x86\mingw\bin
2、配置工程文件pro:
INCLUDEPATH += C:\openCV\install\include
INCLUDEPATH += C:\openCV\install\include\opencv
INCLUDEPATH += C:\openCV\install\include\opencv2
LIBS += C:/openCV/install/x86/mingw/lib/libopencv_*.a
3、头文件
#include
using namespace cv;
4、测试Code
int main(int argc, char *argv[])
{
Mat src, dst;
src = imread("1.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
waitKey(0);
return 0;
}
备注:我的QT版本是5.4.0
以下开启OpenCV的学习!!!
Mat类
OpenCV中表示图像的类
计算机“眼中”的图片(二维数组)
创建对象
Mat src;
重要属性
Mat src;
src.clos; //获取图像的宽度
src.rows;//获取图像的高度
src.channels();//获取图像的通道数,表示一个像素点的数组元素的个数,比如:BGR的图片通道数是3
常用函数
功能:加载图像
Mat imread( const String& filename, int flags = IMREAD_COLOR );
参数1:图片的路径
参数2:图像的色彩空间模式(默认为BGR)
返回值:图像对象
功能:在窗口显示图像
void imshow(const String& winname, const ogl::Texture2D& tex);
参数1:窗口名称
参数2:图像对象Mat就可以
功能:转换图像色彩空间 色彩空间(一个像素点的组成)
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
参数1:输入图像
参数2:输出图像
参数3:色彩空间 详情ColorConversionCodes
参数4:通道数,默认根据色彩空间决定
常用来将BGR转成Gray,灰度图虽然难看,但是保留了原图像的所有特征,提升效率。
flip();//图片翻转
resize();//
Mat类转换到QImage
通常情况下需要在QT上显示图片,因此了解Mat(BGR)转换QImage(RGB)非常必要
Mat src;
Mat dst;
执行操作步骤:
1、色彩空间转换
cvtColor(src,dst,CV_BGR2RGB);
2、QImage img(dst.data, dst.cols, dst.rows, dst.cols*rgb.channels(), QImage::Format_RGB888);
QImgae构造函数的参数说明:
参数1:存放图片数据的数组
参数2:图片的列数
参数3:图片的行数
参数4:每一行的通道数
参数5:图片的编码格式
3、可以在Qt上显示了
ui->show_label->setPixmap(QPixmap::fromImage(img));
VideoCapture视频类
常用函数
功能:打开视频
bool open(const String& filename);
参数1:视频路径;参数传整数0,表示打开摄像头
返回值:打开成功
功能:读取视频帧
VideoCapture& operator >> (CV_OUT Mat& image);
参数1:读取到Mat对象
返回值:VideoCapture对象
矩阵掩膜
掩膜并不重要,重要的是通过掩膜我们来感受卷积,opencv对图像所有的操作几乎都是卷积
卷积:对图片中的每个像素点进行特定的操作
有什么用呢?
可以提升图片的对比度,对比美颜相机(降低对比度)
常用函数
功能:获取图像像素指针
Mat src;
uchar* p = src.ptr(i) 获取图像像素的指针,i表示第i行
这里的指针p偏移一个单位是偏移了一个通道,而不是一个像素点,对于3通道的图片,p需要偏移3次才能指向下调一个像素点
功能:获取通道数
src.channels()
功能:获取位图深度
src.depth()
位图深度:指一个像素点的通道的值,占了几个二进制位
功能:像素范围处理
saturate_cast(num) 将数字参数num的值限制的类型参数的范围内,如果num超出最小值范围,
函数返回最小值,超出最大值范围,函数返回最大值。
功能:掩膜公式
矩阵的掩膜操作十分简单,就是掩膜来计算每个像素的像素值,从而提升对比对,掩膜(mask也被称作kernel)
I(i,j) = 5*I(i,j)-[I(i+1,j)+I(i-1,j)+I(i,j+1)+I(i,j-1)]
功能:对RGB图修改像素值
Vec3b val = img.at(i, j);
img.at(y,x)[0]=128; // blue
img.at(y,x)[1]=128; // green
img.at(y,x)[2]=128; // red
或者
Vec3b v(255, 255, 255);
src.at(j,i) = v;//一次性给返回值的三个通道赋值
Rect类
矩形
void rectangle( Mat& img, //背景图片
Rect rec, //矩形的范围
const Scalar& color, //颜色
int thickness = 1, //线条宽度
int lineType = LINE_8,
//线条类型LINE_4 LINE_8 LINE_AA(反锯齿)
int shift = 0); //点坐标中小数位数
截图,对感兴趣区域选择
Mat src;
Rect rect(100, 100, 200, 400);
//参数1 矩形左上角x
//参数2 矩形左上角y
//参数3 矩形宽
//参数4 矩形高
Mat dst = src(rect);
//这里是()的运算符重载,从src中截取rect部分的图片放到dst里
级联分类器
理论上可以查找任何事物
训练模型文件采用OpenCV自带的
路径:C:/openCV/install/etc/haarcascades/haarcascade_frontalface_alt2.xml
识别:
通过多级筛选在图片中寻找目标
注意:1、不要每次都创建新的对象,重复加载模型不合理
2、加载很多个脸怎么回事 detectMultiScale参数是不是写错了
cv::CascadeClassifier类 _初始化级联分类器
CascadeClassifier classifier = CascadeClassifier(const String& filename);
参数:训练模型的文件路径
人脸检测函数_detectMultiScale
void detectMultiScale(
InputArray image,
//待检测的灰度图,需要预先进行直方图均值化来提升对比度
CV_OUT std::vector& objects,//查找到的目标矩形输出
double scaleFactor = 1.1,//前后两次相继的扫描中搜索窗口的比例系数,默认为1.1 即每次搜索窗口扩大10%,这个值越大,某些尺寸的对象无法被检测,但检测更快
int minNeighbors = 3,
//有多少个重叠的检测标记才被认为有效
int flags = 0, //新的级联分类器没用
Size minSize = Size(),//目标最小尺寸
Size maxSize = Size() );//目标最大尺寸,可以排除不合理对象,大大提升识别效率
机器学习_人脸识别器
1、机器学习的作用:根据提供的图片模型通过算法生成数据模型,从而在其他图片中查找相关的目标
2、人脸识别的两种常见算法
1.Fisher
输入数据-->减去均值-->计算离散矩阵-->计算特征值与特征向量-->计算前K个最大特征值对应特征向量-->投影到子空间-->终止
2.LBPH
开始-->图像灰度化-->LBP特征提取-->ULBP降维处理-->分割为多个方格-->每个方格生成直方图-->直方图连接特征向量集合-->直方图比较-->得到分类结果
FaceRecognizer类
opencv提供的人脸识别器基类,LBPHFaceRecognizer是根据LBPH算法实现的识别器类.
- 头文件
#include //人脸识别器
using namespace cv::face;
- 创建对象
//创建空的人脸识别器对象
Ptr recognizer = LBPHFaceRecognizer::create();
//根据已有的模型创新人脸识别器对象
Ptr recognizer = FaceRecognizer::load("模型文件.xml");
机器学习
_更新模型
void update(
InputArrayOfArrays src, //图片模型数组 vector
InputArray labels);//标签数组,每个模型识别后的标签 vector
_保存模型
void save(const String& filename);
_预测目标
void predict(InputArray src, //预测图形
int &label, //预测后的标签,学习时对应的标签
double &confidence) const;//可信度
使用定时器说明
由于UI界面不能出现死循环之类的,否则就卡住了
因此考虑使用定时器 。