现在的位置: 首页 > 综合 > 正文

CxImage转换成IplImage

2013年11月10日 ⁄ 综合 ⁄ 共 8680字 ⁄ 字号 评论关闭
最近由于在项目中用到了Opencv库,但是为了更好的显示图像还是使用了Cximage库,它可以快捷地存取、显示、转换各种图像。Opencv库用于高级图像处理与识别。为了使Cximage图像与Opencv图像交互,写了个Cximage转换到IplImage的类。

OpenCV2CXimage.h

#pragma once   
/* 
* 类说明:OpenCV图像与CXimage图像互转 
* 用于OpenCV的图像与CXimage图像格式互转进行封装。 OpenCV的图像位数必须是大等于8的整数倍,支持BMP,JPG图像格式;CXimage的图像位数可以是1、2、4、8、、24,支持BMP,JPG,TIF,PNG,GIF图像格式。 
*/  
  
#include "unicode//ximage.h"   
#pragma comment(lib, "cximage_unicode.lib")   
//#pragma comment(lib, "j2k_unicode.lib")   
#pragma comment(lib, "jasper_unicode.lib")   
#pragma comment(lib, "jbig_unicode.lib")   
#pragma comment(lib, "Jpeg_unicode.lib")   
#pragma comment(lib, "png_unicode.lib")   
#pragma comment(lib, "Tiff_unicode.lib")   
#pragma comment(lib, "zlib_unicode.lib")   
#pragma comment(lib, "mng_unicode.lib")   
#pragma comment(lib, "libdcr_unicode.lib")   
  
#include "cv.h"   
#include "cxcore.h"   
#include "highgui.h"   
#ifdef _DEBUG   
    #pragma comment(lib, "cxcore200d.lib")   
    #pragma comment(lib, "cv200d.lib")   
    #pragma comment(lib, "highgui200d.lib")   
#else   
    #pragma comment(lib, "cxcore200.lib")   
    #pragma comment(lib, "cv200.lib")   
    #pragma comment(lib, "highgui200.lib")   
#endif   
  
class OpenCV2CXimage  
{  
public:  
    OpenCV2CXimage(void);  
    ~OpenCV2CXimage(void);  
  
    /* 
    功能说明: 获取黑点标记的方式 
    参数说明:  cxImage 图像处理类 
    返回值: 黑点标记 
    */  
    static int OpenCV2CXimage::GetBlackColor(CxImage cxImage);  
  
    /* 
    功能说明: 获取白点标记的方式 
    参数说明:  cxImage 图像处理类 
    返回值: 黑点标记 
    */  
    static int OpenCV2CXimage::GetWhiteColor(CxImage cxImage);  
  
    /* 
    *功能说明:转换Cximage到IplImage(注:由于IplImage结构不支持图像像数非8位格式,所以强制转换成8位整数倍) 
    *参数说明:src,表示原始Cximage图像;dst,[out] 表示Opencv图像IplImage结构 
    *返回值:bool类型。true,表示成功;flase,表示失败。 
    */  
    bool Cximage2IplImage(CxImage *src,IplImage **dst);  
  
    /* 
    *功能说明:转换IplImage到Cximage 
    *参数说明:src,表示Opencv图像IplImage结构;dst,[out] 表示输出Cximage图像;nBpp,表示输出Cximage图像位数占多少位[一个像数占多少位](1,8,24); 
    *返回值:bool类型。true,表示成功;flase,表示失败。 
    */  
    bool IplImage2Cximage(IplImage *src,CxImage *dst,long nBpp=8);  
  
    /* 
    *功能说明:图象格式转换 
    *参数说明:src,表示输入Cximage图像;dst,[out] 表示输出Cximage图像;imagetype,表示图象类型 
    *返回值:bool类型。true,表示成功;flase,表示失败。 
    */  
    bool CxImageFormatConvert(CxImage *src,CxImage *dst,long imagetype = CXIMAGE_FORMAT_BMP);  
  
protected:  
    RGBQUAD *m_pPal;//调色版   
    int m_nPalatteCount;  
};  

 

OpenCV2CXimage.cpp
#include "StdAfx.h"   
#include "OpenCV2CXimage.h"   
#include <map>   
using namespace std;  
  
OpenCV2CXimage::OpenCV2CXimage(void)  
{  
    m_pPal = NULL;  
    m_nPalatteCount = 0;  
}  
  
OpenCV2CXimage::~OpenCV2CXimage(void)  
{  
    if(m_pPal!=NULL)  
    {  
        delete []m_pPal;  
        m_pPal = NULL;  
    }  
}  
  
//函数名: GetBlackColor   
//功能:  获取黑点标记的方式   
//参数:  cxImage 图像处理类   
//返回值: 黑点标记   
int OpenCV2CXimage::GetBlackColor(CxImage cxImage)  
{  
    long i;  
    int iBlackFlag = 0;  
    RGBQUAD *pData = cxImage.GetPalette();  
    long nPaletteSize = cxImage.GetPaletteSize()/sizeof(RGBQUAD);  
    for(i=0;i<nPaletteSize;i++)  
    {  
        if(pData[i].rgbBlue==0 && pData[i].rgbGreen==0 && pData[i].rgbRed==0)  
        {  
            iBlackFlag = i;  
            break;  
        }  
    }  
    return iBlackFlag;  
}  
  
//函数名: GetWhiteColor   
//功能:  获取白点标记的方式   
//参数:  cxImage 图像处理类   
//返回值: 黑点标记   
int OpenCV2CXimage::GetWhiteColor(CxImage cxImage)  
{  
    long i;  
    int iWhiteFlag = 255;  
    RGBQUAD *pData = cxImage.GetPalette();  
    long nPaletteSize = cxImage.GetPaletteSize()/sizeof(RGBQUAD);  
    for(i=0;i<nPaletteSize;i++)  
    {  
        if(pData[i].rgbBlue==255 && pData[i].rgbGreen==255 && pData[i].rgbRed==255)  
        {  
            iWhiteFlag = i;  
            break;  
        }  
    }  
    return iWhiteFlag;  
}  
  
/* 
*功能说明:转换Cximage到IplImage 
*参数说明:src,表示原始Cximage图像;dst,[out] 表示Opencv图像IplImage结构 
*返回值:bool类型。true,表示成功;flase,表示失败。 
*/  
bool OpenCV2CXimage::Cximage2IplImage(CxImage *src,IplImage **dst)  
{  
    bool bRet = true;  
    if(!src || !src->IsValid())  
    {  
        bRet = false;  
        return bRet;  
    }  
    m_nPalatteCount = src->GetPaletteSize()/sizeof(RGBQUAD);;  
    m_pPal = src->GetPalette();  
    int iBackColor = GetBlackColor(*src);  
    long i = 0,j = 0;  
    long nImageWidth = 0,nImageHeight = 0;  
    nImageWidth = src->GetWidth();  
    nImageHeight = src->GetHeight();  
    long nBitCunt = src->GetBpp();  
    if(nBitCunt<=1)  
    {  
        *dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_8U,1);   
        cvZero(*dst);  
        //转换Cximage to IplImage   
        for(j=0;j<nImageHeight;j++)  
        {  
            for(i=0;i<nImageWidth;i++)  
            {  
                if(src->GetPixelIndex(i,j)==iBackColor)  
                {  
                    CV_IMAGE_ELEM(*dst,uchar,nImageHeight-1-j,i) = 0;  
                }  
                else  
                {  
                    CV_IMAGE_ELEM(*dst,uchar,nImageHeight-1-j,i) = 255;  
                }  
            }  
        }  
    }  
    else if(nBitCunt<=8)  
    {  
        *dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_8U,1);   
        cvZero(*dst);  
        //对应图像调色版与标准调色版的关系   
        map<int,int> mapPalatte;  
        RGBQUAD szSystemPal[256];  
        int k = 0;  
        for(k=0;k<256;k++)  
        {  
            szSystemPal[k].rgbBlue = k;  
            szSystemPal[k].rgbGreen = k;  
            szSystemPal[k].rgbRed = k;  
            szSystemPal[k].rgbReserved = 0;  
        }  
        int m = 0;  
        for(m=0;m<m_nPalatteCount;m++)  
        {  
            for(k=0;k<256;k++)  
            {  
                if(m_pPal[m].rgbBlue==szSystemPal[k].rgbBlue && m_pPal[m].rgbGreen==szSystemPal[k].rgbGreen && m_pPal[m].rgbRed==szSystemPal[k].rgbRed)  
                {  
                    mapPalatte.insert(make_pair(m,k));  
                    break;  
                }  
            }  
        }  
        //////////////////////////////////////////////////////////////////////////   
  
        //转换Cximage to IplImage   
        map<int,int>::iterator iter;  
        BYTE btIndex = 0;  
        for(j=0;j<nImageHeight;j++)  
        {  
            for(i=0;i<nImageWidth;i++)  
            {  
                btIndex = src->GetPixelIndex(i,j);  
                iter = mapPalatte.find(btIndex);  
                if(iter!=mapPalatte.end())  
                {  
                    btIndex = iter->second;  
                }  
                CV_IMAGE_ELEM(*dst,uchar,nImageHeight-1-j,i) = btIndex;  
            }  
        }  
    }  
    else if(nBitCunt<=16)  
    {  
        *dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_16U,1);   
        (*dst)->origin = 1;//底—左结构 (Windows bitmaps 风格)    
        cvZero(*dst);  
        //转换Cximage to IplImage   
        for(j=0;j<nImageHeight;j++)  
        {  
            for(i=0;i<nImageWidth;i++)  
            {  
                BYTE *pSrc = src->GetBits(j) + 2*i;  
                CV_IMAGE_ELEM(*dst,ushort,j,i) = (*pSrc) + (*(pSrc+1))*256;  
            }  
        }  
    }  
    else //24色   
    {  
        *dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_8U,3);   
        (*dst)->origin = 1;//底—左结构 (Windows bitmaps 风格)    
        cvZero(*dst);  
        //转换Cximage to IplImag   
        memcpy((*dst)->imageData,src->GetBits(0),src->GetSize());  
    }  
    return bRet;  
}  
  
/* 
*功能说明:转换IplImage到Cximage 
*参数说明:src,表示Opencv图像IplImage结构;dst,[out] 表示输出Cximage图像;nBpp,表示输出Cximage图像位数占多少位[一个像数占多少位] 
*返回值:bool类型。true,表示成功;flase,表示失败。 
*/  
bool OpenCV2CXimage::IplImage2Cximage(IplImage *src,CxImage *dst,long nBpp)  
{  
    bool bRet = true;  
    if(src==NULL || dst==NULL)  
    {  
        return false;  
    }  
    if(!(nBpp==1 || nBpp==8 || nBpp==24))  
    {  
        return false;  
    }  
    long i = 0,j = 0;  
    CvSize csImageSize = cvGetSize(src);  
    CxImage ciTmp;  
    ciTmp.Create(csImageSize.width,csImageSize.height,src->depth,CXIMAGE_FORMAT_BMP);  
    if(src->depth== IPL_DEPTH_8U)//灰度   
    {  
        ciTmp.SetStdPalette();  
        BYTE btIndex = 0;  
        for(j=0;j<csImageSize.height;j++)  
        {  
            for(i=0;i<csImageSize.width;i++)  
            {  
                btIndex = CV_IMAGE_ELEM(src,uchar,csImageSize.height-1-j,i);  
                ciTmp.SetPixelIndex(i,j,btIndex);  
            }  
        }  
    }  
    else //彩色   
    {  
        //转换IplImag to Cximage   
        memcpy(ciTmp.GetBits(0),src->imageData,src->imageSize);  
    }  
  
    //转换成需要的目标图像   
    dst->Create(csImageSize.width,csImageSize.height,nBpp,CXIMAGE_FORMAT_BMP);  
    if(nBpp==ciTmp.GetBpp())  
    {  
        dst->Copy(ciTmp);  
    }  
    else  
    {  
        if(nBpp==1)//二值   
        {  
            //对应图像调色版与标准调色版的关系   
            map<int,int> mapPalatte;  
            RGBQUAD szSystemPal[256];  
            int k = 0;  
            for(k=0;k<256;k++)  
            {  
                szSystemPal[k].rgbBlue = k;  
                szSystemPal[k].rgbGreen = k;  
                szSystemPal[k].rgbRed = k;  
                szSystemPal[k].rgbReserved = 0;  
            }  
            int m = 0;  
            for(k=0;k<256;k++)  
            {  
                for(m=0;m<m_nPalatteCount;m++)  
                {  
                    if(m_pPal[m].rgbBlue==szSystemPal[k].rgbBlue && m_pPal[m].rgbGreen==szSystemPal[k].rgbGreen && m_pPal[m].rgbRed==szSystemPal[k].rgbRed)  
                    {  
                        mapPalatte.insert(make_pair(k,m));  
                        break;  
                    }  
                }  
            }  
            //////////////////////////////////////////////////////////////////////////   
            byte btValue = 0;  
            map<int,int>::iterator iter;  
            long nImageWidth = 0;  
            long nImageHeight = 0;  
            if(ciTmp.GetBpp()>8)  
            {  
                ciTmp.GrayScale();  
            }  
            if(m_nPalatteCount==2) //表示原始的图象为二值图象   
            {  
                dst->SetPalette(m_pPal,m_nPalatteCount);  
                btValue = 0;  
                nImageWidth = ciTmp.GetWidth();  
                nImageHeight = ciTmp.GetHeight();  
                for(j=0;j<nImageHeight;j++)  
                {  
                    for(i=0;i<nImageWidth;i++)  
                    {  
                        btValue = ciTmp.GetPixelIndex(i,j);  
                        iter = mapPalatte.find(btValue);  
                        if(iter!=mapPalatte.end())  
                        {  
                            btValue = iter->second;  
                        }  
                        dst->SetPixelIndex(i,j,btValue);  
                    }  
                }  
            }  
            else  
            {  
                ciTmp.Threshold(128);  
                dst->Copy(ciTmp);  
            }  
        }  
        else if(nBpp==8)  
        {  
            //对应图像调色版与标准调色版的关系   
            map<int,int> mapPalatte;  
            RGBQUAD szSystemPal[256];  
            int k = 0;  
            for(k=0;k<256;k++)  
            {  
                szSystemPal[k].rgbBlue = k;  
                szSystemPal[k].rgbGreen = k;  
                szSystemPal[k].rgbRed = k;  
                szSystemPal[k].rgbReserved = 0;  
            }  
            int m = 0;  
            for(k=0;k<256;k++)  
            {  
                for(m=0;m<m_nPalatteCount;m++)  
                {  
                    if(m_pPal[m].rgbBlue==szSystemPal[k].rgbBlue && m_pPal[m].rgbGreen==szSystemPal[k].rgbGreen && m_pPal[m].rgbRed==szSystemPal[k].rgbRed)  
                    {  
                        mapPalatte.insert(make_pair(k,m));  
                        break;  
                    }  
                }  
            }  
            //////////////////////////////////////////////////////////////////////////   
            byte btValue = 0;  
            map<int,int>::iterator iter;  
            long nImageWidth = 0;  
            long nImageHeight = 0;  
            if(ciTmp.GetBpp()!=8)  
            {  
                ciTmp.GrayScale();  
            }  
            if(m_nPalatteCount==8) //表示原始的图象为灰度图象   
            {  
                dst->SetPalette(m_pPal,m_nPalatteCount);  
                btValue = 0;  
                nImageWidth = ciTmp.GetWidth();  
                nImageHeight = ciTmp.GetHeight();  
                for(j=0;j<nImageHeight;j++)  
                {  
                    for(i=0;i<nImageWidth;i++)  
                    {  
                        btValue = ciTmp.GetPixelIndex(i,j);  
                        iter = mapPalatte.find(btValue);  
                        if(iter!=mapPalatte.end())  
                        {  
                            btValue = iter->second;  
                        }  
                        dst->SetPixelIndex(i,j,btValue);  
                    }  
                }  
            }  
            else  
            {  
                dst->Copy(ciTmp);  
            }  
        }  
        else  
        {  
            if(ciTmp.GetBpp()==24)  
            {  
                dst->Copy(ciTmp);  
            }  
            else  
            {  
                byte btValue = 0;  
                COLORREF clValue;  
                map<int,int>::iterator iter;  
                long nImageWidth = 0;  
                long nImageHeight = 0;  
                bRet = ciTmp.IncreaseBpp(24);  
                dst->Copy(ciTmp);  
            }  
        }  
    }  
    return bRet;  
}  
  
//图象格式转换   
bool OpenCV2CXimage::CxImageFormatConvert(CxImage *src,CxImage *dst,long imagetype)  
{  
    bool bRet = true;  
    if(src==NULL || dst==NULL)  
    {  
        return false;  
    }  
    if(!(imagetype>0 && imagetype<=19))  
    {  
        return false;  
    }  
    if(src->GetType()==imagetype)  
    {  
        dst->Copy(*src);  
    }  
    else  
    {  
        dst->Create(src->GetWidth(),src->GetHeight(),src->GetBpp(),imagetype);  
        src->SetType(imagetype);  
        dst->Copy(*src);  
    }  
    return true;  
}  

 

注:CxImage是一款优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。

 

抱歉!评论已关闭.