opencv3编程入门-毛星云

第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)=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函数调用

猜你喜欢

转载自blog.csdn.net/sinat_36304757/article/details/125355576