参考书籍及资料
- OpenCV中文社区
- 《学习OpenCV》
内容提要
介绍CvMat矩阵数据类型的基本信息
CvMat:矩阵头
typedef struct CvMat{ int type; int step: int* refcount; union{ uchar* ptr; short* s; int* i; float* fl; double* db; }data; union{ int rows; int heights; }; union{ int cols; int width; }; }CvMat;
数据结构中大部分都使用union,虽然OpenCV是用C编写的,但其思想还是面向对象的。理解起来应该没有很大难度。说一下几个重点:
Union联合
C语言中常用的数据结构之一,类似的有struct结构体。但是不同的是,struct中的每个属性都是独立的数据,而一个union中的属性是公用一端内存地址的,而这个内存地址的长度是取决于union中最大的数据类型的。所以通常一个union中只有一个属性是有效的。
指针
CvMat的矩阵头中大量使用指针,旨在处理分散的数据,并且使得CvMat的开销变得更小,更灵活。而同样的缺点是,大部分的童鞋对于指针的理解都不太深,主要是自从Java之后都开始弱化指针的概念。
矩阵的创建
- CvMat* cvCreateMat(int rows,int cols,int type);
- CvMat* cvCreateMatHeader(int rows,int cols,int type);
- CvMat* cvInitMatHeader(CvMat* mat,int rows,int cols,int type,void* data=NULL,int step=CV_AUTOSTEP );
- CvMat* cvMat(int rows,int cols,int type,void data*=NULL);
cvInitMatHeader与cvMat都只是简单的创建了一下基本的信息,但是没有初始化数据。然后利用指针将分布的数据链接起来。
例 创建一个简单的CvMat
float vals[]={0.1,0.2,0.3,0.4}; CvMat mat; cvInitMatHeader(&mat,2,2,CV_32FC1,vals);
矩阵数据的读取方式
利用CV_MAT_ELEM读取
CvMat * mat=cvCreateMat(5,5,CV_32FC1);
float element_3_2= CV_MAT_ELEM(*mat, float, 3, 2);
利用CV_MAT_ELEM_PTR读取
例.设置矩阵中的一个位置的值
CvMat * mat=cvCreateMat(5,5,CV_32FC1); float element_3_2 = 1.0; *( (float *)CV_MAT_ELEM_PTR(*mat,3,2) )=element_3_2;
利用cvPtr读取
上面的两个宏都只能支持1,2D的矩阵,如果超过2D,变为3D或者ND的时候需要使用cvPtr系列函数读取,当然cvPtr自身也支持1D和2D的矩阵。通常这系列的函数都是一样的参数列表(目标矩阵,坐标1,坐标2…,类型);
例.使用cvPTr*D读取据矩阵
-
uchar* cvPtr1D( const CvArr* arr, int idx0, int* type CV_DEFAULT(NULL));
- uchar* cvPtr3D( const CvArr* arr, int idx0, int idx1, int idx2,int* type CV_DEFAULT(NULL));
cvPtr系列是获取指针,故可以修改相关的位置的值。如果只是用于读取可以使用相同签名的cvGet*D函数
关于cvGet*D和cvPrt*D的比较
- 因为get系列都是有独立的返回值的,在某些对内存开销有限定要求的情况下,不太适合使用。推荐使用ptr系列
- 由于ptr系列返回的都是指针,故可以使用指针一些地址算术特性做一些位置偏移的操作。
- 使用step和ptr进行位置移动,因为在cvMat中每一行的长度都是4的倍数(因为计算方便)故只是简单的靠width和cols是无法正确移动到想要的位置的。如width是3但是想要移动至下一行其实还是要移动4个位置。偏移量为step/数据类型大小。如矩阵数据内容为int型,则需要移动step/4至相同列的下一行位置。
使用cvSet*D对矩阵进行赋值
其实该函数与get系列函数是对应的,只能对指定位置进行赋值操作。不做过多的解释。
点的数组矩阵
假设需要抽样一个3D系上的的N个点,主要有以下几种方法进行矩阵化:
- N行,3列的CV32FC1矩阵
- 3行,N列的CV32FC1矩阵
- 1行,N列的CV32FC3矩阵
- N行,1列的CV32FC3矩阵
参数中32F表示32 float,而C3表示channel 3既3通道。
N行,3列的CV32FC1矩阵
3列分别表示x,y,z坐标。则其数组的形式为
每一行表示一个点,还每个点的0,1,2表示x,y,z坐标则
point[3]={x,y,z}
pints[n]={point1,point2……};
3行,N列的CV32FC2矩阵
三行分别代表x,y,z坐标,而其位置代表是第几个点。
第一行即{x0,x1,x3….},第二行{y0,y1,y2….}一次类推
如果需要标示一个点则为 [0][i],[1][i],[2][i]
1行,N列的CV32FC3矩阵
其实3导通就是将每一个通道的值一次排列存在,其内存结构域 N行3列的矩阵是一样的.
相关推荐
学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,...
opencv_world310.lib opencv_world310d.lib
opencv 资料 opencv.rar opencv.rar opencv.rar opencv 资料 opencv.rar opencv.rar opencv.rar
【opencv_world455_x86_vc17 库文件】 简介:使用 cmake 编译(VS2022 / vc17)适用于 x86 架构系统的 opencv_world455 库文件。包含动态链接库(.lib...3. 静态连接库(opencv_world455.lib / opencv_world455d.lib)
opencv_core2413.dll C#编程 。。。。。。。。。。。。。。。。。。。。。。。。。。
opencv 3.1.0的32位版本 opencv 3.1.0的X86版本 含bin文件和lib文件 ...以及opencv_calib3d310.dll,opencv_core310.dll,opencv_ffmpeg310.dll,opencv_flann310.dll,opencv_photo310.dll等20个dll文件
opencv官方的本地库,用在windows平台
适用于Windows64位,对应Python 3.6版本,OpenCV为3.4.1.15版本;内含有《opencv_contrib_python-3.4.1.15-cp36-cp36m-win_amd64.whl》和《opencv_python-3.4.1.15-cp36-cp36m-win_amd64.whl》两个文件
X86 的opencv4.2.0 VS2019 win10生成的库文件,可以用于Visual Studio 2019开发的项目中。然后进行相关的环境变量、属性等配置即可使用
opencv343版本java中需要用到的dll,在eclipse中直接引用该动态链接库,结合对应的opencv的jar即可运行
opencv学习提取前景.zip
在OpenCV中无法正常读取视频(opencv_ffmpeg249.dll)
opencv_world330.dll OpenCV3.3.0 release版本的编译链接库
OpenCV检测运动目标.zip资源matlab opencv运动目标检测程序资料OpenCV检测运动目标.zip资源matlab opencv运动目标检测程序资料OpenCV检测运动目标.zip资源matlab opencv运动目标检测程序资料OpenCV检测运动目标.zip...
window平台的 opencv_java320.dll 编译好的,放在java bin目录下即可
这里是OpenCV2.4.13中已经编译好的动态库及可执行程序,其中...3、opencv_haartraining.exe 4、opencv_performance.exe 5、opencv_traincascade.exe 以及所有的dll动态库,这些程序在Win7系统64位机上测试可以通过。
opencv-python 3.4.1.15 opencv-contrib-python 3.4.1.15 win64版,opencv-python 3.4.1.15 opencv-contrib-python 3.4.1.15,支持版本:python3.4,3.5,3.6
opencv入门学习文档,是根据个人学习记录的笔记总计三百多页,内含书签,文档简洁适合快速入门,了解图像处理,视频跟踪,神经网络等概念和基本原理,以及人脸识别案例在Opencv中的实现,内含了C++实现源代码。
包含OpenCV4.4.0和opencv_contrib-4.4.0 OpenCV 4.x的夏季更新已发布 :晴天: 此版本的亮点: SIFT(尺度不变特征变换)算法已移至主存储库(SIFT的专利已过期) DNN模块: 改进的图层/激活/支持更多模型: G-...
学习OpenCV 3 中文版(PDF)经典教程,最新的教程详细介绍了opencv的算法集成及机器学习部分内容。