OpenCV里的CvArr, CvMat, IplImag

      OpenCV里定义了几种关于图像的数据类型,特别是常见的CvArr, CvMat, IplImage,他们的基本关系如下:




这三者就是派生与继承的关系。

1.CvArr

关于CvArr,OpenCVArr里有这样的定义和说明(清晰明了)

CvArr:

/* CvArr* is used to pass arbitrary
* array-like data structures
* into functions where the particular
* array type is recognized at runtime:
*/
typedef void CvArr;

就是 void类型!(⊙﹏⊙|| && O__O"…)


2 CvMat

typedef struct CvMat

    int type;

    int step;

    int * refcount;              //for internal use only

    union { char * ptr;

                  short * s;

                  int * i;

                  float * fl;

                  double *db;

                } data;

     union { int rows;

                   int height;

                 };

     union { int cols;

                  int width;

                 };

} CvMat


CvMat 由宽度(width)、高度(height)、类型(type)、行数据长度(step 用字节数来度量)和一个指向数据的指针构成。

创建方式:CvMat * cvCreateMat( int row, int cols,int type)及其类似的函数可以创建。type可以是任意数据类型或结构体(类)。


3 IplImage

这个最常用,特别是处理图形图像时。本质上是一个CvMat对象,还带有自身关于图像的成员变量。定义如下:

typedef struct _IplImage

{

     int nsize;

     int ID;

     int nChannels;                          //通道数1,2,3或4

     int alphaChannel;                     //α通道

     int depth;

     char ColorMode[4];

     char channelSeq[4];

     int dataOrder;                //图像数据存放的方式,按通道还是交错存放

     int Orgin;                        //取IPL_ORGIN_TL时远点在左上,IPL_ORGIN_BL时左下

     int align;

     int width;

     int height;

     struct  _IplROI *roi;                       //ROI 模式来操作图像    

     struct  _IplImage* maskROI;            

     void * ImageId;

     struct _IplTileInfo * tileInfo;

     int ImageSize;

     char * ImageData;                        //指向图像第一行数据存放的指针

     int WidthStep;                              //每一列宽度,就是每个元素的大小,用byte度量

    int BorderModel[4];

    int BorderConst[4];

    char * imageDoctaOrign;

} IplImage;    


可以看出,IplImage除了包含CvMat的基本矩阵成员变量之外,还自己增加了许多关于图像的信息变量。也为图像处理操作带来了便利。


CvMat, Mat, IplImage,cvArr*之间的转换 

(1)IplImage *转为cv::Mat
        IplImage *vel;
        cv::Mat Mat(vel);
 
 
 
(2)cv::Mat转换成IplImage*
         cv::Mat mat;
        IplImage *vel = &(IpLimage)mat;
 
 
(3)IplImage *转为Mat
         IplImage *vel;
        Mat mat(vel);


最后,搞定这三行代码你就完全理解OpenCv/C++的精髓了:

    Mat IMG_Mat;
    CvMat *IPL=((CvMat*)(&IMG_Mat));
    cvReleaseMat(&IPL);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值