文章目录
- 第1章 邂逅OpenCV
- 1.1 OpenCV周边概念认知
- 1.1.1 图像处理、计算机视觉与OpenCV
- 1.2 OpenCV基本架构分析
- 第3章 HighGUI图形用户界面初步
- 第4章 OpenCV数据结构与基本绘图
- 4.2 常用数据结构:
- 4.3 基本图形的绘制
- 第5章 core组件进阶
- 5.1 访问图像中的像素
- 5.1.2 颜色空间缩减
- 5.1.4 计时函数
- 5.1.5 访问图像中像素的三类方法
- 5.2 ROI区域图像叠加&图像混合
- 5.2.1 感兴趣区域ROI
- 5.2.2 线性混合操作
- 5.2.3 计算数组加权和:addWeighted()函数
- 5.3 分离颜色通道、多通道图像混合
- 5.4 图像对比度、亮度值调整
- 5.5 离散傅里叶变换
- 5.6 XML文件YAML文件的操作
- 第6章 图像处理
- 6.1 线性滤波:方框滤波、均值滤波、高斯滤波
- 6.1.2 图像滤波与滤波器
- 6.1.3 线性滤波器
- 6.1.4 滤波和模糊
- 6.1.5 邻域算子和线性邻域滤波
- 6.2 非线性滤波: 中值滤波、双边滤波
- 6.3 形态学滤波(1):腐蚀与膨胀
- 6.4 形态学滤波(2):开运算、闭运算、形态学梯度、顶帽、黑帽
- 第7章 图像变换
- 7.1 基于OpenCV的边缘检测
- 7.1.1 边缘检测的一般步骤
- 7.1.2 canny算子
- 7.2 霍夫变换
第1章 邂逅OpenCV
1.1 OpenCV周边概念认知
1.1.1 图像处理、计算机视觉与OpenCV
- 数字图像处理是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术
1.2 OpenCV基本架构分析
一些核心模块:
- core: 核心功能模块包含如下内容:
- OpenCV基本数据结构
- 动态数据结构
- 绘图函数
- 数组操作和相关函数
- 辅助功能与系统函数和宏
- 与OpenGL的互操作
- imgproc: Image和Process这两个单词的缩写组合,图像处理模块
- gpu: 运用GPU加速的计算机视觉模块
- highgui: 高层GUI图形用户界面
- ml: Machine Learning,机器学习模块,包括如下内容:
- 统计模型(Statistical Models)
- 一般贝叶斯分类器(Normal Bayes Classifier)
- K-近邻(K-Nearest Neighbors)
- 支持向量机(Support Vector Machines)
- 决策树(Decision Trees)
- 提升(Boosting)
- 梯度提高数(Gradiect Boosted Trees)
- 随机数(Random Trees)
- 超随机数(Extremely randomized trees)
- 期望最大化(Expectation Maximization)
- 神经网络(Neural Networks)
- ML Data
OpenCV各版本的差异:
OpenCV2 带来全新的c++接口;通过CUDA和OpenCL实现GPU加速
OpenCV3 进行项目架构改变,使用内核+插件的架构方式;大部分方法都使用了OpenCL加速
OpenCV4 c++11编译器才能编译
OpenCL:
OpenCL是一个为异构平台编写程序的框架。编写语言基于c99。用于并行计算,加速计算。
openCV中集成了OpenCL
OpenCL和CUDA比较:
不同点:
OpenCL是通用的异构平台编程语言,为了兼顾不同设备,使用繁琐。
CUDA是nvidia公司发明的专门在其GPGPU上的编程的框架,使用简单,好入门
相同点:
都是基于任务并行与数据并行。
OpenGL是什么,为什么存在与OpenCV中
一个跨编程语言、跨平台的应用程序接口(API)的规格,它用于生成二维、三维图像。
在 2.3 之前 OpenCV 的渲染部分都是由 CPU 来实现的,不论是画线还是把图片显示到屏幕上。这有两个问题,速度慢,同时没法画> 三维物体。引入 OpenGL 是为了借助 显卡的力量,显卡比 CPU 更擅长渲染,同时显卡和 CPU 可以同时干活
第3章 HighGUI图形用户界面初步
函数名称 | 用途 |
---|---|
imread | 读取文件 |
imshow | 显示图片 |
namedWindow | 用于创建一个窗口 |
imwrite | 输出文件 |
createTrackbar | 创建一个可以调整数值的轨迹条 |
getTrackbarPos | 获取轨迹条的当前位置 |
SetMouseCallback | 为指定的窗口设置鼠标回调 |
第4章 OpenCV数据结构与基本绘图
Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类,可以用来创建和操作多维矩阵。
- OpenCV函数中输出图像的内存分配是自动完成的
- 使用OpenCV的c++接口时不需要考虑内存的释放问题
- 赋值运算符和拷贝构造函数(构造函数)只复制信息头
- 使用函数clone() 或者copyTo()来复制一幅图像的矩阵
4.2 常用数据结构:
定义 | 释义 |
---|---|
Point | 2维点, 支持int , Point_ Point2i Point 等价 |
Point2f | 2维点 , 支持float |
Point3f | 3维点 |
Scalar | 颜色RGB |
Size | 颜色RGB, typedef Size_ Size2i;typedef Size2i Size |
Rect | 矩形 |
cvtColor | 颜色空间转换 |
Matx | 轻量级Mat,使用前规定好大小 |
Vec | Matx的派生类,是一个以为的Matx,和vector很相似 |
OpenCV图片通道的存储顺序时BGR,而不是RGB.
4.3 基本图形的绘制
- 绘制直线
line
函数 - 绘制椭圆
ellipse
函数 - 绘制举行
rectangle
函数 - 绘制圆形
circle
函数 - 多边形
fillPoly
函数
第5章 core组件进阶
5.1 访问图像中的像素
5.1.2 颜色空间缩减
单通道的像素值只有256个,但是三通道有256*256*256种,处理起来比较麻烦,进行缩减后图像会有一样的效果。
像素缩减的办法是:
I
n
e
w
=
(
i
o
l
d
/
10
)
∗
10
I_{new}=(i_{old}/10)* 10
Inew=(iold/10)∗10
乘除法运算代价高,加减法及赋值运算代价低。
可以把所有的像素对应关系存表,利用查表后复制的方式替代上述计算公式,以减小运算代价
5.1.4 计时函数
double time0=static_cast<double>(getTickCount());//记录起始时间
//进行图像处理操作
time0=((double)getTickCount() - time0) / getTickFrequency();
cout<<"此方法的运行时间为:“<<time0<<"秒”<<endl;
5.1.5 访问图像中像素的三类方法
-
方法一 指针访问
-
方法二 迭代器
-
方法三 动态地址计算
5.2 ROI区域图像叠加&图像混合
5.2.1 感兴趣区域ROI
定义ROI有两种方法:
- 方法一 指定矩形的左上角坐标和矩形长宽
- 方法二 指定感兴趣行或列的范围
5.2.2 线性混合操作
进行画面叠加理论公式:
g
(
x
)
=
(
1
−
α
)
f
0
(
x
)
+
α
f
1
(
x
)
g(x)=(1-\alpha )f_0(x)+\alpha f_1(x)
g(x)=(1−α)f0(x)+αf1(x)
5.2.3 计算数组加权和:addWeighted()函数
5.3 分离颜色通道、多通道图像混合
有时需要对BGR三个通道分别显示和调整。通过OpenCV的split和merge方法可以达到目的。
5.4 图像对比度、亮度值调整
理论依据公式:
g
(
x
)
=
a
∗
f
(
x
)
+
b
g(x)=a*f(x)+b
g(x)=a∗f(x)+b
- a用来控制图像的对比度
- b用来控制图像的亮度
5.5 离散傅里叶变换
《傅里叶分析》
对一张图像使用傅里叶变换就是将它分解成正弦和余弦两部分,也就是将图像从空间域转换到频域。
一些关键函数:
函数名称 | 作用 |
---|---|
dft | 进行傅里叶变换 |
getOptimalDFTSize | 返回DFT最有尺寸 |
copyMakeBorder | 扩充图像边界 |
magnitude | 计算二维矢量的幅值 |
log | 计算自然对数 |
normalize | 矩阵归一化 |
此部分理解需要一些理论基础,待学习《数字信号处理》中相关内容再来细致学习吧~
5.6 XML文件YAML文件的操作
使用FileStorage类进行文件xml和yaml文件操作
第6章 图像处理
6.1 线性滤波:方框滤波、均值滤波、高斯滤波
6.1.2 图像滤波与滤波器
- 图像滤波的目的: 抽出图像的特征作为图像识别的特征模式;适应图像处理要求,消除图像数字化时所混入的噪声
- 平滑滤波的目的: 模糊;消除噪音
- 滤波器,可以想象为一个包含加权系数的窗口,透过这个窗口去看图像
五种常用的图像平滑处理操作:
滤波方式 | 函数 |
---|---|
方框滤波 | BoxBlur函数 |
均值滤波 | Blur函数 |
高斯滤波 | GaussianBlur函数 |
中值滤波 | medisnBlur函数 |
双边滤波 | bilateralFilter函数 |
6.1.3 线性滤波器
名称 | 作用 |
---|---|
低通滤波器 | 允许低频率通过 |
高通滤波器 | 允许高频率通过 |
带通滤波器 | 允许一定范围频率通过 |
带阻滤波器 | 允许一定范围频率通过并且允许其他频率通过 |
全通滤波器 | 允许所有频率通过,仅仅改变相位关系 |
陷波滤波器 | 阻止一个狭窄频率范围通过 |
6.1.4 滤波和模糊
两者的区别: 滤波可以分为低通滤波和高通滤波,低通就是模糊,高通就是锐化。
6.1.5 邻域算子和线性邻域滤波
6.2 非线性滤波: 中值滤波、双边滤波
滤波方式 | 函数 |
---|---|
中值滤波 | medianBlur |
双边滤波 | bilateralFilter |
6.3 形态学滤波(1):腐蚀与膨胀
主要功能:
- 消除噪声
- 分割出独立的图像元素,在图像中连接相邻的元素
- 寻找图像中的明显的极大值区域或极小值区域
- 求出图像的梯度
膨胀(dilate) 就是求局部最大值的操作。
腐蚀(erode) 就是求局部最小值的操作。
API函数:
操作类型 | 函数 |
---|---|
膨胀 | dilate |
腐蚀 | erade |
6.4 形态学滤波(2):开运算、闭运算、形态学梯度、顶帽、黑帽
- 开运算: 先腐蚀后膨胀
- 闭运算: 先膨胀后腐蚀
- 形态学梯度: 膨胀图与腐蚀图之差(可以保留物体的边缘轮廓)
- 顶帽:原图像与开运算只差
- 黑帽:闭运算与原图像之差
第7章 图像变换
变换常见的例子就是傅里叶变换。这类操作的结果仍然保存为OpenCV图像结构的形式,但是新图像的每个单独像素表示原始图像的频谱分量,而不是通常考虑的空间分量。
7.1 基于OpenCV的边缘检测
7.1.1 边缘检测的一般步骤
- 滤波: 边缘检测主要基于图像强度的一阶和二阶导数,但是导数通常对噪声敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。
- 增强: 增强边缘的基础是确定图像各点邻域强度的变化值。
- 检测: 阈值化方法
7.1.2 canny算子
- Canny 边缘检测的步骤
- 消除噪声
- 计算梯度幅值和方向
- 非极大值抑制
- 滞后阈值
边缘检测对应API
检测方法 | API |
---|---|
Canny边缘检测 | Canny |
Soble算子 | Sobel |
scharr滤波器 | Scharr |
7.2 霍夫变换
OpenCV中的霍夫线变换有如下三种:
- 标准霍夫变换,由HoughLines函数调用
- 多尺度霍夫变换,由HoughLines函数调用
- 累计概率霍夫变换,有HoughLinesP函数调用
更多推荐
opencv3编程入门-毛星云
发布评论