(转)OpenCV 基本知识框架
以下是对《学习OpenCV》一书知识框架的简单梳理
转自:http://blog.chinaunix.net/uid-8402201-id-2899695.html
一、基础操作
1. 数据类型 数据结构了解
图像相关:cvArr cvMat IplImage
数据数组的维数, 与数据的通道数 见P46 (76)
2. 常见的矩阵操作熟悉
3. 数据的保存和读取
4. 图像的加载和显示
5. 视频的操作
6. 内存与序列
a. 内存存储器
CvMemStorage双向链表 动态对象(cvSeq cvSet)的内存
cvCreateMemStorage
cvReleaseMemStorage
cvClearMemStorage 不返还系统
cvMemStorageAlloc
b. 序列
是内存存储器可以存储的一种对象。 双端队列
CvSeq
方法:
cvCreateSeq
cvClearSeq
cvGetSeqElem
cvCloneSeq cvSeqSlice cvSeqRemoveSlice cvSeqInsertSlice
cvSeqSort
cvSeqSearch
cvSeqInvert
cvSeqPartition
堆栈操作 cvSeqPush cvSeqPushFront cvSeqPop cvSeqPopFront cvSeqPushMulti cvSeqPopMulti
cvSeqInsert cvSeqRemove
cvSetSeqBlockSize
读出和写入: CvSeqWriter结构 cvStartWriteSeq cvStartAppendToSeq cvEndWriteSeq cvFlushSeqWriter
CV_WRITE_SEQ_ELEM CV_WRITE_SEQ_ELEM_VAR
CvSeqReader结构 cvStartReadSeq cvGetSeqReaderPos cvSetSeqReaderPos
CV_NEXT_SEQ_ELEM V_PREV_SEQ_ELEM CV_READ_SEQ_ELEM CV_REV_READ_SEQ_ELEM
数组互相转换 cvCvtSeqToArray cvMakeSeqHeaderForArray
二. 图像的处理
1. 图像的平滑 cvSmooth
主要应用: 去除噪声, 失真,降低图像的分辨率。
主要方法: CV_BLUR CV_BLUR_NO_SCALE CV_MEDIAN CV_GAUSSIAN CV_BILATERAL
2. 图像形态学 cvErode cvDilate cvMorphologyEx
主要作用: 消除噪声 分割等
相关方法
a. 腐蚀 消除噪声斑点
b. 膨胀 连通被噪声、阴影分割的区域
c. 开运算 先腐蚀后膨胀
d. 闭运算 先膨胀后腐蚀
e. 形态梯度
f. "礼貌"
g. "黑帽"
3. 漫水填充算法 cvFloodFill
作用: 标记或者分离图像的一部分。 从输入图像获取掩码区域。
原理: 把邻近区域所有相似点填充为种子点同样的颜色。
4. 尺寸调整 cvResize
ROI的影响
插值方法的选择
5. 图像金字塔 cvPyrDown cvPyrUp cvPyrSegmentation
简介:源于同一原始图像的连续降采样获得的一个图像的集合。
方法:高斯图像金字塔 拉普拉斯图像金字塔
应用:图像分割
6. 阀值化 cvThreshold cvAdaptiveThreshold
一般阀值化
自适应阀值化: 针对有很强照明或反射梯度的图像,需要根据梯度进行阀值化
三、图像的变换
1. 卷积 cvFilter2D
数学公式: z(t)=f(t)*g(t)= ∫f(m)g(t-m)dm
h(x)=(f*g)(x)
描述:变换的基础
卷积核: 参考点 核支撑
计算方法:图像参考点 = Σ 核点*对应图像点
卷积边界: cvCopyMakeBorder
2. 梯度和Sobel导数 cvSobel
导数的计算:最重要且是最基本的卷积
注意: Sobel导数并不是真正的导数,它是离散空间的拟合。
用大核可以对导数有更好的逼近。
scharr滤波器: sobel算子小核时精度低,应使用scharr滤波器。
3. 拉普拉斯变换 cvLaplace
描述: 二阶导数 二阶Sobel导数
应用: 检测"团块" 边缘检测
4. Canny算子 cvCanny
描述: 轮廓拼装
应用: 边缘检测
5. 霍夫变换
应用: 在图像中寻找直线、圆等其他简单图形的方法。
霍夫线变换 cvHoughLines2霍夫圆变换 (霍夫梯度法) cvHoughCircles
6. 重映射 cvRemap
7. 拉伸 收缩 扭曲 旋转
仿射变换
稠密仿射变换: cvWarpAffine
计算变换矩阵: cvGetAffineTransform cv2DRotationMatrix
稀疏仿射变换: cvTransform
应用于一系列孤立点的映射透射变换:
密集透射变换: cvWarpPerspective
计算变换矩阵: cvGetPerspectiveTransform
稀疏透射变换: cvPerspectiveTransform
8. cvCartToPolar cvPolarToCart
笛卡尔坐标系和极坐标系的转换
9. LogPolar
对数极坐标变换 cvLogPolar
10. 离散傅立叶变换 DFT
http://wenku.baidu.com/view/e3b7f0fdc8d376eeaeaa3187.html
http://wlsyzx.yzu.edu.cn/kcwz/szxhcl/kechenneirong/jiaoan/jiaoan3.htmcvDFT函数(实现了FFT算法)
cvGetOptimalDFTSize cvGetSubRect
cvMulSpectrums
11. 离散余弦变换 DCT
实数的处理 cvDCT
12. 积分图像 cvIntegral
作用:子区域的快速求和
应用:人脸识别
13. 距离变换 cvDistTransform
输入为边缘检测的图像
14. 直方图均衡化 cvEqualizeHist
应用:图像亮度分布比较集中, 将亮度分布范围拉宽
四、直方图
直方图:信息的一种表达方式,数据分布的统计图。
对边缘 色彩 角 亮度等特征的统计
bin:区间 即竖条
1. 数据结构
CvHistogram
2. 操作函数
cvCreateHist
cvQueryHistValue_1D
cvGetHistValue_1D
cvNormalizeHist
cvThreshHist
cvCopyHist
cvGetMinMaxHistValue
cvCalcHist
cvCompareHist (五种比较方法: CV_COMP_CORREL CV_COMP_CHISQR CV_COMP_INTERSECT CV_COMP_BHATTACHARYYA EMD)
寻找相关和匹配
3. 应用
HSV: H(色调) S(饱和度) V(亮度值)
a. EMD 方法 利用直方图的距离测量来代替直方图的匹配策略
光线的变化引起图像颜色值的变化
cvCalcEMD2
b. 反向投影(back projection)
寻找目标
cvCalcBackProject()计算一个像素是否是一个已知目标的一部分
cvCalcBackProjectPatch()计算一块区域是否包含已知的目标 (区域检测器 目标检测器)得到目标图像的概率值, 用cvMinMaxLoc()确定目标在图像的位置
c. 模板匹配 cvMatchTemplate
不是基于直方图。通过在输入图像上滑动图像快对实际的图像快和输入图像进行匹配。
cvNormalize
五、轮廓 cvFindContours()
根据边缘像素(canny)组装成轮廓。
用序列的数据结构表示轮廓信息。
处理的图像: cvCanny()输出图像或者 cvThreshold() cvAdaptiveThreshold()的输出图像
重要概念:轮廓树
外轮廓(c) 内轮廓(h hole)
1. cvFindContours()
输入图像 8通道 二值化的图像2. 方法
cvFindContours
cvStartFindContours
cvFindNextContour
cvSubstituteContour
cvEndFindContour
cvApproxChains3. 绘制轮廓
cvDrawContours4. 轮廓的识别和处理
简化或拟合轮廓,匹配轮廓到模板
a. 多边形逼近
cvApproxPoly
cvFindDominantPoints 寻找关键点
b. 特性概括
长度 其他度量 轮廓矩长度 cvContourPerimeter() cvArcLength
面积 cvContourArea
边界框 cvBoundingRect cvMinAreaRect2
cvMinEnclosingCircle 最小包围圆
cvFitEllipse2 最佳拟合圆c. 几何 几个实用函数
cvMaxRect
cvBoxPoints
cvPointSeqFromMat
cvPointPolygonTest5. 轮廓匹配
a. 矩
轮廓矩:比较2个轮廓最简单的方式
struct CvMoments
cvContoursMoments 输入的是轮廓(CvSeq表示)
cvMoments 输入的是图像
cvGetCentralMoment
cvGetNormalizedCentralMoment
cvGetHuMoments Hu矩是中心矩和归一化矩的线性组合
b. cvMatchShapes 用Hu矩匹配
c. 等级匹配
轮廓树:此处的概念和之前的不同。
轮廓树的创建过程。
比较2个树的相似度。
cvCreateContourTree 创建轮廓树
cvContourFromContourTree
cvMatchContourTrees 比较
六、图像的局部和分割
如何从图像中将目标或部分目标分割出来。
1. 背景减除快速背景建模方法:光照变化不大的室内
codebook方法: 室内外环境,周期性运动 灯光缓慢变化(速度较慢)
背景和前景a. 背景减除缺点
假设:所有像素是独立的。
亮度的变化b. 场景建模
前景与背景的转化
新的前景-旧的前景-背景c. 像素片段
像素在一段时间内变化。
对这种波动建立模型。
cvInitLineIterator
CV_NEXT_LINE_POINT()
d. 帧差
最简单的背景减除方法就是用一帧减去另一帧,将差别作为前景。
cvAbsDiffe. 平均背景法
适用于:背景场景不包含运动的部分,要求光线保持不变。
cvAcc() cvAbsDiff() cvInRange()其他类似cvAcc()的累积函数:cvRunningAvg cvSquareAcc cvMultiplyAcc
f. 高级背景建模(codebook算法)
http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=4648&sid=3d75687ebbd68be7b92b817ec0b10dba
适用于:有运动目标(摇曳的树),有光线的变化方法: 得到每个像素或一组像素的时间序列模型。(消耗大量内存)
codebook(编码本): 一个像素现在的观测值和先前的观测值的比较。
RGB空间
YUV空间、
HSV空间(与亮度相关) // hue色度,saturation纯度,value亮度
codebook算法(注意 它不能处理不同模式的光)
f.1 结构
struct code_book
struct cef.2 方法
update_codebook: 定时调用,训练和学习 (创建codebook模型)
clear_stale_entries: 调用update_codebook一段时间后,调用这个函数做清除操作 (清除很少使用的码本条目)
background_diff: 使用经验模型在先前的背景中将前景目标的像素分割出来f.3 codebook算法操作步骤
见P318(348 )
g. 清除前景的连通部分 (学习开运算 闭运算 轮廓 好的例程)
功能强大的在背景中去除噪声的技术
find_connected_components2. 分水岭算法 cvWatershed
标记图像, 根据标记来分割图像3. 用Inpainting来修补图像 cvInpaint()
修复图像4. 均值漂移分割
cvPyrMeanShiftFiltering: finds the peaks of color distributions over space (从空间考虑)
cvMeanShift (运动跟踪章节): finds the peak of a color-spatial (or other feature) distribution over time(时间考虑)参考图像金字塔(cvPyrUp, cvPyrDown)
5. Delaunay三角剖分和Voronoi划分
Delaunay三角剖分是表现三维形状的基础, 是连接计算机视觉与计算机图形学的桥梁。opencv仅实现了二维的Delaunay三角剖分.
二维的Delaunay三角剖分的应用: 运动场景跟踪 目标识别 不同摄像机的场景匹配
七、运动与跟踪
1. 跟踪基础
识别: 矩 颜色直方图
跟踪视觉上重要的关键点,而不是整个物体。
lucas-Kanade Horn-Schunk方法 (稀疏和稠密光流)
建模:2. 寻找角点 cvGoodFeaturesToTrack
关键点,特征点一个点在两个正交的方向都有明显的导数。
Harris角点: 角点位于图像二阶导数的自相关矩阵有两个最大特征值的地方。
同时对移动和旋转不变3. 亚像素角点 cvFindCornerSubPix
精确测量
应用: 标定,跟踪,三维重建4. 不变特征
SIFT5. 光流
a. 稀疏光流
a.1 LK算法 cvCalcOpticalFlowLK
感兴趣点的小窗口。
缺点: 点会移出小窗口
a.1.1 原理
3个假设 亮度恒定;时间连续或者运动是"小运动;空间一致
v = - It/Ixa.1.2 一维光流
前2个假设
(迭代的方法解决假设不十分正确的情况)a.1.2 二维光流
考虑第3个假设解不定方程
a.2 金字塔LK算法 cvCalcOpticalFlowPyrLK
解决大而不连贯的运动,即不满足小而连贯的假设
b. 稠密光流
b.1 Horm-Schunck
cvCalcOpticalFlowHS
b.2 块匹配方法
cvCalcOpticalFlowBM6. MEAN-SHIFT CAM-SHIFT
a. mean-shift cvMeanShift
通用方法,可以跟踪物体的运动b. cam-shift cvCamShift
建立在mean-shift之上,跟踪视频中尺寸可能产生变换的目标
窗口可以调整7. 运动模板
应用: 姿态识别
实心轮廓的获取建立模板:cvUpdateMotionHistory (需要传入轮廓)
计算梯度:cvCalcMotionGradient
分割: cvSegmentMotion8. 预估器
应用:目标跟踪
分两个阶段: 预估阶段 校正阶段a. Kalman Filter
b. Condensation Algorithm 粒子滤波(参考书 probalistic robotic)
http://zhengjunliu360.blog.163.com/blog/static/53797102201032734617104/
八、 标定
http://www.vision.caltech.edu/bouguetj/calib_doc/
http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=4603
张正友经典的论文《A Flexible New Technique for Camera Calibration》
针孔模型
透镜的畸变
标定过程: 摄像机几何模型 透镜的畸变模型
单应变换 homograph transform2件事情: 矫正畸变效应;
根据获得的图像重构三维场景1. 摄像机模型
针孔模型
主点: 光轴与图像平面的交点
cx, cy: 芯片通常不在光轴上,故引入这2个变量
fx = F * sx fy = F * sy
x = f*(X/Z) ---> xs = fx*(X/Z) + cxa. 基本投影几何
投影变换
q = M*Q
M 为(fx, fy, cx, cy)表示的摄像机内参数矩阵
Q: 物理点
q: 图像平面的点(用投影变换的n+1维坐标表示)cvConvertPointsHomogenious: 齐次坐标处理函数
b. 透镜畸变
针孔成像光线少,且成像慢,故使用透镜,但是会引入畸变。
径向畸变:来自透镜的形状。
远离中心,畸变越厉害,便宜的网络摄像机非常厉害。
xc = x(1+k1*r*r+k2*r*r*r*r+k3*r*r*r*r*r*r) 注意r的影响切向畸变:来自整个摄像机的组装过程;透镜本身与图像平面不平行造成的。
xc = x+[2*p1*y+p2*(r*r+2x*x)]畸变向量: k1 k2 p1 p2 k3
2. 标定 cvCalibrateCamera2
标定方法: 摄像机对准一个有很多独立可标识点的物体。通过旋转和移动物体,
在不同角度观看这个物体,可以利用通过每个图像计算摄像机的相对位置
和方向以及摄像机的内参数。
a. 旋转矩阵和平移向量
摄像机坐标系 物体坐标系(世界坐标系) <之前的公式是建立在一个坐标系的>
Pc = R*(Po - T)
3个旋转+3个平移 共6个参数6+4个内参数 = 10 至少需要2个视角??
b. 棋盘 cvFindChessboardCorners
OPENCV不是使用基于3D构造物体的视场,而是使用平面物体的多个视场。
cvFindCornerSubPix()提高精度
cvDrawChessboardCorners
c. 单应性变换 homograph transform
单应性:从一个平面到另一个平面的投影映射。 (Z = 0)
如二维平面上的点映射到摄像机成像仪上的映射。
q = s*M*W*Q
W = [R t] 物理变换
M: 内参矩阵
H = s*M*W 单应性矩阵
关注点: 不是空间中所有的Q,而只是平面上的Q, 故使Z = 0。
opencv 正是利用从多个视场计算多个单应性矩阵的方法来求解摄像机内参数。cvFindHomographyd. 摄像机标定 cvCalibrateCamera2
为摄像机内参数和畸变参数进行摄像机标定。
d.1.
至少需要10幅 7X8的图像
d.2 cvFindExtrinsicCameraParams2 只计算外参数3. 矫正
a. cvUndistort2
b. cvInitUndistortMap cvRemap
c. cvUndistortPoints4. 标定完整程序
5. cvRodrigues2
函数提供2种表示之间的相互转换旋转的表示方法:
直观的方法: 向量r表示
简单的方法: 旋转矩阵R
九、投影和三维视觉
十、机器学习
http://cs229.stanford.edu/materials.html 网络资料
1. 基本概念
目的:把数据转换为信息。1.1 训练集和测试集
特征
"聚类"算法 "分类"算法训练集 测试集 (验证集)
分类器训练分类器的方法
1.2 监督数据和无监督数据
监督数据: 数据有标签(人脸有年龄) 分类
无监督数据: 数据无标签 聚类分类 回归
无监督的聚类数据经常形成一个特征向量供更高层的有监督的分类器使用。
两个典型的机器学习任务: 分类 聚类
计算机视觉的两个基本任务:识别 分割1.3 生成模型和判别模型
判别算法
产生式算法1.4 机器学习算法
Mahalanobis (归一化特征的方差) 非分类和聚类算法
K均值 非监督的聚类方法
朴素贝叶斯分类器 通用的分类器
决策树 判别分类器
Boosting 多个判别子分类器的组合
随机森林 由决策树组成的"森林"
人脸检测/Harr分类器 巧妙使用Boosting
期望最大化(EM)
K近邻 最简单的分类器
神经网络 (字符识别)
支持向量机(SVM) 分类和递归1.5 视觉中使用机器学习算法
(特征)
采集数据 www.flicker.com(图片网站)
给数据定标签 (http://www.mturk.com/mturk/welcome)
提取特征 (直方图 色彩 ) 处理(归一化)
训练集 测试集 验证集
选择分类器(计算速度 数据形式 内存大小)1.6 特征向量的重要性
决策树
随机森林用途:减少分类器需要考虑的特征的个数。
Breiman的变量重要性算法步骤:见P536 (P506)1.7 诊断机器学习中的问题
Andrew Ng“Advice for Applying Machine Learning”
(http://www.stanford.edu/class/cs229/materials/ML-advice.pdf)
a. 大量数据比少量数据好
b. 好的特征比好的算法更重要选取特征:
最大化它们的独立性
最小化它们在不同环境之下的变化。
c. 欠拟合 模型假设太严格
训练和测试都不好
d. 过拟合 学习了噪声等
训练很好 测试不好
e. 常见问题解决 见表13-2f. 评价分类器的性能
交叉验证 自抽样法 ROC曲线 混淆矩阵2. ML
2.1 函数
save
load (先调用clear)
clear
train
predict
CvStatModel
write
read2.2 train
(行,列) =(数据样本,特征变量)2.3 predict
2.4 迭代次数
3. Mahalanobis
有些分类器(K邻近)很难处理方差很大的数据
cvCalcCovarMatrix 计算协方差矩阵
cvInvert 计算逆矩阵
cvMahalanobis4. K-mean cvKMeans2
聚类算法问题和解决: 方差最小
5. 朴素贝叶斯分类
最简单监督学习分类器6. 二叉决策树
回归不纯度
分类不纯度
度量: 熵 吉尼系数 错分类特征的重要性 get_var_importance()
过拟合: 先建立树,然后修剪
(转)OpenCV 基本知识框架的更多相关文章
- 2016年6月20日 JAVA知识框架
基于 J2EE 列举的知识架构,大体列举开发基础知识.帮助我随时查缺补漏,奉行好记性不如烂笔头.写了这该随笔,以便后续查询. 1 JAVA简介 2 JAVA编程环境 3 JAVA基本编程结构 4 ...
- css基本知识框架图
css基本知识框架:(一:基本知识缩影.二基本知识框架图) 1.css样式表的基本概念 2.样式表基本类型-----1.内嵌样式 2.内联样式3.链入外部样式表4.导入外部样式 3.样式表配置方法 4 ...
- 项目管理知识框架PMBOK(文字版)
项目管理知识框架PMBOK 项目整体管理[I](Integration) 1. 制定项目章程(Develop Project Charter) 2. 制定项目初步范围说明书(Develop Pre ...
- css基本知识框架(转)
css基本知识框架: 1.css样式表的基本概念 2.样式表基本类型-----1.内嵌样式 2.内联样式3.链入外部样式表4.导入外部?式 3.样式表配置方法 4.字体属性----1.font-fam ...
- 分析技术和方法论营销理论知识框架,营销方面4P、用户使用行为、STP,管理方面5W2H、逻辑树、金字塔、生命周期
原文:五种分析框架:PEST.5W2H.逻辑树.4P.用户使用行为 最近在一点点的啃<谁说菜鸟不懂得数据分析>,相当慢,相当的费脑力,总之,真正的学习伴随着痛苦:) 最初拿到这本书的时候, ...
- DBA 需要掌握的知识框架及工作内容
知识框架 1. 数据库的工作原理以及体系结构 2. 数据库管理(管理数据库和数据库对象) 3. 数据库备份和恢复 4. 数据库故障处理 5. 数据库补丁安装及升级 6. 数据库性能 工作内 ...
- 随笔编号-16 JAVA知识框架
基于 J2EE 列举的知识架构,大体列举开发基础知识.帮助我随时查缺补漏,奉行好记性不如烂笔头.写了这该随笔,以便后续查询. 1 JAVA简介 2 JAVA编程环境 3 JAVA基本编程结构 4 ...
- 《Linux与Qt程序设计》知识框架
本文主要是通过一本书来大致了解Qt开发的框架,不对具体内容做详细分析. 1.首先弄清楚概念:定义->以自己的话理解是什么-> 实现的是什么功能->用在哪些地方 2.前面认识到的知识点 ...
- OpenCV基础知识介绍
1.图像与矩阵 一般来说,图像是一个标准的矩形,有着宽度(width)和高度(height).而矩阵有着行(row)和列(column),矩阵的操作在数学和计算机中的处理都很常见且成熟,于是很自然的就 ...
随机推荐
- List<List<model>>如何更快捷的取里面的model?
访问接口返回数据类型为List<List<model>>,现在想将其中的model插入数据库,感觉一点点循环有点傻,0.0...,各位有没有其他的方法? List<Lis ...
- 逻辑学总结x
逻辑学是研究事实联系: 肯定.否定: 条件 结论: 联系 规则: 的学问.
- 用Electron开发企业网盘(二)--分片下载
书接上文,背景见:https://www.cnblogs.com/shawnyung/p/10060119.html HTTP请求头 Range 请求资源的部分内容(不包括响应头的大小),单位是by ...
- Ubuntu 环境下的mysql 远程访问,redis 远程访问和设置密码 ,mongo 安装 ,设置用户密码,开启远程访问
MySQL远程访问 1.编辑mysql配置文件,把其中bind-address = 127.0.0.1注释了 vi /etc/mysql/mysql.conf.d/mysqld.cnf 2.使用roo ...
- Android-Volley网络通信框架(StringRequest & JsonObjectRequest)
1.回想 上篇对 Volley进行了简介和对它的学习目的与目标,最后,为学习Volley做了一些准备 2.重点 2.1 RequestQueue 请求队列的建立 2.2 学习 StringReques ...
- 最全Pycharm教程(10)——Pycharm调试器总篇
最全Pycharm教程(1)--定制外观 最全Pycharm教程(2)--代码风格 最全Pycharm教程(3)--代码的调试.执行 最全Pycharm教程(4)--有关Python解释器的相关配置 ...
- Ubuntu14环境下minigui安装问题记录--object.lo错误
minigui3.0.12在Ubuntu14上面编译只是去?出现这个错误:object.h:275:9: error: incompatible types when assigning to typ ...
- 智课雅思短语---二、exert positive/ negative effects on…
智课雅思短语---二.exert positive/ negative effects on… 一.总结 一句话总结:对…产生有利/不利的影响 1.the advantages far outweig ...
- POJ 1293 网络流 第一题
完全的模板,做多了就好了吧 反向流量真的很有意思,有这样一种说法比较容易理解.”正向是+,反向就是-,其实是等价的.因为每次找到的增广路不一定是最优解里面的,所以再进行后面的操作的时候要重新选择,而反 ...
- Android Retrofit网络请求Service,@Path、@Query、@QueryMap、@Map...
http://blog.csdn.net/jdsjlzx/article/details/51607867