【OpenCV】OpenCV的类型转换问题(BYTE、IplImage、Mat等)

1、BYTE转IplImage(需要每行字节对齐)

Mat中的图像数据是不对齐的,而IplImage中的图像数据是4字节对齐的

所以在访问IplImage图像数据的时候,要特别注意widthStep这个属性,每行的字节数不是width*nchannels而是widthStep,因为每行可能会有字节填充的


IplImage *prou_GetImage(CvSize size, UINT8 *ImgData,int nDepth, int nChannels)
{
IplImage *img_Image = cvCreateImage(size,nDepth,nChannels);
cvZero(img_Image);


int nWidthStep = img_Image->widthStep;
for ( int i = 0; i<size.height;i++ )
{
for ( int j=0;j<size.width;j++)
{
for(int n=0;n<nChannels;n++)
{
((uchar *)(img_Image->imageData + i*nWidthStep))


[j*nChannels + n] = ImgData[i*nWidthStep + j*nChannels + n];
}
}
}
return img_Image;
}


int nImgType = (int)fImgType;
int nTmgType = (int)fTmgType;
int nImgChannel = nImgType == 0 ? 1 : 3;
int nTmgChannel = nTmgType == 0 ? 1 : 3;


CvSize size;
size.width  = (int)((fImgWidth*1000+1)/1000);
size.height = (int)((fImgHeight*1000+1)/1000);


CvSize sizeTemp;
sizeTemp.width  = (int)((fTmgWidth*1000+1)/1000);
sizeTemp.height = (int)((fTmgHeight*1000+1)/1000);


  IplImage *img_Image = prou_GetImage(size, image_data,IPL_DEPTH_8U,3);
  IplImage *img_Temp  = prou_GetImage(sizeTemp, temp_data,IPL_DEPTH_8U,3);






2、IplImage转Mat


IplImage *img_Image = cvCreateImageHeader(size,IPL_DEPTH_8U,nImgChannel);
IplImage *img_Temp  = cvCreateImageHeader(sizeTemp,IPL_DEPTH_8U,nTmgChannel);

cvSetData(img_Image, image_data, img_Image->widthStep);
cvSetData(img_Temp, temp_data, img_Temp->widthStep);


3、BYTE转Mat

IplImage *img_Image = cvCreateImageHeader(size,IPL_DEPTH_8U,nImgChannel);
IplImage *img_Temp  = cvCreateImageHeader(sizeTemp,IPL_DEPTH_8U,nTmgChannel);

  cvSetData(img_Image, image_data, img_Image->widthStep);
  cvSetData(img_Temp, temp_data, img_Temp->widthStep);


int lineByteImg = (img_Image->widthStep + 3)/4*4;
Mat iMat(size.height, size.width, CV_8UC3, image_data, lineByteImg); 

int lineByteTmg = (img_Temp->widthStep + 3)/4*4;  
Mat tMat(sizeTemp.height, sizeTemp.width, CV_8UC3, temp_data, lineByteTmg); 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值