OpenCV
文章选取大部分网络资源,侵删。
opencv头文件
常用头文件名的解释
[core]核心功能模块主要包含了opencv基本数据结构,动态数据结构,绘图函数,数组操作相关函数,辅助功能与系统函数和宏。[imgproc]图像处理模块
主要包换了图像的变换,滤波直方图相关结构分析,形状描述 。[video]视频模块
主要运用在调用摄像头时。[highgui]高层GUI图像交互模块
主要包换了图形交互界面,媒体I/O的输入输出,视频信息的捕捉和提取,图像视频编码等。[math.h]数学函数库
包含了一些常用的数学公式。如三角函数,反三角函数,乘方,开方,取整等运算。[iostream]输入输出流头文件
主要包含了在c++编码过程中的 cin输入内容和cout输出内容。[vector] “容器”
之所以被认为是一个容器,是因为vector能够能够像容器一样存放各种数据类型。换句话说,能够存放任意类型的动态数组,能够增加和压缩数据。[ml] Machine Learning 机器学习模块
基本上是统计模型和分类算法,包含如下内容
统计模型 (Statistical Models)
一般贝叶斯分类器 (Normal Bayes Classifier)
K-近邻(K-Nearest Neighbors)
支持向量机 (Support Vector Machines)
决策树 (DecisionTrees)
提升(Boosting)
梯度提高树(Gradient Boosted Trees)
随机树 (Random Trees)
超随机树 (Extremely randomized trees)
期望最大化 (Expectation Maximization)
神经网(Neural Networks)
加载修改保存图片
加载图片 imread
加载一个图像成为mat格式对象
IMREAD_UNCHANGED (<0) 表示加载原图,不做任何改变 (忽略alpha通道)IMREAD_GRAYSCALE ( 0 ) 表示把原图作为灰度图像加载进来IMREAD_COLOR (>0) 表示把原图作为RGB图像加载进来 读一个GRAY像素点的像素值(CV_8UC1)Scalar intensity = img.at(y, x);
或者 Scalar intensity = img.at(Point(x, y));
Vec3f intensity = img.at(y, x);
float blue = intensity.val[0];
float green = intensity.val[1];
float red = intensity.val[2];
显示图像 namedWindow & imshow
namedWindow(“Window Title”, WINDOW_AUTOSIZE)
WINDOW_AUTOSIZE 自动根据图像大小显示窗口大小,不能人为改变窗口大小WINDOW_NORMAL,跟QT集成的时候会使用,允许修改窗口大小。imshow根据窗口名称显示图像到指定的窗口上去,第一个参数是窗口名称,第二参数是Mat对象
修改图片 cvtColor
把图像从一个彩色空间转换到另外一个色彩空间
第一参数源图像、第二参数色彩空间转换之后的图像、第三个参数表示源转向目标色彩空间
例 : cvtColor( image, gray_image, COLOR_BGR2GRAY );
修改像素值灰度图像
img.at(y, x) = 128;
RGB三通道图像
img.at(y,x)[0]=128; // blue
img.at(y,x)[1]=128; // green
img.at(y,x)[2]=128; // red
空白图像赋值
img = Scalar(0);
ROI选择
Rect r(10, 10, 100, 100);
Mat smallImg = img®;
Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。
Vec3f对应三通道的float类型数据
把CV_8UC1转换到CV32F1实现如下:
src.convertTo(dst, CV_32F);
保存图片 imwite
只有8位、16位的PNG、JPG、Tiff格式而且是单通道或者三通道的BGR的图像才可以通过这种方式保存
保存PNG格式的时候可以保存透明通道的图片
可以指定压缩参数
矩阵的掩膜操作
获取图像像素指针 CV_Assert
CV_Assert(myImage.depth() == CV_8U);Mat.ptr(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
const uchar* current= myImage.ptr(row ); 获得当前行指针
p(row, col) =current[col] 获取当前像素点P(row, col)的像素值
像素范围处理 saturate_cast
saturate_cast(-100),返回 0。
saturate_cast(288),返回255
saturate_cast(100),返回100
这个函数的功能是确保RGB值得范围在0~255之间
函数调用filter2D功能
定义掩膜:Mat kernel = (Mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D( src, dst, src.depth(), kernel );
其中src与dst是Mat类型变量、src.depth表示位图深度,有32、24、8等。
Mat对象
Mat对象OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分
IplImage是从2001年OpenCV发布之后就一直存在,是C语言风格的数据结构,需要开发者自己分配与管理内存,对大的程序使用它容易导致内存泄漏问题
Mat对象常用方法
void copyTo(Mat mat)
void convertTo(Mat dst, int type)
Mat clone()
int channels()
int depth()
bool empty();
uchar* ptr(i=0)
Mat对象使用
部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分Mat A= imread(imgFilePath);
Mat B(A) // 只复制完全复制:如果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现
Mat F = A.clone(); 或 Mat G; A.copyTo(G);
输出图像的内存是自动分配的
使用OpenCV的C++接口,不需要考虑内存分配问题
赋值操作和拷贝构造函数只会复制头部分
使用clone与copyTo两个函数实现数据完全复制
构造函数
Mat M(2,2,CV_8UC3, Scalar(0,0,255))
其中前两个参数分别表示行(row)跟列(column)、第三个CV_8UC3中的8表示每个通道占8位、U表示无符号、C表示Char类型、3表示通道数目是3,第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致
创建多维数组 cv::Mat::create
int sz[3] = {2,2,2};
Mat L(3,sz, CV_8UC1, Scalar::all(0));
图像变换
调整图像亮度和对比度属于像素变换-点操作
像素变换 – 点操作
邻域操作 – 区域
Mat new_image = Mat::zeros( image.size(), image.type() ); 创建一张跟原图像大小和类型一致的空白图像、像素值初始化为0
saturate_cast(value)确保值大小范围为0~255之间
Mat.at(y,x)[index]=value 给每个像素点每个通道赋值
模糊处理
Smooth/Blur 给图像预处理时候减低噪声
使用Smooth/Blur操作其背后是数学的卷积计算
通常这些卷积算子计算都是线性操作,所以又叫线性滤波
图像的采样和降采样
拉普拉斯金字塔 – 用来重建一张图片根据它的上层降采样图片
高斯金子塔-降采样(从底向上)
降采样之后图像大小是原图像MxN的M/2 x N/2 ,就是对原图像删除偶数行与列,即得到降采样之后上一层的图片。
高斯金子塔的生成过程分为两步:
- 对当前层进行高斯模糊
- 删除当前层的偶数行与列
即可得到上一层的图像,这样上一层跟下一层相比,都只有它的1/4大小。
定义:就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像。称为高斯不同(DOG)
高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到。
上采样(cv::pyrUp) – zoom in 放大
降采样 (cv::pyrDown) – zoom out 缩小
阈值(threshold)
图像阈值,即图像的分割基准,基于此可完成图像的二值化(threshold binary),阈值反二值化(threshold binary Inverted),截断 (truncate),阈值取零 (threshold to zero),阈值反取零 (threshold to zero inverted)
图像二值化可用于OCR成图像的分割(也是最为简单的一种)。这种分割是基于图像像素值级别的差异,且一般的对象是灰度图像。
直方图
(参考https://blog.csdn.net/qq_38701868/article/details/89215881)
图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。
CV 领域常借助图像直方图来实现图像的二值化。
计算直方图 calcHist()
void calcHist(const Mat* images,//输入的数组或数据集,需为相同的深度(CV_8U 或 CV_32F)和相同的尺寸int nimages,//输入数组的个数,第一个参数中存放了多少张 “图像”,有几个原数组const int* channels,//需要统计的通道(dim)索引,第一个数组通道从 0 到 images[0].channels() - 1,而第二个数组通道从 images[0].channels() 计算到 images[0].channels() + images[1].channels() - 1。InputArray mask,//可选的操作掩码,用于标记出统计直方图的数组元素数据,如果此掩码不为空,那么它必须为 8 位,并且与 images[i] 有同样的大小和尺寸。用于标记出统计直方图的数组元素数据。OutputArray hist,//输出的目标直方图,二维数组int dims,//需要计算的直方图的维数,正数,不大于 CV_MAX_DIMS(在 OpenCV3 中等于 32)const int* histSize,//存放每个直方图尺寸的数组const float** ranges,//每一维数值的取值范围bool uniform = true,//指示直方图是否均匀的标识符bool accumulate = false//累计标识符,主要是允许多从多个阵列中计算单个直方图,或者用于在特定的时间更新直 true,直方图在配置阶段不会被清零方图。 ) 123456789101112
寻找最值 minMaxLoc()
void minMaxLoc(InputArray src, //输入的单通道阵列double* minVal, //返回最小值的指针double* maxVal = 0, //返回最大值的指针Point* minLoc = 0, //返回最小位置的指针(二维)Point* maxLoc = 0, //返回最大位置的指针(二维情况下)InputArray mask = noArray() //选择子阵列的可选掩膜 ) 12345678
网址:OpenCV https://www.yuejiaxmz.com/news/view/889106
相关内容
碎点篇——opencv边缘检测报错OpenCV常见的优化方法和技巧总结
python+opencv+mfcc+pygame+arduino多进程=简单的音视频采集分析系统
【未完成】opencv + 云台 + kcf
【计算机视觉】基于Python—OpenCV的手势识别详解(一)
Python从0到100(七十三):Python OpenCV
基于opencv,使用python提取视频帧以及提取TVL1光流
OpenCV数字识别性能优化:从算法到实现,大幅提升识别速度
基于树莓派opencv—Python的人脸面部特征框选(眼睛和微笑)
基于opencv的家居智能安防机器视觉系统