当前位置: 首页 > 工具软件 > Img Notes > 使用案例 >

OpenCV_Learning_Notes_Primer

姚鹤龄
2023-12-01

文章选取大部分网络资源,侵删。

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));

读一个RGB像素点的像素值

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

把图像从一个彩色空间转换到另外一个色彩空间
第一参数源图像、第二参数色彩空间转换之后的图像、第三个参数表示源转向目标色彩空间

  • COLOR_BGR2HLS
  • COLOR_BGR2GRAY

例 : 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大小。

  • 高斯不同(Difference of Gaussian-DOG)
    定义:就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像。称为高斯不同(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 领域常借助图像直方图来实现图像的二值化。

  • dims:统计的特征数目
  • bins:每个特征空间子区段的数目
  • range:每个特征空间的取值范围

计算直方图 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,直方图在配置阶段不会被清零方图。
)

寻找最值 minMaxLoc()

void minMaxLoc(
	InputArray src,   //输入的单通道阵列
	double* minVal,  //返回最小值的指针
	double* maxVal = 0, //返回最大值的指针
	Point* minLoc = 0,   //返回最小位置的指针(二维)
	Point* maxLoc = 0,   //返回最大位置的指针(二维情况下)
	InputArray mask = noArray()  //选择子阵列的可选掩膜
)
 类似资料:

相关阅读

相关文章

相关问答