OpenCV中的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;
该结构定义于types_c.h头文件中(opencv2\core\types_c.h)。
width、height分别表示图像的宽度像素数、高度像素数,是这个结构中最重要的两个成员。
其次是depth、nchannals这两个变量:
depth变量的值取自于types_c.h
#define IPL_DEPTH_SIGN 0x80000000

#define IPL_DEPTH_1U     1                    //无符号1位整数
#define IPL_DEPTH_8U     8                    //无符号8位整数
#define IPL_DEPTH_16U   16                    //无符号16位整数
#define IPL_DEPTH_32F   32                    //32位浮点数单精度

#define IPL_DEPTH_8S  (IPL_DEPTH_SIGN| 8)    //有符号8位整数
#define IPL_DEPTH_16S (IPL_DEPTH_SIGN|16)    //有符号16位整数
#define IPL_DEPTH_32S (IPL_DEPTH_SIGN|32)    //有符号32位整数

通道数nChannels可取值为1、2、3或4.

随后两个重要成员是origin和dataOrder:

origin变量可以有两种取值IPL_ORIGIN_TL或者IPL_ORIGIN_BL,分别设置坐标原点的位置于图像左上角或者左下角,一般而言,图像来源、操作系统、编解码器、存储格式都可以影响图像的原点选取,开始操作图像前先检查系统,在所操作图像块的地方画点东西试试是一个好的方法;

dataOrder的取值可以是IPL_DATA_ORDER_PIXEL或IPL_DATA_ORDER_PLANE,前者指明数据是将像素点不同通道的值交错排在一起(这是常用的交错排列方式),后者是把所有像素同通道值排列在一起,形成通道平面,再把平面排列起来。

dataOrder==IPL_DATA_ORDER_PLANE,则总行数为height*nChannels.

为了更为高效处理图像,每行都会用固定字节来对齐,因此width并不能作为相邻行的同列点之间的字节数,widthStep变量正是为此而设定的。

参数imageData包含一个指向图像数据区首地址的指针。

roi参数,最感兴趣的区域,实际上是IplROI的一个实例:

typedef struct _IplROI
{
    int  coi; /* 0 - no COI (all channels are selected), 1 - 0th channel is selected ...*/
    int  xOffset;
    int  yOffset;
    int  width;
    int  height;
}
IplROI;

ROI的思想是一旦设定了ROI,通常作用于整幅图像的函数便只会对ROI所表示的子图像进行操作。

如果IplImage变量中设置了ROI,则所有的OpenCV函数就会使用该ROI变量。

如果coi被设置为非0,则对该图像的操作就只作用于被指定的通道上,coi可能取值有1、2、3、4通道,并且为了使coi无效保留了0取值。在OpenCV中,许多函数都忽略coi。

设置、取消ROI分别使用cvSetImageROI(IplImage* image,CvRect rect)、cvResetImageROI()函数。

以上全文来自《学习opencv》,稍作修改,其实可以看作完全未做修改。

 

posted @ 2012-04-25 10:42  trirocky  阅读(2527)  评论(0编辑  收藏  举报