织梦CMS - 轻松建站从此开始!

罗索

数据结构操作与运算-IplImage数据结构(1)

jackyhwei 发布于 2011-06-23 16:43 点击:次 
这里就简单的介绍IplImage数据结构到底是什么东西啦,IplImage数据结构里面有很多的变量,而它们的数值大多都被IplImage专用的函 数 初始化,所以不太需要用到它数据结构里面的数据,以及直接配置它数据结构的数据,以下简单的列出IplImage所存到的数据信息.
TAG:

这里就简单的介绍IplImage数据结构到底是什么东西啦,IplImage数据结构里面有很多的变量,而它们的数值大多都被IplImage专用的函 数 初始化,所以不太需要用到它数据结构里面的数据,以及直接配置它数据结构的数据,以下简单的列出IplImage所存到的数据信息.

IplImage数据结构
#include <cv.h>
#include <highgui.h>
#include <stdio.h>

int main()
{
    IplImage *Image1;
    CvSize ImageSize1 = cvSize(320,240);
    Image1 = cvCreateImage(ImageSize1,IPL_DEPTH_8U,3);

    printf("The IplImage Size is : %d\n",sizeof(IplImage));
    printf("The nSize            is : %d\n",Image1->nSize);
    printf("The width           is : %d\n",Image1->width);
    printf("The height          is : %d\n",Image1->height);
    printf("The nChannels     is : %d\n",Image1->nChannels);
    printf("The depth           is : %d\n",Image1->depth);
    printf("The widthStep     is : %d\n",Image1->widthStep);
    printf("The imageSize     is : %d\n",Image1->imageSize);
    printf("The dataOrder     is : %d\n",Image1->dataOrder);
    printf("The origin           is : %d\n",Image1->origin);
    printf("The align            is : %d\n",Image1->align);

    uchar Blue[240][320];
    uchar Green[240][320];
    uchar Red[240][320];

    for(int i=0;i<Image1->height;i++)
    {
        for(int j=0;j<Image1->widthStep;j=j+3)
        {
            Blue[i][(int)(j/3)]=Image1->imageData[i*Image1->widthStep+j];
            Green[i][(int)(j/3)]=Image1->imageData[i*Image1->widthStep+j+1];
            Red[i][(int)(j/3)]=Image1->imageData[i*Image1->widthStep+j+2];

            Image1->imageData[i*Image1->widthStep+j]=0;
            Image1->imageData[i*Image1->widthStep+j+1]=0;
            Image1->imageData[i*Image1->widthStep+j+2]=255;
        }
    }
    cvNamedWindow("Red",1);
    cvShowImage("Red",Image1);
    cvWaitKey(0);

    cvReleaseImage(&Image1);
    cvDestroyWindow("Red");

}

执行结果:


以 上的图片,是由cvCreateImage()自己创造的8bits RGB图像,cvCreateImage()的数据3代表着色域的数目,也就是R+G+B的三原色组成的啦,而下面是印出IplImage数据结构的数据 信息,IplImage里面有很多的数据结构的变量可用,这也只是IplImage的一小部分,其他的,在cvCreateImage()创造的图像是用 不到的.

1.Image1->nSize
这个部分是IplImage的空间大小为IplImage数值类型的字节大小,跟上面的sizeof(IplImage)是一样的.

2.Image1->width
图像的宽度.

3.Image1->height
图像的高度

4.Image1->nChannels
图像的色域数目(信道).

5.Image1->depth
图像的深度,这里指的是单一一个信道的空间大小,执行结果出来是8也就表示它是8bits的空间大小.

6.Image1->widthStep
总共的宽度大小,一张图片是用BGRBGRBGR...所排列而成的二维数组,这边的widthStep表示width*nChannels的宽度大小.

7.Image1->imageSize
一张图片的空间大小,这边的数据其实是height*width*nChannels,如果将这张图存成BMP图像文件的时候,总磁盘空间会是imageSize+54(图片标头档).

8.Image1->dataOrder
色域的排列方式,如果dataOrder=0的话将会是BGRBGR...的排列,如果dataOrder=1的话会是BBBBBB...的分开排列方式,cvCreateImage()只能做到dataOrder=0的交叉排列.

9.Image1->origin
图像的起始点,Bmp图像文件都是上下颠倒的origin的值为1,但是如果由cvCreateImage()及cvLoadImage()初始化IplImage数据结构都非上下颠倒的,其值为0.

10.Image1->align
这个部分就要说到计算机组织的排列限制(alignment restriction)了,这个表示,每一个比特的起始位置为4的倍数,也就是32bits,而如果出现的结果为8那就是8bytes,为64bits.详细则去参考计算机组织的排列限制.

IplImage 的详细信息就这样子啦,但是,最重要的,就是要知道如何读图像文件啦,一张图片的颜色信息都被放在imageData里面,不过IplImage必须要支 持多个不同格式大小的图片,因此,就用一维数组表示,跟一般写Bitmap算法的方式有点不一样,因此,要分别取得它们的R值B值G值,就要像上面程序代 码那样啦,上面的双重for循环将一维数组的组合转换成二维数组了,因此要使用的时候直接用它的R数组G数组B数组就好了.上面的程序实际上RGB值是颠 倒的,因为其实把图像文件存在硬盘里也是颠倒的,而且图像是上下相反的,但是一般性的说法都是用RGB的称呼,如果使用Visual C++或是Borland C++ Builder的Bitmap物件则没有此问题(因为面向对象会自动转换).


上面是一张xxx.bmp档的文件排列方式

cvCreateImage()
创造一个全黑的基本图片,需要给它配置空间CvSize数据结构,以及它的输入格式参数,再来是它的信道数(Channel).以下为输入格式参数列表

IPL_DEPTH_1U
IPL_DEPTH_8U
IPL_DEPTH_16U
IPL_DEPTH_32F
IPL_DEPTH_8S
IPL_DEPTH_16S
IPL_DEPTH_32S


cvCreateImage()最多可以输入1~4个信道.
cvCreateImage(CvSize图像大小数据结构,IplImage格式参数,信道数)

(fzzl)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201106/14602.html]
本文出处:fzzl.is-programmer.com 作者:fzzl
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容