OpenCV的IplImage与我的CHYBitmap的互转

一. CHYBitmap

CHYBitmap是我自己读取bmp文件的一个类.

二. IplImage

IplImage是OpenCV里管理图像的一个类.(经常被它的名称误导, 总以为它是一个接口!!!)

三. 互转

3.1 互转

// 图像在垂直方向的行互反拷贝
void ReVCopy(const unsigned char* pDataSrc, unsigned char* pDataTar, long lHeight, long lStep)
{
	int i = 0;
	for(i = 0; i < lHeight; ++i)
	{
		memcpy(pDataTar + i * lStep, pDataSrc + (lHeight - 1 - i) * lStep, lStep);
	}
}


void CHYBitmapToSTIplImage(const CHYBitmap& refCHYBitmap, STIplImage& refSTIplImage)
{
	refSTIplImage.Release();
	refSTIplImage.m_pIplImage = cvCreateImage(
		cvSize(refCHYBitmap.m_pBITMAPINFO->bmiHeader.biWidth, refCHYBitmap.m_pBITMAPINFO->bmiHeader.biHeight), 
		IPL_DEPTH_8U, refCHYBitmap.m_pBITMAPINFO->bmiHeader.biBitCount / 8);
	ReVCopy(refCHYBitmap.m_pBITMAPDATA, (unsigned char *)(refSTIplImage.m_pIplImage->imageData), 
		refSTIplImage.m_pIplImage->height, refSTIplImage.m_pIplImage->widthStep);
}


void STIplImageToCHYBitmap(const STIplImage& refSTIplImage, CHYBitmap& refCHYBitmap)
{
	refCHYBitmap.Create(refSTIplImage.m_pIplImage->depth * refSTIplImage.m_pIplImage->nChannels,
		refSTIplImage.m_pIplImage->width, refSTIplImage.m_pIplImage->height, true);
	ReVCopy((unsigned char *)(refSTIplImage.m_pIplImage->imageData), refCHYBitmap.m_pBITMAPDATA,
		refSTIplImage.m_pIplImage->height, refSTIplImage.m_pIplImage->widthStep);
}

3.2 说明

1. IplImage与我的CHYBitmap非常相似. 也是由BMP头和数据组成.
2. STIplImage是对IplImage的封装, 只为自动释放.
3. 使用CHYBitmap加载一幅bmp图片, 用DC显示能正常显示; 使用IplImage加载一幅bmp图片, 用OpenCV的窗口显示也能正常; 都与使用Window的默认图片浏览软件显示是一致的.  但是CHYBitmap转IplImage后, IplImage显示就会反了过来.(或者IplImage转CHYBitmap后, CHYBitmap显示也会反了过来).
4. 查看了CHYBitmap和IplImage的图像数据, 发现他们在内存上是反的(CHYBitmap的第一行是IplImage的最后一行). CHYBitmap中读取图像数据是顺序读取的, IplImage内部读取可能是反过来读取的).
5. StretchDIBits函数中最后一个参数可以设置反转显示. 为了统一, 我在它们转换的时候, 使用ReVCopy函数把数据转换一下.
6. OpenCV中也可以使用cvFlip函数对IplImage进行反转.

四. 其他

触类旁通, IplImage与其他的图像类的转换也类似, 无非就是bmp头和图像数据. 其中bmp头的主要信息是长, 宽, 深度和频道等等.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值