zoukankan      html  css  js  c++  java
  • 【转】OpenCV与CxImage转换(IplImage)、IplImage QImage Mat 格式互转

        最近由于在项目中用到了Opencv库,但是为了更好的显示图像还是使用了Cximage库,它可以快捷地存取、显示、转换各种图像。Opencv库用于高级图像处理与识别。为了使Cximage图像与Opencv图像交互,写了个Cximage转换到IplImage的类。

    OpenCV2CXimage.h

    #pragma once
    /*
    * 类说明:OpenCV图像与CXimage图像互转
    * 用于OpenCV的图像与CXimage图像格式互转进行封装。 OpenCV的图像位数必须是大等于8的整数倍,支持BMP,JPG图像格式;CXimage的图像位数可以是1、2、4、8、16、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;
    }
    //QImage->IplImage *
    static IplImage *ConvertToIplImage(const QImage &img)
    {
        int nChannel=0;
        if(img.format()==QImage::Format_RGB888)nChannel=3;
        if(img.format()==QImage::Format_ARGB32)nChannel=4;
        if( nChannel==0 )return false;
     
        IplImage *iplImg=cvCreateImageHeader( cvSize(img.width(), img.height()),8,nChannel );
        iplImg->imageData=(char*)img.bits();
     
        if(nChannel==3)
            cvConvertImage(iplImg,iplImg,CV_CVTIMG_SWAP_RB);
     
        return iplImg;
    }
     
    //Mat->QImage
    static QImage ConvertToQImage(cv::Mat &mat)
    {
        QImage img;
        int nChannel=mat.channels();
        if(nChannel==3)
        {
            cv::cvtColor(mat,mat,CV_BGR2RGB);
            img = QImage((const unsigned char*)mat.data,mat.cols,mat.rows,QImage::Format_RGB888);
        }
        else if(nChannel==4||nChannel==1)
        {
            img = QImage((const unsigned char*)mat.data,mat.cols,mat.rows,QImage::Format_ARGB32);
        }
     
        return img;
    }
     
    //IplImage *->QImage 
    static QImage ConvertToQImage(IplImage *iplImg)
    {
        QImage img;
        int nChannel=iplImg->nChannels;
        if(nChannel==3)
        {
            cvConvertImage(iplImg,iplImg,CV_CVTIMG_SWAP_RB);
            img = QImage((const unsigned char*)iplImg->imageData,iplImg->width,iplImg->height,QImage::Format_RGB888);
        }
        else if(nChannel==4||nChannel==1)
        {
            img = QImage((const unsigned char*)iplImg->imageData,iplImg->width,iplImg->height,QImage::Format_ARGB32);
        }
     
        return img;
    }
    

    本文转自:http://blog.csdn.net/augusdi/article/details/8865668

          http://www.cnblogs.com/emouse/archive/2013/03/29/2988807.html

  • 相关阅读:
    [hdu6271]Master of Connected Component
    [hdu5468]Puzzled Elena
    [hdu4582]DFS spanning tree
    [poj2054]Color a Tree
    [luogu4107]兔子和樱花
    整除的尾数[HDU2099]
    胜利大逃亡[HDU1253]
    Bitset[HDU2051]
    折线分割平面[HDU2050]
    不容易系列之(4)——考新郎[HDU2049]
  • 原文地址:https://www.cnblogs.com/PrimeLife/p/4538526.html
Copyright © 2011-2022 走看看