OPENCV 2. 数据结构

这篇博客介绍了OpenCV中的一些核心数据结构,包括CvRect矩形类、CvPoint点类及其变种、CvSize尺寸类、颜色类以及矩阵类CvMat和IplImage图像类。内容涵盖了这些数据结构的构造、用途以及在处理图像时的注意事项,如深拷贝与浅拷贝的区别。
摘要由CSDN通过智能技术生成

Opencv的数据结构定义于types_c.h中,下面对其一一介绍:
a. CvRect 矩形类

typedef struct CvRect
{
    int x;
    int y;
    int width;
    int height;
}
CvRect;

x和y表示矩形的起始坐标,而width和height则表示矩形的宽和高;其构造函数为:

CV_INLINE  CvRect  cvRect( int x, int y, int width, int height )
{
    CvRect r;

    r.x = x;
    r.y = y;
    r.width = width;
    r.height = height;

    return r;
}

此外还有IplROI也类似于矩形类;

b. CvPoint 点类

typedef struct CvPoint
{
    int x;
    int y;
}
CvPoint;
CV_INLINE  CvPoint  cvPoint( int x, int y )
{
    CvPoint p;

    p.x = x;
    p.y = y;

    return p;
}

此外还有表示浮点型的点:CvPoint2D32f、CvPoint2D64f;三维点CvPoint3D32f、cvPoint2D64f;

c. 尺寸类

typedef struct CvSize
{
    int width;
    int height;
}
CvSize;

同样有构造函数 CV_INLINE CvSize cvSize( int width, int height ),和更高精度的尺寸类CvSize2D32f;

d. 颜色类

typedef struct CvScalar
{
    double val[4];
}
CvScalar;

表示图像的B(blue)、G(green)、R(red)、alpha - 图像的透明度;构造函数有:

CV_INLINE  CvScalar  cvScalar( double val0, double val1 CV_DEFAULT(0),
                               double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0))
CV_INLINE  CvScalar  cvRealScalar( double val0 )
CV_INLINE  CvScalar  cvScalarAll( double val0123 )

e. 矩阵类

typedef struct CvMat
{
    int type;        // 数据类型,经过计算后的一串数字
    int step;        // 一行数据的长度,单位为字节

    /* for internal use only */
    int* refcount;   // 数据引用计数,内部使用,不用管
    int hdr_refcount;

    union
    {
        uchar* ptr;
        short* s;
        int* i;
        float* fl;
        double* db;
    } data;           // 数据地址

#ifdef __cplusplus
    union
    {
        int rows;
        int height;
    };

    union
    {
        int cols;
        int width;
    };
#else
    int rows;
    int cols;
#endif

}
CvMat;

1.大多数情况下,step等于 width * 单个数据的长度,但是也存在例外情况
2.ptr、s、i、fl和db表示的是同一个地址。CvMat这样进行定义的目的是为了更好的操作数据;
3.Mat A = B;这时只进行浅拷贝,如果需要用到深拷贝,则需要使用cvCloneMat

int main()  
{  
    double AA[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
    CvMat Ma=cvMat(3, 4, CV_64FC1, AA);

    CvMat Mb = Ma;
    CvMat * Mc = cvCloneMat(&Ma);

    printf("Address of AA = %d\nAddress of Ma = %d\nAddress of Mb = %d\nAddress of Mc = %d\n", 
        (int)AA, (int)Ma.data.ptr,  (int)Mb.data.ptr, (int)Mc->data.ptr);

    cvReleaseMat(&Mc);
}

得到的结果是:
Address of AA = 1964272
Address of Ma = 1964272
Address of Mb = 1964272
Address of Mc = 3658064

f. IplImage图像类

typedef struct _IplImage
{
    int  nSize;             /* sizeof(IplImage) */
    int  ID;                /* version (=0)*/
    int  nChannels;         /* Most of OpenCV functions support 1,2,3 or 4 channels */
    int  alphaChannel;      /* Ignored by OpenCV */
    int  depth;             /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
                               IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */
    char colorModel[4];     /* Ignored by OpenCV */
    char channelSeq[4];     /* ditto */
    int  dataOrder;         /* 0 - interleaved color channels, 1 - separate color channels.
                               cvCreateImage can only create interleaved images */
    int  origin;            /* 0 - top-left origin,
                               1 - bottom-left origin (Windows bitmaps style).  */
    int  align;             /* Alignment of image rows (4 or 8).
                               OpenCV ignores it and uses widthStep instead.    */
    int  width;             /* Image width in pixels.                           */
    int  height;            /* Image height in pixels.                          */
    struct _IplROI *roi;    /* Image ROI. If NULL, the whole image is selected. */
    struct _IplImage *maskROI;      /* Must be NULL. */
    void  *imageId;                 /* "           " */
    struct _IplTileInfo *tileInfo;  /* "           " */
    int  imageSize;         /* Image data size in bytes
                               (==image->height*image->widthStep
                               in case of interleaved data)*/
    char *imageData;        /* Pointer to aligned image data.         */
    int  widthStep;         /* Size of aligned image row in bytes.    */
    int  BorderMode[4];     /* Ignored by OpenCV.                     */
    int  BorderConst[4];    /* Ditto.                                 */
    char *imageDataOrigin;  /* Pointer to very origin of image data
                               (not necessarily aligned) -
                               needed for correct deallocation */
}
IplImage;

1.roi是图像的感兴趣的区域,当进行显示时,只会显示感兴越区域;
2.cvCopy会拷贝图像的感兴趣区域,而cvCloneImage则会拷贝所有的值;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值