OpenCV学习笔记

第一章概述OpenCV 是有Intel公司资助的开源计算机视觉库,它由一系列C函数和少量C++类构成,实现图像处理和计算机视觉方面的很多通用算法。

1、OpenCV的特征(1)开源计算机视觉库采用C/C++编写(2)使用目的是开发实时的应用程序(3)独立于操作系统、硬件和图形管理器(4)具有通用的图像/视频载入、保存和获取模块(5)具有底层和高层的应用开发包2、OpenCV的功能(1)对图像数据的操作,包括分配、释放、复制、设置和转换数据(2)对图像和视频的输入输出,指文件和摄像头作为输入,图像和视频文件作为输出(3)具有对矩阵和向量的操作及线性代数的算法程序,包括矩阵积、解方程、特征值以及奇异值(4)可对各种动态数据结构,如列表、队列、集合、树和图等进行操作(5)具有基本的数字图像处理能力,如可以进行滤波、边缘检测、角点检测、采样于差值、色彩转换、形态操作、直方图和图像金字塔等操作(6)对各种结构进行分析,包括连接部件分析、轮廓处理、距离变换、各种距的计算、模板匹配、Hough变换、多边行逼近、直线拟合、椭圆拟合、和Delaunay三角划分等(7)对摄像头的定标,包括发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计和立体对应(8)对运动的分析,如对光流、运动分割和跟踪的分析(9)对目标的识别,如可采用特征法和隐马尔科夫模型(HMM)法(10)具有基本的GUI功能,包括图像与视频显示、键盘和鼠标事件处理及滚动条等(11)课对图像标注,如对线,二次曲线和多边行进行标注3.OpenCV模块∙cv –核心函数库∙cvaux –辅助函数库∙cxcore –数据结构与线性代数库∙highgui – GUI函数库∙ml –机器学习函数库第3章OpenCV基础3.1 OpenCV命名规则1、函数命名规则通用函数名为cvActionTargetMod(……)其中,Action 表示核心函数(如:set,create)Target表示目标图像区域(如:轮廓,多边形)Mod表示可选变种(如:变量类型)2、矩阵数据类型通用矩阵数据类型为CV_<bit_depth>(S|U|F)C<number_of_channels>其中,S表示带符号整数U表示无符号整数F表示浮点数例如:CV_8UC1表示8位无符号单通道矩阵3、图像数据类型通用图像数据类型为IPL_DEPTH_<bit_depth>(S|U|F)例如:IPL_DEPTH__8U表示无符号整数图像4、头文件#include<cv.h>#include<cvaux.h>#include<highgui.h>#include<cxcore.h>//不是必须的,它包含在cv.h中3.2基本数据结构1、图像结构OpenCV中德所有图像采用同一个结构IplImage2、矩阵与向量结构OpenCV采用一种独特的结构CvArr*,该结构是一个通用数组的变现形式,用做函数的参数,说明函数在调用该函数时接受多种类型的输入数据形式。

3、其他数据结构(1)点的表示点的数据结构有以下三种:CvPoint p=cvPoint(int x,int y)CvPoint2D32f p=CvPoint2D32f(float x,float y)CvPoint2D32f p=CvPoint2D32f(float x,float y,float z)(2)长方形维数的表示表示长方形维数的数据结构及用法CvSize r=cvSize(int width,int height)CvSizeD32f r=cvSize32f(float width,float height)(3)有偏移量的长方形表示CvRect r=cvRect(int x,int y,int width,int height)3.3 矩阵的使用与操作3.3.1 分配与释放矩阵在OpenCV中,向量被当成行货列为1的矩阵,并且矩阵在内存中德存储方式是按行存储,且每行按4字节对齐。

(1)分配矩阵分配矩阵的函数原型为:CvMat* cvCreateMat(int rows,int cols,int type)其中type表示矩阵元素的类型,可以用如下形式表达CV_<bit_depth> (S|U|F)C<number_of_channels>(2)释放矩阵释放矩阵的函数原型为void cvReleaseMat(CvMat**)(3)复制矩阵复制矩阵的函数原型CvMat *cvCloneMat(CvMat*)3.3.2 访问矩阵元素若访问一个浮点数矩阵的第i行第j列元素,可采用以下几种方式(1)直接访问M(i,j)cvmSet(M,i,j,2.0)//SET M(i,j)(2)已知对齐方式的直接访问3.4 GUI命令3.4.1 窗口管理(1)创建及定位一个窗口cvNamedWindow("wins",CV_WINDOW_AUTOSIZE)cvMovewindow("win1",100,100)//偏移量从屏幕的左上角算起(2)加载一副图像具体事例IplImage * image=0;Img=cvLoadImage(fileName)If(img)printf(“Could not load image file:%s \n”,filename);(3)显示一副画像具体操作语句实例为:cvShowImage("win1",img)(4)关闭窗口cvDestroyWindow(“win1”)(5)缩放窗口cvResizeWindow(“win1”,100,100)IplImage数据结构IplImage结构Typedef struct _IplImage{Int nSize;Int ID;Int nChannels;Int alphaChannel;Int depth;Char colorModel[4];Char channelSeq;Int dataOrder;//////值可以是IPL_DATA_ORDER_PIXE指明数据将像素点不同通道的值交错排在一起和LIPL_DATA_ORDER_PLANE把所有的像素同通道值排在一起,形成通道平面,在把平面排列在一起;Int origin;/////////有两种取值:IPL_ORIGIN_TL和IPL_ORIGIN_BL分别是设置坐标原点位于图像的左上角或左下角Int aligin;Int width;Int height;Struct _IplTOI* roi;Struct _IplImage* maskROI;V oid* imaged;Strcut _IplTileInfo* tileInfo;Int imageSize;Char* imageData;//////////包含一个指向第一行图像数据的指针Int widthStep; /////////包括相邻行的同列点之间的字节数Int borderMode[4];Int BorderConst[4];Char* imageDataOrigin;} IplImage;对ROI和widthStep的补充设置ROI可以使用函数cvSetImageROI()并为其传递一个图像指针和矩形;取消ROI,只需要为函数cvRestImageROI()传递一个图像指针。

V oid cvSetImageROI(IplImage* image,CvRect rect);cvRestImageROI(IplImage* image);矩阵和图像的操作矩阵和图像的基本操作1、cvAbs 计算数组中所有元素的绝对值2、cvAbsDiff 计算两个数组差值的绝对值3、cvAbsDiffS 计算数组和标量差值的绝对值4、cvAdd 两个数组的元素级的加运算5、cvAddS 一个数组和一个标量的元素级的相加运算6、cvAddWeighted 两个数组的元素级的加权相加运算7、cvAvg 计算数组中所有元素的平均值8、cvAvgSdv 计算数组中所有元素的绝对值和标准差9、cvCalcCovarMatrix 计算一组n维空间向量的协方差10、cvCmp 对两个数组中德所有元素运用设这的比较操作11、cvCmpS 对数组和标量运用设置的比较操作12、cvConvertScale 可选的缩放值转换数组元素类型13、cvConvertScaleAbs 计算可选的缩放值的绝对值之后再转换数组元素的类型14、cvCopy 把数组中德值复制到另一个数组中15、cvCountNonZero 计算数组中非0值的个数16、cvCrossProduct 计算两个三维向量的向量积(叉积)17、cvCvtColor 将数组的通道从一个颜色空间转换另一个颜色空间18、cvDet 计算方阵的行列式19、cvDiv 用另外一个数组对一个数组进行元素级的除法运算20、cvDotProduct 计算两个向量的点积21、cvEigenVV 计算方阵的特征值和特征向量22、cvFilp 围绕选定的轴翻转23、cvGEMM 矩阵乘法24、cvGetCol 从一个数组的列中复制元素25、cvGetCol s 从元素相邻的多列中复制元素值26、cvGetDiag 复制数组中对角线上的所有元素27、cvGetDIms 返回数组的维数28、cvGetDImSize 返回一个数组的所有维数的大小29、cvGetRow 从一个数组的行中复制元素值30、cvGetRows 从一个数组的对个相邻的行中复制元素值31、cvGetSize 得到二维的数组的尺寸。

以CvSize返回32、cvGetSubRect 从一个数组的子区域复制元素值33、cvInRange 检查一个数组的元素是否在另外两个数组的值的范围内34、cvInRangeS 检查一个数组的元素的值是否在另外两个标量的范围内35、cvInvert 求矩阵的转置36、cvMahalonobis 计算两个向量间的马氏距离37、cvMax 在两个数组中进行元素级的取最大值操作38、cvMaxS 在一个数组和一个标量中进行元素级的取最大值操作39、cvMerge 把几个单通道图像合并为一个多通道图像40、CvMin 在两个数组中进行元素级的取最小值操作41、cvMinS 在一个数组和一个标量中进行元素级的取最小值操作42、cvMinMaxLoc 寻找数组中最大值最小值43、cvMul 计算两个数组的元素级的乘积44、cvNot 按位对数组中德每个元素求反45、cvNorm 计算两个数组的正态相关性46、cvNormalize 将数组中元素进行规一化47、cvOr 对两个数组进行按位或操作48、cvOrs 在数组与变量之间进行按位或操作49、cvReduce 通过给定的操作符将二维数组约简为向量50、cvRepeat 以平铺的方式进行数组复制51、cvSet 用给定值初始化数组52、cvSetZero 将数组中所有元素初始化为053、cvSetIdenty 将数组中对角线上的元素设为1,其他设置054、cvSolve 求出线性方程组的解55、cvSplit 将多通道所组分割成多个单通道数组56、cvSub 两个数组元素级的相减57、cvSubs 元素级的从数组中减去标量58、cvSubRS 元素组中德所有元素求和59、cvSum 对数组中德所有元素求和60、cvSVD 二维矩阵的奇异值分解61、cvSVBkSb 奇异值回代计算62、cvTrace 计算矩阵迹63、cvTranspose 矩阵的转置运算64、cvXor 对两个数组进行按位异或操作65、cvXorS 在数组和变量之间进行按位异或操作66、cvZero 将所有数组中德元素置为01、cvAbs、cvAbsDiff 和cvAbsDiffsV oid cvAbs{////////计算src里德值绝对值,然后把结果写到dstConst CvArr* src,Const dst};V oid cvAbsDiff{//////////先从src1减去src2,然后将所得差的绝对值写到dst Const CvArr* src1,Const CvArr* src2,Const dst};V oid cvAbsDiffs{Const CvArr* src,CvScalar value,Const dst};2、cvAdd,cvAddS,cvAddWeighted和alphaV oid cvAdd{///////////简单的加法,把src1里的所有元素对应进行相加,然后结果放到dst中,如果mask没有被设为null,那么有mask中非零元素指定dst元素值为在函数执行后不变Const CvArr* src1,Const CvArr* src2,CvArr* dst;Const CvArr* mask=NULL};V oid cvAddS{////////Const CvArr* src,CvScalar value,CvArr* dst;Const CvArr* mask=NULL};V oid cvAddWeighted {////////两个图像src1和src2融合成dst,src1的融合度为alpha,src22 的融合度为beta;dst=α*src1+β*src2+γ;Const CvArr* src1,Double alpha,Const CvArr* src2,Double beta,Double gamma,CvArr* dst};cvAnd和cvAndSV oid cvAnd{////在src1数组上进行与运算结果在dst中Const CvArr* src1,Const CvArr* src2,CvArr* dst;Const CvArr* mask=NULL};V oid cvAndS{在src1数组上进行与运算,位于运算有常标量value得出,若mask非空,只计算得0 mask元素所对应的dst元素。

合集下载

OpenCV学习笔记二

OpenCV学习笔记二

OpenCV学习笔记(二)五形态学操作形态学操作简单来讲,形态学操作就是基于形状的一系列图像处理操作。

通过将结构元素作用于输入图像来产生输出图像。

最基本的形态学操作有二:腐蚀与膨胀(Erosion 与Dilation)。

他们的运用广泛:消除噪声分割(isolate)独立的图像元素,以及连接(join)相邻的元素。

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

腐蚀操作腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。

它提取的是内核覆盖下的相素最小值。

进行腐蚀操作时,将内核B 划过图像,将内核B 覆盖区域的最小相素值提取,并代替锚点位置的相素。

我们使用腐蚀操作。

从下面的结果图我们看到亮区(背景)变细,而黑色区域(字母)则变大了。

腐蚀操作函数原型:void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )1可以看到前三个是必要的参数,后面都有默认的参数。

InputArray kernel腐蚀操作的内核膨胀操作此操作将图像A 与任意形状的内核(B),通常为正方形或圆形,进行卷积。

内核B 有一个可定义的锚点, 通常定义为内核中心点。

进行膨胀操作时,将内核B 划过图像,将内核B 覆盖区域的最大相素值提取,并代替锚点位置的相素。

显然,这一最大化操作将会导致图像中的亮区开始”扩展”(因此有了术语膨胀dilation )void dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )12开运算(Opening)开运算是通过先对图像腐蚀再膨胀实现的。

opencv3编程入门学习笔记(一):基本函数介绍

opencv3编程入门学习笔记(一):基本函数介绍

opencv3编程⼊门学习笔记(⼀):基本函数介绍滤波blur (均值滤波)均值滤波是典型的线性滤波算法,主要⽅法为领域平均法(即⽤⼀⽚图像区域的各个像素的平均值来代替原图像中的各个像素值)缺点:不能很好的保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从⽽使图像变得模糊。

函数原型:void blur(InputArray src, OutputArrary dst, Size ksize , Point anchor=Point(-1, -1), int borderType = BORDER_DEFAULT)ksize : 核⼤⼩(kerneal size ),有点类似卷积核阈值化阈值可以被视为最简单的图像分割⽅法(基于图像中物体与背景之间的灰度差异)。

为了从图像中提取我们需要的部分,应该⽤图像中的每⼀个像素点的灰度值与选取的阈值进⾏⽐较,并进⾏相应的判断。

⼀旦找到了需要分割的物体的像素点,可以对这些像素点设定⼀些特定的值来表⽰。

可以将物体的像素点的灰度值设为 ”0“ (⿊⾊),其他像素点的灰度值为 ”255“ (⽩⾊)threshold (固定阈值操作)对灰度图像进⾏阈值操作,得到⼆值图像double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)src: 输⼊单通道数组dst: 处理后的结果thresh: 阈值的具体值maxval: 当像素值满⾜条件时,给该像素赋的值type : CV_THRESH_BINARY 、CV_THRESH_BINARY、CV_THRESH_BINARY_INVfindContours(InputArray img, OutputArray conours, OutputArray hierarchy, int mode, int method, Point offset=Point())img: 输⼊图像,需要为8 位单通道图像contours: 每个轮廓为⼀组点向量hierarchy:mode: 轮廓检索模式,。

Opencv学习笔记

Opencv学习笔记

Opencv 学习笔记软软件件下下载载:: /projects/opencvlibrary//index.php/Download/一、opencv 模块(主要):CV 主要的OpenCV 函数:图像处理与视觉算法;ML 机器学习、模式分类和回归分析,统计分离器;HighGUI 图像视频输入/出; CXcore 数据结构与线性代数支持,基本函数;二、常用的视频和图像处理:视频处理:以下处理的demo 在 <opencv-root>/samples/c/彩色跟踪 (camshiftdemo );点跟踪 (lkdemo );运动分割 (motempl);边缘检测 (laplace);图像处理: 以下图像的处理demo 在 <opencv-root>/samples/c/边缘检测 (edge);分割 ( pyramid_segmentation);形态学操作 (morphology);直方图 (demhist);距离变换 (distrans);椭圆拟合 (fitellipse);三、命名规则:OpenCV 使用近似匈牙利命名法的方法,比较值得一提的特色是:它的数据结构几乎都 是大写的Cv 开头,而它提供的函数都是小写的cv函数名:cvActionTargetMod(...) 提高了函数的可读性,指明用什么动作,哪个目标,用什么方法Action = 核心功能(core functionality ) (e.g. set, create)Target = 目标图像区域(target image area ) (e.g. contour, polygon)Mod = (可选的)调整语(optional modifiers ) (e.g. argument type)常遇到的状况有四种:1.cvActionTarget() E.g.:cvCreateImage(),cvNamedWindow()2.cvTarget() E.G.: cvMat(),cvSize(),cvPoint()3.cvMethod() E.g.:cvDCT()离散余弦变换算法 常用于算法或某方法4.cvActionMethod() E.g:cvFindContours()轮廓搜寻算法矩阵数据类型:CV_<bit_depth>(S|U|F)C<number_of_channels>Bit_depth = 位数,也叫做深度位数分別有1bit(黑白二值图),8bits,16bits,32bitsNumber_of_channels = 通道数S = 符号整型U = 无符号整型F = 浮点型E.g.: CV_8UC1 是指一个8位无符号整型单通道矩阵,CV_32FC2是指一个32位浮点型双通道矩阵.图像数据类型:IPL_DEPTH_<bit_depth>(S|U|F)E.g.: IPL_DEPTH_8U 图像像素数据是8位无符号整型.IPL_DEPTH_32F图像像素数据是32位浮点型.头文件:#include <cv.h>#include <cvaux.h>#include <highgui.h>#include <ml.h>#include <cxcore.h> // 一般不需要,cv.h 内已包含该头文件四、基础数据结构:CvPoint:OpenCV的基本数据类型之一,表示一个坐标为整数的二维点,是一个包含integer类型成员x和y的简单结构体。

opencv自学笔记

opencv自学笔记

OPENCV一、Opencv 基本架构分析多模块组合起来的一个软件开发工具包(SDK)1、【calib3d】2、【cntrib】3、【core】:核心功能模块。

4、【imgproc】:图像处理模块。

5、【features2d】6、【flann】7、【gpu】8、【highgui】:高层GUI图形用户界面,包含媒体的输入输出、视频捕捉、图像视频的编码和解码、图形交互界面的接口内容等。

9、【legacy】…二、HighGui图形用户界面初步1、opencv的命名空间:opencv的C++类和函数都是定义在命名空间cv之内的,访问方法:(1)、在代码开头的适当位置加上using namespace cv (2)、在使用opencv的每个内和函数时,都加入cv::命名空间。

2、图像的载入:imread()函数Mat imread(const string& filename, int flags=1);(1)、const string&类型的filename,填我们需要载入的图片路径名称。

(2)、int类型的flags,为载入标志,它指一个加载图像的颜色类型。

3、图像的显示:imshow()函数Void imshow(const string& winname, InputArray mat);(1)、const string&类型的winname,填需要显示的窗口标识名称。

(2)、InputArray类型的mat,填需要显示的图像。

4、创建窗口:namedWindow()函数void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE);(1)、const string&类型的name,填写被作用窗口的标识符的窗口名称。

(2)、int类型的flags,窗口的标识,可填写WINDOW_AUTOSIZE、WINDOW_NORMAL或WINDOW_OPENGL5、输出到文件:imwrite()函数bool imwrite(const string& finename, InputArray img , const vector<int>& params=vector<int>() );(1)、const string&类型的finename,填需要写入的文件名。

OPENCV学习笔记

OPENCV学习笔记

OPENCV学习笔记1、键盘响应事件While(1){If(cvWaitKey(100)==27)break;}括号里为延时等待ms等于的数值为ASCLL码(27)ESC建。

2、回调函数callback键盘响应回调函数参数事件位置需要注册回调函数到OPCV中,实现注册的函数是Cvsetmousecallback(){const char*window_name,Cvmousecallback on_mouseVoid param=null.}第一个参数指定了回调函数需要注册到的窗口即产生事件的窗口。

只有在这个指定窗口中发生的事件才会掉用这个函数。

第二个参数为回调函数。

最后,第三个参数用来传递额外的信息给前面的void*param3、OPENCV的基本数据类型Points size rectangles scalar三元结构Cvpoint int x y图像中的点Cvpoint2D32f float x,y二维空间中的点Cvpoint3D32F float x,y,z三维空间中的点Cvsize int width height图像的尺寸Cvrect int x y width height图像的部分区域Cvscalar double val[4]RGBA值假设要在(5,10)(20,30)间画一个白色矩形,只需要简单调用Cvrectangle(Myimg,Cvpoint(5,10)Cvpoint(20,30)Cvscalar(255,255,255)//RGB值全满为白色);3、使用OPENCV时会频繁遇到Iplimage数据类型IplImage是我们用来为通常所说的“图像”进行编码的基本结构。

这些图像可能是灰度,色彩,4通道的(RGB+alpha),其中的每个通道可以包含任意的整数或浮点数。

因此,该类型比常见的、易于理解的3通道8位RGB图像更通用。

Ipllmage由cvmat派生,cvmat由cvarr派生。

opencv学习笔记之cvSobel函数解析

opencv学习笔记之cvSobel函数解析

opencv学习笔记之cvSobel函数解析⾸先,我们来开⼀下计算机是如何检测边缘的。

以灰度图像为例,它的理论基础是这样的,如果出现⼀个边缘,那么图像的灰度就会有⼀定的变化,为了⽅便假设由⿊渐变为⽩代表⼀个边界,那么对其灰度分析,在边缘的灰度函数就是⼀个⼀次函数y=kx,对其求⼀阶导数就是其斜率k,就是说边缘的⼀阶导数是⼀个常数,⽽由于⾮边缘的⼀阶导数为零,这样通过求⼀阶导数就能初步判断图像的边缘了。

通常是X⽅向和Y⽅向的导数,也就是梯度。

理论上计算机就是通过这种⽅式来获得图像的边缘。

但是,具体应⽤到图像中你会发现这个导数是求不了的,因为没⼀个准确的函数让你去求导,⽽且计算机在求解析解要⽐求数值解⿇烦得多,所以就想到了⼀种替代的⽅式来求导数。

就是⽤⼀个3×3的窗⼝来对图像进⾏近似求导。

拿对X⽅向求导为例,某⼀点的导数为第三列的元素之和减去第⼀列元素之和,这样就求得了某⼀点的近似导数。

其实也很好理解为什么它就近似代表导数,导数就代表⼀个变化率,从第⼀列变为第三列,灰度值相减,当然就是⼀个变化率了。

这就是所谓的Prewitt算⼦。

这样近似X⽅向导数就求出来了。

Y⽅向导数与X⽅向导数求法相似,只不过是⽤第三⾏元素之和减去第⼀⾏元素之和。

X⽅向和Y⽅向导数有了,那么梯度也就出来了。

这样就可以找出⼀幅图中的边缘了。

还有⼀个问题,由于求的是3×3中⼼点的导数,所以给第⼆列加了⼀个权重,它的权重为2,第⼀列和第三列的权重为1,好了,这就是Sobel算⼦了。

相⽐Prewitt算⼦,Sobel的抗噪能⼒更强。

如图所⽰:这样,中⼼点的Y⽅向导数就求出来了。

举个例⼦吧。

X点以Sobel⽅式求导数ΔX=1×50+2×30+1×50-(1×50+2×30+1×50)=0。

这样可以看出这个点不是边界。

好了,了解了基本理论之后,我们看看OpenCv下的Sobel函数吧,void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 );src:输⼊图像;dst:输出图像;xorder:x ⽅向上的差分阶数;yorder:y ⽅向上的差分阶数;aperture_size 扩展 Sobel 核的⼤⼩(既窗⼝阶数),必须是 1(注意这是⼀个3×1或1×3向量⽽不是⼀个⽅阵), 3, 5 或 7。

基础学习笔记之opencv:直方图使用学习

目的:直方图在cv领域到处可见,因为其功能在cv算法的实现中必不可少。

Opencv库中也集成了关于直方图的不少函数,比如直方图的计算,均衡,归一化,相似度比较等等。

为了体验这些函数,做了个小实验,功能是:打开摄像头,鼠标选定一个框,框内图像作为标准图像,计算出其直方图并显示出来;然后继续鼠标选定框,该框内的图像的直方图与标准图像的进行相似度计算,计算结果在终端输出,数值越大表示相似度越大。

工程环境:opencv2.3.1+vs2010。

工程代码:1// hist_test.cpp : 定义控制台应用程序的入口点。

2//34 #include "stdafx.h"5 #include <opencv2/core/core.hpp>6 #include <opencv2/imgproc/imgproc.hpp>7 #include <opencv2/highgui/highgui.hpp>8 #include <iostream>9 #include <stdio.h>1011usingnamespace cv。

12usingnamespace std。

1314int nFrame_num=0。

15bool pause=false。

16bool tracking=false。

17 Rect preselectROI,selectROI。

//用于存放手选的矩形18bool comp=true。

1920Mat rhist,ghist,bhist。

21int channels[]={0,1,2}。

22//const int histsize[]={256,256,256}。

23constint histsize[]={16,16,16}。

24constint histsize1=16。

25float rranges[]={0,255}。

OpenCV 经典笔记

Opencv 中 open 为openSource ,CV为computer Vision计算机视觉Opencv特征:1.开源计算机视觉库采用C/C++编写2.目的是开发实时应用程序3.独立于操作系统、硬件和图形管理器4.具有通用的图像、视频载入,保存和获取模块5.具有底层和高层的应用开发包Opencv目标:为解决计算机视觉问题提供基本工具基本组成:高层函数、基本函数Opencv模块(主要)1、CV 主要的OpenCV函数:图像处理与视觉算法2、ML 机器学习、模式分类和回归分析,统计分离器3、HighGUI 图像视频输入/出4、CXcore 数据结构与线性代数支持,基本函数常用的视频处理:彩色跟踪,点跟踪,动运分割,边缘检测常用的图像处理:边缘检测,分割,形态学操作,直方图,距离变换,椭圆拟合命名规则:1.通用矩阵数据类型 :CV_(位数)(S|U|F)C(通道数) ---位数也叫作深度S:带符,U:无符,F:浮点, CV_32FC2 :32位浮点数双通道矩阵 2.通用图像数据类型:IPL_DEPTH_(位数)( S|U|F)IPL_DEPTH_8U :8位无符号整数图像一、基础知识1.基础数据结构1.1. CvPointCvPoint 二维坐标系下的点,类型为整型typedef struct CvPoint{int x; /* X坐标, 通常以0为基点 */int y; /* y坐标, 通常以0为基点 */}1.2. CvSize 矩形框大小,以像素为精度typedef struct CvSize{int width; /* 矩形宽 */int height; /* 矩形高 */}1.3.CvRect 矩形框的偏移和大小typedef struct CvRect{int x; /* 方形的最左角的x-坐标 */int y; /* 方形的最上或者最下角的y-坐标 */int width; /* 宽 */int height; /* 高 */}1.4. CvScalar 定义存放1- 4个数值的数组。

opencv 笔记

cvWaitKey(0);
cvDestroyWindow("image");
cvReleaseImage(&img);
return 0;
}
|-- int align; // 图像数据的行对齐: 4 or 8 byte alignment
| // OpenCV 中无此项,采用widthStep代替
|-- char colorModel[4]; // 颜色模型 – OpenCV中忽略此项
IplImage
|-- int nChannels; // 颜色通道数目 (1,2,3,4)
|-- int depth; // 像素的位深:
| // IPL_DEPTH_8U, IPL_DEPTH_8S,
| // IPL_16U,IPL_DEPTH_16S,
| // IPL_DEPTH_32S,IPL_DEPTH_32F,
| // IPL_DEPTH_64F
CVAPI(CvScalar) cvGet2D( const CvArr* arr, int idx0, int idx1 );
cvSet2D 给某个点赋值。
CVAPI(void) cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value );
|-- char *imageDataOrigin; // 图像数据未对齐时的数据原点指针
| // (需要正确地重新分配图像内存 )
| // (needed for correct image deallocation)
pixel = cvGet2D(img, i, j);
printf("B=%f,G=%f,R=%f\t", pixel.val[0], pixel.val[1], pixel.val[2]);

OpenCV学习笔记(18)双目测距与三维重建的OpenCV实现问题集锦(三)立体匹配与视差计算


3. 怎样获取与原图像有效像素区域相同的视差图?
在 OpenCV2.0 及以前的版本中,所获取的视差图总是在左侧和右侧有明显的黑色区域,这些区域没 有有效的视差数据。视差图有效像素区域与视差窗口(ndisp,一般取正值且能被 16 整除)和最小 视差值(mindisp,一般取 0 或负值)相关,视差窗口越大,视差图左侧的黑色区域越大,最小视差 值越小,视差图右侧的黑色区域越大。其原因是为了保证参考图像(一般是左视图)的像素点能在目 标图像(右视图)中按照设定的视差匹配窗口匹配对应点,OpenCV 只从参考图像的第 (ndisp - 1 + mindisp) 列开始向右计算视差,第 0 列到第 (ndisp - 1 + mindisp) 列的区域视差统一设置为 (mindisp - 1) *16;视差计算到第 width + mindisp 列时停止,余下的右侧区域视差值也统一设 置为 (mindisp - 1) *16。
(3) BM 算法比 2.0 版性能有所提升, 其状态参数新增了对左右视图感兴趣区域 ROI 的支持 (roi1 和 roi2,由 stereoRectify 函数产生); (4) BM 算法和 GC 算法的核心代码改动不大, 主要是面向多线程运算方面的 (由 OpenMP 转向 Intel TBB); (5) cvFindStereoCorrespondenceBM 函数的 disparity 参数的数据格式新增了 CV_32F 的支持,这 种格式的数据给出实际视差,而 2.0 版只支持 CV_16S,需要除以 16.0 才能得到实际的视差数值。
2. 用于立体匹配的图像可以是彩色的吗?
在 OpenCV2.1 中, BM 和 GC 算法只能对 8 位灰度图像计算视差, SGBM 算法则可以处理 24 位 (8bits*3) 彩色图像。所以在读入图像时,应该根据采用的算法来处理图像:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档