Opencv:IplImage转换为bmp的过程及相关问题

    技术2022-05-20  28

     

    转帖自:http://blog.ednchina.com/opencv2008/201557/message.aspx

     

     

     

    问题是bmp文件要求

     文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储,

         否则,需要在后端补0,凑足4的倍数。 

         以字节为单位的每行长度始终是4的倍数。行的长度可以计算为:

         RowLength = 4 * ((bmch.bcWidth * bmch.bcBitCount + 31) / 32) ;        

         如果需要,可通过在右边补充行(通常是用零)来完成长度。图素数据的总字节数等于      RowLength和bmch.bcHeight的乘积。

     

     

    所以在计算空间的时候,就要使用上面的公式计算出长度来,利用RowLength和bmch.bcHeight的乘积的成绩来开辟空间,不然就会出错

    3月2号:

    所有代码

     

    /********************************************************

    //将IplImage文件转换为BMP文件

    //IplImage *pmg         opencv里面的文件格式

    //BITMAPINFO *pbmpinfo  得到的bmp文件图像信息头

    //BYTE **pbmpdata       得到的bmp图像文件数据

    //********************************************************

    BOOL Ipl2BMP(IplImage *Iplmg,BITMAPINFO **pbmpinfo,BYTE **pbmpdata)

    {

        BYTE    *p=new BYTE[2048];

        *pbmpinfo=(BITMAPINFO*)p;

     

        (*pbmpinfo)->bmiHeader.biSize         =sizeof(BITMAPINFOHEADER);

        (*pbmpinfo)->bmiHeader.biBitCount     =Iplmg->nChannels*8;

        (*pbmpinfo)->bmiHeader.biClrUsed      =0;

        (*pbmpinfo)->bmiHeader.biCompression  =BI_RGB;

        (*pbmpinfo)->bmiHeader.biHeight       =Iplmg->height;

        (*pbmpinfo)->bmiHeader.biWidth        =Iplmg->width;

        (*pbmpinfo)->bmiHeader.biPlanes       =1;

        (*pbmpinfo)->bmiHeader.biSizeImage    =0;

        (*pbmpinfo)->bmiHeader.biXPelsPerMeter=0;

        (*pbmpinfo)->bmiHeader.biYPelsPerMeter=0;

     

     

        int ImgSize=(((*pbmpinfo)->bmiHeader.biWidth  *  (*pbmpinfo)->bmiHeader.biBitCount +  31 )/32) * 4  * (*pbmpinfo)->bmiHeader.biHeight;

     

         (*pbmpdata)=new BYTE[ImgSize+1];

     

        memcpy(*pbmpdata,Iplmg->imageData,ImgSize);

     

        return TRUE;

     

    }

     

    //******************************************************

    //bmp文件转换IPLImage文件

    //******************************************************

    IplImage *BMP2Ipl(BITMAPINFO *pbmpinfo,BYTE *pbmpdata)

    {

     

        int channal=(pbmpinfo->bmiHeader.biBitCount == 1) ? 1:(pbmpinfo->bmiHeader.biBitCount/8);

        //仅限于二值图像和灰度图像

        //int depth  =(pbmpinfo->bmiHeader.biBitCount == 1) ? IPL_DEPTH_1U : IPL_DEPTH_8U;

        int depth  =  IPL_DEPTH_8U;

     

        int width=pbmpinfo->bmiHeader.biWidth;

        int heigh=pbmpinfo->bmiHeader.biHeight;

     

        IplImage *pmg;

     

        pmg=cvCreateImageHeader(cvSize(width,heigh),depth,channal);

            pmg->imageData=(char*)malloc(pmg->imageSize);

        //cvSetData();

        memcpy(pmg->imageData,pbmpdata,pmg->imageSize);

     

            return pmg;

     

     

     

    }

     


    最新回复(0)