`
akiraray
  • 浏览: 90245 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

OpenCV学习备忘 Vol .3 CvMat矩阵基本介绍

阅读更多

 

参考书籍及资料

  • 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个点,主要有以下几种方法进行矩阵化:

  1. N行,3列的CV32FC1矩阵
  2. 3行,N列的CV32FC1矩阵
  3. 1行,N列的CV32FC3矩阵
  4. 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-java480.dll windows 64 opencv-java480.jar下载

    OpenCV(开源计算机视觉库)是一个强大的跨平台计算机视觉库,它包含了大量的图像处理和计算机视觉算法,广泛应用于机器学习、图像分析、人脸识别等领域。在Java环境下,OpenCV提供了`opencv_java`接口,使得Java...

    opencv_world310.lib文件

    例如,`#include <opencv2/opencv.hpp>` 将导入所有必要的头文件,然后在链接阶段指定"opencv_world310.lib"(或"opencv_world310d.lib")来完成编译。 5. **编译和链接**: 使用Visual Studio或其他C++编译器时,...

    基于python语言,学习Opencv的简单例子.zip

    学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,学习Opencv的简单例子.zip基于python语言,...

    opencv_core2413.dll

    opencv_core2413.dll C#编程 。。。。。。。。。。。。。。。。。。。。。。。。。。

    window opencv_java320.dll

    window平台的 opencv_java320.dll 编译好的,放在java bin目录下即可

    opencv缺少的DLL.zip

    OpenCV是一个强大的计算机视觉库,广泛应用于图像处理、机器学习和人工智能等领域。为了在Windows Server 2008上顺利运行OpenCV程序,你需要确保系统中安装了所有必需的依赖项。 首先,OpenCV库本身是由多个DLL文件...

    opencv_world330.dll

    opencv_world330.dll OpenCV3.3.0 release版本的编译链接库

    opencv_java453.dll

    opencv官方的本地库,用在windows平台

    opencv-python3.4.1.15.zip

    OpenCV,全称Open Source Computer Vision Library,是一个开源的计算机视觉库,它包含了众多图像处理和计算机视觉的算法,广泛应用于图像分析、机器学习以及人工智能等领域。在Python编程语言中,OpenCV提供了一个...

    opencv_java343.dll

    opencv343版本java中需要用到的dll,在eclipse中直接引用该动态链接库,结合对应的opencv的jar即可运行

    Windows Server 2012 Opencv 缺少的DLL.zip

    公司服务器使用的是Windows Server 2012,在上面装Opencv后,使用java代码 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 总是提示opencv_java410.dll: Can't find dependent libraries,搜索N多资源无解,最终...

    opencv_world320.dll

    opencv_world320 点 dll 亲测可用,64位,权当工具 嗯

    opencv_createsamples.exe及opencv_haartraining.exe(64位)

    这里是OpenCV2.4.13中已经编译好的动态库及可执行程序,其中...3、opencv_haartraining.exe 4、opencv_performance.exe 5、opencv_traincascade.exe 以及所有的dll动态库,这些程序在Win7系统64位机上测试可以通过。

    opencv_world420.dll

    X86 的opencv4.2.0 VS2019 win10生成的库文件,可以用于Visual Studio 2019开发的项目中。然后进行相关的环境变量、属性等配置即可使用

    OpenCV4.4+vs2017+已编译dll和lib(含cuda和contrib)

    opencv_aruco440.lib opencv_bgsegm440.lib opencv_bioinspired440.lib opencv_calib3d440.lib opencv_ccalib440.lib opencv_core440.lib opencv_datasets440.lib opencv_dnn_objdetect440.lib opencv_dnn_superres...

    opencv_2.4.11dll.rar

    3. `opencv_ocl2411d.dll`:OpenCL模块,支持GPU加速计算。 4. `opencv_imgproc2411d.dll`:图像处理模块,包含滤波、几何变换等操作。 5. `opencv_highgui2411d.dll`:用户界面模块,提供图像显示和基本的I/O功能。...

    opencv_ffmpeg249.dll

    在OpenCV中无法正常读取视频(opencv_ffmpeg249.dll)

    opencv学习资料分享.zip

    2. **书籍**:如《OpenCV Python教程》、《Learning OpenCV 4 Computer Vision with Python》等,深入浅出地介绍了OpenCV的基本用法和高级应用。 3. **在线课程**:Coursera、Udemy、YouTube等平台上都有专门的...

    opencv-java460-windows-64

    例如,你可以使用`org.opencv.core.Core`、`org.opencv.imgcodecs.Imgcodecs`、`org.opencv.imgproc.Imgproc`等类来加载图像、进行图像处理操作或者执行基本的图像分析任务。 在OpenCV 4.6.0这个版本中,有一些关键...

    学习OpenCV 3 中文版.rar

    本教程《学习OpenCV 3 中文版》是一本专为初学者和进阶者设计的指导性资料,旨在帮助读者深入理解OpenCV 3的功能与应用。 该教程首先会介绍OpenCV的基础知识,包括库的安装、配置以及如何在不同的编程环境中(如...

Global site tag (gtag.js) - Google Analytics