OpenCV與CxImage轉換(IplImage)

#pragma once
/*
* 類說明:OpenCV圖像與CXimage圖像互轉
* 用於OpenCV的圖像與CXimage圖像格式互轉進行封裝。 OpenCV的圖像位數必須是大等於8的整數倍,支持BMP,JPG圖像格式;CXimage的圖像位數能夠是一、二、四、八、1六、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;
}
相關文章
相關標籤/搜索