#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; }