opencv IplImage结构

本文详细解析了OpenCV中IplImage结构的各个字段含义,包括图像尺寸、颜色模型、通道顺序等内容,并提供了示例代码来展示如何获取图像的通道顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


http://blog.youkuaiyun.com/chinabinlang/article/details/7469307

typedef struct_IplImage

{

int nSize;                                   /*IplImage结构的大小*/

int ID;                                      /*图像头的版本*//* 版本 (=0)*/

int nChannels;                            /*通道数,据不同颜色类型的位图可取134*//*这里是指:每个位图像素是由几个点组成的,如,最经典的是24位位图,每个像素有RGB三个点组成,每个点是0~255(就是8位一个无符号字节,就是一个depth)*//*取值4,表示32位位图,有Alpha值,既位图透明度*/

int alphaChannel;                       /*Alpha通道数,没有取0,有则取4*/

int depth;                                   /*每个通道的位数,可取181632*//*这里具体指的就是:组成像素单个点的深度(既每个通道深度),一般都是无符号8位*//*一般图像概念所说的多少位位图是指像素的深度,如一个RGB位图就是 3*8=24,所以是24位位图;ARGB就是4*8=32,所以是32位位图;8位位图就是一个通道(一个单点)所有就是8位(既256色位图)*/

char colorModel[4];                    /*颜色模式,有GrayRGBRGBACMYK*/

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; 
}



原理:

CV_RGB是OPENCV中的一个宏,用于创建一个色彩值:
#define CV_RGB(r,g,b) cvScalar((b),(g),(r),0)。
看到转换为cvScalar时,rgb的顺序变为bgr,这是因为opencv中存储RGB模式彩图时,采用的通道顺序是BGR.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值