您的位置:首页 > 运维架构

opencv基础学习笔记

2016-04-30 08:35 260 查看
OpenCV具有模块化结构,这意味着程序包中包含着一些动态和静态的库。以下列出的是可用的模块:

core(核心)——这个紧凑的模块定义了一些基础的数据结构,包括密集型多维数组Mat和一些其他模块将会用到的基础函数。

imgproc(图像处理)——在图像处理模块中包括了线性和非线性的图像滤波功能,几何变换(调整大小、仿射、透视、重映射等),色彩空间变换,以及直方图操作等等。

video(视频)——视频分析模块包括了包括了运动估计、背景提取、对象追踪等功能。

calib3d(3D标定)——基本的多视角几何算法、相机标定、目标姿势估计、立体对应算法和3D重构等。

features2d(2D特征)——特征检测、描述和模式匹配。

objdetect(目标检测)——对预先定义好的的物体和实例进行检测(例如人脸、眼睛、被子、人、汽车等等)。

highgui——一个简单易用的视频捕捉、图片和视频编码接口,以及简单的UI实现。

gpu——区别于其他OpenCV模块的GPU加速算法。

……一些其他的帮助模块,例如函数链接型神经网络、Google测试封装、Python绑定等等。

均值滤波:使用邻域像素均值计算替代。采用加权平均值计算,算法简单快速,但不能保护好图像细节,高斯滤波(正态)

中值滤波:使用邻域像素中间值替代。在去除脉冲噪声、椒盐噪声的同时又能保留图像边缘细节,比均值慢好几倍。

双值滤波:结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。

膨胀与腐蚀(Dilation与Erosion):

消除噪声

分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。

寻找图像中的明显的极大值区域或极小值区域

求出图像的梯度

开运算(Opening Operation),其实就是先腐蚀后膨胀

闭运算:先膨胀后腐蚀

形态学梯度(Morphological Gradient)为膨胀图与腐蚀图之差,数学表达式如下:

顶帽运算(Top Hat),原图与开运算之差

黑帽(Black Hat)运算为”闭运算“的结果图与原图像之差

边缘检测的一般步骤

1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。常见的滤波方法主要有高斯滤波,即采用离散化的高斯函数产生一组归一化的高斯核(具体见“高斯滤波原理及其编程离散化实现方法”一文),然后基于高斯核函数对图像灰度矩阵的每一点进行加权求和(具体程序实现见下文)。

2)增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在具体编程实现时,可通过计算梯度幅值来确定。

3)检测:经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定的应用中,这些点并不是我们要找的边缘点,所以应该采用某种方法来对这些点进行取舍。实际工程中,常用的方法是通过阈值化方法来检测。
Canny算子,Sobel算子,Laplace算子以及Scharr滤波器(canny算子本身就是一个高斯滤波的函数,应该不用滤波,改变两个参数阈值可设置频率范围)

漫水填充:功能类似ps魔术棒,相似颜色填充颜色

角点检测:可用于特征检测

重映射:就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。


SURF特征点检测

SURF是尺度不变特征变换算法(SIFT算法)的加速版。SURF最大的特征在于采用了harr特征以及积分图像的概念,这大大加快了程序的运行时间。SURF可以应用于计算机视觉的物体识别以及3D重构中。

使用 FeatureDetector 接口来发现感兴趣点。

使用 SurfFeatureDetector 以及其函数 detect 来实现检测过程

使用函数 drawKeypoints 绘制检测到的关键点。


仿射变换

仿射变换(Affine Transformation或 Affine Map),又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。它保持了二维图形的“平直性”(即:直线经过变换之后依然是直线)和“平行性”(即:二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。

一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式。

那么, 我们能够用仿射变换来表示如下三种常见的变换形式:

旋转,rotation (线性变换)

平移,translation(向量加)

缩放,scale(线性变换)

使用OpenCV函数warpAffine 来实现一些简单的重映射.

使用OpenCV函数getRotationMatrix2D 来获得旋转矩阵。


SURF特征匹配示例程序

这个示例程序中,我们利用SurfDescriptorExtractor类进行特征向量的相关计算。

程序利用了SURF特征的特征描述办法,其操作封装在类SurfFeatureDetector中,利用类内的detect函数可以检测出SURF特征的关键点,保存在vector容器中。第二步利用SurfDescriptorExtractor类进行特征向量的相关计算。将之前的vector变量变成向量矩阵形式保存在Mat中。最后强行匹配两幅图像的特征向量,利用了类BruteForceMatcher中的函数match。

程序的核心思想是:

使用 DescriptorExtractor 接口来寻找关键点对应的特征向量。

使用 SurfDescriptorExtractor 以及它的函数 compute 来完成特定的计算。

使用 BruteForceMatcher 来匹配特征向量。

使用函数 drawMatches 来绘制检测到的匹配点。


vector<vector<Point>>contours; vector<Vec4i>hierarchy;

contours被定义成二维浮点型向量,这里面将来会存储找到的边界的(x,y)坐标。vector<Vec4i>hierarchy是定义的层级。这个在找边界findcontours的时候会自动生成,这里只是给它开辟一个空间。将来findContours( src, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0) );就能算出边界的坐标,存在contours里面。



camShift跟踪算法介绍

/article/2724698.html

利用HOG特征方向梯度直方图(Histogram of Oriented
Gradient, HOG)来进行行人检测

/article/1376255.html

背景剪除和OpenCV中的实现(背景前景分离运动物体)

背景与前景的分离如果是纯静态则则上一张图片减当前图片的,背景此时应该为0(一定范围阀值可以容许),可以是均值

/article/1376256.html

光流的概念:

是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。

需要提醒的是,利用光流法进行运动物体检测时,计算量较大,无法保证实时性和实用性。


OpenCV视频读取播放,视频转换为图片

http://blog.csdn.net/zhonghuan1992/article/details/38469315

车辆识别可以采用高斯混合模型区分前景和背景,找出运动车辆

几种转换图片成灰度图片的方式:

//Mat bw = threshval < 128 ? (frame < threshval) : (frame > threshval);

//Mat src;

//bw.convertTo(src, CV_8UC1);

//Mat grey;

//cvtColor(img, gray, CV_BGR2GRAY); //实测用这个生成的可以用于边缘检测

//threshold(src1, threshImg, thresh, 255, CV_THRESH_BINARY);
//自适应二值化,据说堪比边缘检测
void cvAdaptiveThreshold( const CvArr* src, CvArr* dst, double max_value,
int adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C,
int threshold_type=CV_THRESH_BINARY,
int block_size=3, double param1=5 );


//void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: