Opencv中图像大小问题

来源:互联网 发布:vc串口编程 编辑:程序博客网 时间:2024/06/05 20:35

第一次使用OpenCV就遇到了这样的问题:访问图像像素的时候,用的图像大小为pGryImg->width*pGryImg->height(读入图像为IplImage*pGryImg)。之后观察输出图像的结果,发现并没有访问到图像的末尾像素点。

查资料发现:IplImage结构:

typedef struct _IplImage
    {
        int  nSize;         /* IplImage大小 */
        int  ID;            /* 版本 (=0)*/
        int  nChannels;     /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */
        int  alphaChannel;  /* 被OpenCV忽略 */
        int  depth;         /* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
                               IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */
        char colorModel[4]; /* 被OpenCV忽略 */
        char channelSeq[4]; /* 同上 */
        int  dataOrder;     /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.
                               cvCreateImage只能创建交叉存取图像 */
        int  origin;        /* 0 - 顶—左结构,
                               1 - 底—左结构 (Windows bitmaps 风格) */
        int  align;         /* 图像行排列 (4 or 8). OpenCV 忽略它,使用 widthStep 代替 */
        int  width;         /* 图像宽像素数 */
        int  height;        /* 图像高像素数*/
        struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */
        struct _IplImage *maskROI; /* 在 OpenCV中必须置NULL */
        void  *imageId;     /* 同上*/
        struct _IplTileInfo *tileInfo; /*同上*/
        int  imageSize;     /* 图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep),单位字节*/
        char *imageData;  /* 指向排列的图像数据 */
        int  widthStep;   /* 排列的图像行大小,以字节为单位 */
        int  BorderMode[4]; /* 边际结束模式, 被OpenCV忽略 */
        int  BorderConst[4]; /* 同上 */
        char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */
    }    IplImage;

其中对imgsize的注释是:图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep)
注意:image->height乘的是image->widthStep,并不是image->width,如果用image->width一般是访问不到图像末尾的。
以下是输出结果的比较:


解释:image->width是指图片宽度的像素个数,而image->widthStep是指图片中每一行占的字节数,这里涉及到了一个4字节对齐的问题。
0 0
原创粉丝点击