IplImage*图像结构指针转换成byte *
来源:互联网 发布:msdb系统数据库 编辑:程序博客网 时间:2024/05/17 07:51
最近在封装opencv中一些标定,视觉方面的函数,接口定义为byte*,需要将byte*与iplImage*相互转换。
其中遇到几个小问题,1)当byte*转成IplImage*时setData()接受图像头,故需要createImageHeader().在上篇cvSetData()中已经说明。
2)在IplImage*转成Byte*时,其实就是取IplImage*中的imageData数据区指针,但是要注意几点:
A:IplImage*指针存放图像有两种方式,由originar变量控制,0-left up为起点,1-left down 为起点。所以要根据origial 处理图像情况。看是否需要对图像进行倒置下。
B:IplImage*存放图像根据读人的格式不同,channel不同。即便是8位图像可能存放成3个通道,所以在转化时获取数据需要注意。
代码贴出来:
//////////////////////////////////////////////////////////////////////////
// Name: byte2IplImg
// Function: convert byte* to IplImage format.
// Author: liyy
// Data:2011.05.23
//////////////////////////////////////////////////////////////////////////
IplImage * CconvertImgStruct::Byte2IplImg( byte *pImg,int width,int height,int bitCount )
{
if (!pImg )
{
return NULL;
}
int nchannel = 3; //create IplImage in 3channel.
IplImage *pIplImgHeader = cvCreateImageHeader(cvSize(width,height),IPL_DEPTH_8U,nchannel);
long lWidthByte = (width * bitCount+31)/32 *4;
pIplImgHeader->origin = 1; //from left-down
cvSetData(pIplImgHeader,pImg,lWidthByte*nchannel);
//return IplImg
return pIplImgHeader;
}
//////////////////////////////////////////////////////////////////////////
//Name: IplImage2Byte
//Function: convert IplImage to byte*
//Author:liyy
//Date: 2011.05.23
//////////////////////////////////////////////////////////////////////////
byte * CconvertImgStruct::IplImage2Byte( IplImage *IplImg )
{
if (!IplImg)
{
return NULL;
}
int nHeight = IplImg->height;
int nWidth =IplImg->width;
int bitCount = IplImg->depth;
int nChanel = IplImg->nChannels;
byte *pImg = new byte[nHeight*nWidth*nChanel*sizeof(byte)];
if (IplImg->origin == 0)
{ //from left-down
for (int i = 0; i< nHeight;i++)
{
for (int j = 0; j< nWidth;j++)
{
for (int k =0; k < nChanel;k++)
{
//*(pImg+i*nWidth+j*nChanel+k) = *(IplImg->imageData+(nHeight-i-1)*nWidth+j*nChanel+k);
pImg[i*nWidth*nChanel+j*nChanel+k] = IplImg->imageData[(nHeight-i-1)*nWidth*nChanel+j*nChanel+k];
}
}
}
}
else
{ //from left-up
memcpy(pImg,IplImg->imageData,nHeight*nWidth*nChanel*sizeof(byte));
}
//pImg = (byte *)IplImg->imageData;
return pImg;
}
}
//////////////////////////////////////////////////////////////////////////
//Name: IplImage2Byte
//Function: convert IplImage to byte*
//Author:liyy
//Date: 2011.05.23
//////////////////////////////////////////////////////////////////////////
byte * CconvertImgStruct::IplImage2Byte( IplImage *IplImg )
{
if (!IplImg)
{
return NULL;
}
int nHeight = IplImg->height;
int nWidth =IplImg->width;
int bitCount = IplImg->depth;
int nChanel = IplImg->nChannels;
byte *pImg = new byte[nHeight*nWidth*nChanel*sizeof(byte)];
if (IplImg->origin == 0)
{ //from left-down
for (int i = 0; i< nHeight;i++)
{
for (int j = 0; j< nWidth;j++)
{
for (int k =0; k < nChanel;k++)
{
//*(pImg+i*nWidth+j*nChanel+k) = *(IplImg->imageData+(nHeight-i-1)*nWidth+j*nChanel+k);
pImg[i*nWidth*nChanel+j*nChanel+k] = IplImg->imageData[(nHeight-i-1)*nWidth*nChanel+j*nChanel+k];
}
}
}
}
else
{ //from left-up
memcpy(pImg,IplImg->imageData,nHeight*nWidth*nChanel*sizeof(byte));
}
//pImg = (byte *)IplImg->imageData;
return pImg;
}
- IplImage*图像结构指针转换成byte *
- IplImage图像与BYTE图像之间的转换与利用
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- OpenCV中IplImage图像格式与 BYTE图像数据的转换
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- OpenCV中IplImage图像格式与 BYTE图像数据的转换
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- OpenCv中IplImage图像格式与BYTE图像数据的转换
- IplImage格式图像与byte格式图像数据的相互转换
- OPENcv从相机采集图像数据-图像处理接口IPLIMAGE结构的指针
- OPENcv从相机采集图像数据-图像处理接口IPLIMAGE结构的指针
- CvArr、Mat、CvMat、IplImage、BYTE转换
- CvArr、Mat、CvMat、IplImage、BYTE转换
- CvArr、Mat、CvMat、IplImage、BYTE转换
- CvArr、Mat、CvMat、IplImage、BYTE转换
- CvArr、Mat、CvMat、IplImage、BYTE转换
- Unicode与UTF-8互转(C语言实现)
- 为什么用dedecms可以仿站
- javascript基础
- 结构和sort进一步的了解
- CloudFoundry warden 创建container 源码研究
- IplImage*图像结构指针转换成byte *
- 通过java post上传file文件
- 被逼出来的成熟,让人如此心疼
- C++中很有价值的函数
- SSH web.xml 解析
- android中一些属性设置
- RSA算法原理(一)
- 什么是AOP
- SQL中inner join、outer join和cross join的区别