http://blog.youkuaiyun.com/chinabinlang/article/details/7469307
typedef struct_IplImage
{
int nSize; /*IplImage结构的大小*/
int ID; /*图像头的版本*//* 版本 (=0)*/
int nChannels; /*通道数,据不同颜色类型的位图可取1、3、4*//*这里是指:每个位图像素是由几个点组成的,如,最经典的是24位位图,每个像素有RGB三个点组成,每个点是0~255(就是8位一个无符号字节,就是一个depth)*//*取值4,表示32位位图,有Alpha值,既位图透明度*/
int alphaChannel; /*Alpha通道数,没有取0,有则取4*/
int depth; /*每个通道的位数,可取1、8、16、32*//*这里具体指的就是:组成像素单个点的深度(既每个通道深度),一般都是无符号8位*//*一般图像概念所说的多少位位图是指像素的深度,如一个RGB位图就是 3*8=24,所以是24位位图;ARGB就是4*8=32,所以是32位位图;8位位图就是一个通道(一个单点)所有就是8位(既256色位图)*/
char colorModel[4]; /*颜色模式,有Gray、RGB、RGBA、CMYK等*/
char channelSeq[4]; /*通道顺序,如“RGB”、“BGR”等*/
int dataOrder; /*数据的排列方式,使用像素格式*/
int origin; /*坐标原点,有左上角和左下角两种*/
int align; /*图像数据的排列方式*/
int width; /*图像的宽*/
int height; /*图像的高*/
struct _IplROI*roi; /*指向ROI结构的指针,NULL表没有*/
struct _IplImage*maskROI; /*指向ROI模板的指针,NULL表没有*/
void *imageId; /*用于应用中,对于本库,可忽略*/
struct_IplTileInfo *tileInfo; /*该指针指向包含图像分解的信息*/
int imageSize; /*图像的大小*/
char *imageData; /*指向图像数据的指针*/
int widthStep; /*校准后的行字节数*/
int BorderMode[4]; /*边缘像素的模式*/
int BorderConst[4]; /*表示四个边的常数*/
char* imageDataOrigin; /*该指针指向完整的、没有校准的图像*/
} IplImage;
通过IplImage结构得知通道顺序:
IplImage *img=cvLoadImage("lena.jpg");
if (img == NULL)
exit(0);
cout<<img->channelSeq[0]<<endl;
cout<<img->channelSeq[1]<<endl;
cout<<img->channelSeq[2]<<endl;
cout<<img->channelSeq[3]<<endl;
##############################################################3
判断CvScalar在RGB颜色模型下是RGB还是BGR形式存储
void isRGBorBGR(void)
{
IplImage *img=cvLoadImage("lena.jpg");
if (img == NULL)
return ;
CvScalar color=cvGet2D(img, 0, 0);
unsigned char *data=(unsigned char*)img->imageData;
cout<<img->channelSeq[0]<<" "<<img->channelSeq[1]<<" "<<img->channelSeq[2]<<endl;
if (color.val[0] == (double)data[0])
cout<<"1 true"<<endl;
if (color.val[1] == (double)data[1])
cout<<"2 true"<<endl;
if (color.val[2] == (double)data[2])
cout<<"3 true"<<endl;
cout<<color.val[0]<<" "<<color.val[1]<<" "<<color.val[2]<<endl;
cout<<(double)data[0]<<" "<<(double)data[1]<<" "<<(double)data[2]<<endl;
}
原理: