文章目录

  • 第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 常用数据结构:

定义释义
Point2维点, 支持int , Point_ Point2i Point 等价
Point2f2维点 , 支持float
Point3f3维点
Scalar颜色RGB
Size颜色RGB, typedef Size_ Size2i;typedef Size2i Size
Rect矩形
cvtColor颜色空间转换
Matx轻量级Mat,使用前规定好大小
VecMatx的派生类,是一个以为的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)=af(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 边缘检测的一般步骤

  1. 滤波: 边缘检测主要基于图像强度的一阶和二阶导数,但是导数通常对噪声敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。
  2. 增强: 增强边缘的基础是确定图像各点邻域强度的变化值。
  3. 检测: 阈值化方法

7.1.2 canny算子

  • Canny 边缘检测的步骤
  1. 消除噪声
  2. 计算梯度幅值和方向
  3. 非极大值抑制
  4. 滞后阈值

边缘检测对应API

检测方法API
Canny边缘检测Canny
Soble算子Sobel
scharr滤波器Scharr

7.2 霍夫变换

OpenCV中的霍夫线变换有如下三种:

  1. 标准霍夫变换,由HoughLines函数调用
  2. 多尺度霍夫变换,由HoughLines函数调用
  3. 累计概率霍夫变换,有HoughLinesP函数调用

更多推荐

opencv3编程入门-毛星云