一. 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进行反转.