CxImage转换成IplImage

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

OpenCV2CXimage.h

01.#pragma once   
02./* 
03.* 类说明:OpenCV图像与CXimage图像互转 
04.* 用于OpenCV的图像与CXimage图像格式互转进行封装。 OpenCV的图像位数必须是大等于8的整数倍,支持BMP,JPG图像格式;CXimage的图像位数可以是1、2、4、8、16、24,支持BMP,JPG,TIF,PNG,GIF图像格式。 
05.*/  
06.  
07.#include "unicode//ximage.h"   
08.#pragma comment(lib, "cximage_unicode.lib")   
09.//#pragma comment(lib, "j2k_unicode.lib")   
10.#pragma comment(lib, "jasper_unicode.lib")   
11.#pragma comment(lib, "jbig_unicode.lib")   
12.#pragma comment(lib, "Jpeg_unicode.lib")   
13.#pragma comment(lib, "png_unicode.lib")   
14.#pragma comment(lib, "Tiff_unicode.lib")   
15.#pragma comment(lib, "zlib_unicode.lib")   
16.#pragma comment(lib, "mng_unicode.lib")   
17.#pragma comment(lib, "libdcr_unicode.lib")   
18.  
19.#include "cv.h"   
20.#include "cxcore.h"   
21.#include "highgui.h"   
22.#ifdef _DEBUG   
23.    #pragma comment(lib, "cxcore200d.lib")   
24.    #pragma comment(lib, "cv200d.lib")   
25.    #pragma comment(lib, "highgui200d.lib")   
26.#else   
27.    #pragma comment(lib, "cxcore200.lib")   
28.    #pragma comment(lib, "cv200.lib")   
29.    #pragma comment(lib, "highgui200.lib")   
30.#endif   
31.  
32.class OpenCV2CXimage  
33.{  
34.public:  
35.    OpenCV2CXimage(void);  
36.    ~OpenCV2CXimage(void);  
37.  
38.    /* 
39.    功能说明: 获取黑点标记的方式 
40.    参数说明:  cxImage 图像处理类 
41.    返回值: 黑点标记 
42.    */  
43.    static int OpenCV2CXimage::GetBlackColor(CxImage cxImage);  
44.  
45.    /* 
46.    功能说明: 获取白点标记的方式 
47.    参数说明:  cxImage 图像处理类 
48.    返回值: 黑点标记 
49.    */  
50.    static int OpenCV2CXimage::GetWhiteColor(CxImage cxImage);  
51.  
52.    /* 
53.    *功能说明:转换Cximage到IplImage(注:由于IplImage结构不支持图像像数非8位格式,所以强制转换成8位整数倍) 
54.    *参数说明:src,表示原始Cximage图像;dst,[out] 表示Opencv图像IplImage结构 
55.    *返回值:bool类型。true,表示成功;flase,表示失败。 
56.    */  
57.    bool Cximage2IplImage(CxImage *src,IplImage **dst);  
58.  
59.    /* 
60.    *功能说明:转换IplImage到Cximage 
61.    *参数说明:src,表示Opencv图像IplImage结构;dst,[out] 表示输出Cximage图像;nBpp,表示输出Cximage图像位数占多少位[一个像数占多少位](1,8,24); 
62.    *返回值:bool类型。true,表示成功;flase,表示失败。 
63.    */  
64.    bool IplImage2Cximage(IplImage *src,CxImage *dst,long nBpp=8);  
65.  
66.    /* 
67.    *功能说明:图象格式转换 
68.    *参数说明:src,表示输入Cximage图像;dst,[out] 表示输出Cximage图像;imagetype,表示图象类型 
69.    *返回值:bool类型。true,表示成功;flase,表示失败。 
70.    */  
71.    bool CxImageFormatConvert(CxImage *src,CxImage *dst,long imagetype = CXIMAGE_FORMAT_BMP);  
72.  
73.protected:  
74.    RGBQUAD *m_pPal;//调色版   
75.    int m_nPalatteCount;  
76.};  



 

OpenCV2CXimage.cpp

01.#include "StdAfx.h"   
02.#include "OpenCV2CXimage.h"   
03.#include <map>   
04.using namespace std;  
05.  
06.OpenCV2CXimage::OpenCV2CXimage(void)  
07.{  
08.    m_pPal = NULL;  
09.    m_nPalatteCount = 0;  
10.}  
11.  
12.OpenCV2CXimage::~OpenCV2CXimage(void)  
13.{  
14.    if(m_pPal!=NULL)  
15.    {  
16.        delete []m_pPal;  
17.        m_pPal = NULL;  
18.    }  
19.}  
20.  
21.//函数名: GetBlackColor   
22.//功能:  获取黑点标记的方式   
23.//参数:  cxImage 图像处理类   
24.//返回值: 黑点标记   
25.int OpenCV2CXimage::GetBlackColor(CxImage cxImage)  
26.{  
27.    long i;  
28.    int iBlackFlag = 0;  
29.    RGBQUAD *pData = cxImage.GetPalette();  
30.    long nPaletteSize = cxImage.GetPaletteSize()/sizeof(RGBQUAD);  
31.    for(i=0;i<nPaletteSize;i++)  
32.    {  
33.        if(pData[i].rgbBlue==0 && pData[i].rgbGreen==0 && pData[i].rgbRed==0)  
34.        {  
35.            iBlackFlag = i;  
36.            break;  
37.        }  
38.    }  
39.    return iBlackFlag;  
40.}  
41.  
42.//函数名: GetWhiteColor   
43.//功能:  获取白点标记的方式   
44.//参数:  cxImage 图像处理类   
45.//返回值: 黑点标记   
46.int OpenCV2CXimage::GetWhiteColor(CxImage cxImage)  
47.{  
48.    long i;  
49.    int iWhiteFlag = 255;  
50.    RGBQUAD *pData = cxImage.GetPalette();  
51.    long nPaletteSize = cxImage.GetPaletteSize()/sizeof(RGBQUAD);  
52.    for(i=0;i<nPaletteSize;i++)  
53.    {  
54.        if(pData[i].rgbBlue==255 && pData[i].rgbGreen==255 && pData[i].rgbRed==255)  
55.        {  
56.            iWhiteFlag = i;  
57.            break;  
58.        }  
59.    }  
60.    return iWhiteFlag;  
61.}  
62.  
63./* 
64.*功能说明:转换Cximage到IplImage 
65.*参数说明:src,表示原始Cximage图像;dst,[out] 表示Opencv图像IplImage结构 
66.*返回值:bool类型。true,表示成功;flase,表示失败。 
67.*/  
68.bool OpenCV2CXimage::Cximage2IplImage(CxImage *src,IplImage **dst)  
69.{  
70.    bool bRet = true;  
71.    if(!src || !src->IsValid())  
72.    {  
73.        bRet = false;  
74.        return bRet;  
75.    }  
76.    m_nPalatteCount = src->GetPaletteSize()/sizeof(RGBQUAD);;  
77.    m_pPal = src->GetPalette();  
78.    int iBackColor = GetBlackColor(*src);  
79.    long i = 0,j = 0;  
80.    long nImageWidth = 0,nImageHeight = 0;  
81.    nImageWidth = src->GetWidth();  
82.    nImageHeight = src->GetHeight();  
83.    long nBitCunt = src->GetBpp();  
84.    if(nBitCunt<=1)  
85.    {  
86.        *dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_8U,1);   
87.        cvZero(*dst);  
88.        //转换Cximage to IplImage   
89.        for(j=0;j<nImageHeight;j++)  
90.        {  
91.            for(i=0;i<nImageWidth;i++)  
92.            {  
93.                if(src->GetPixelIndex(i,j)==iBackColor)  
94.                {  
95.                    CV_IMAGE_ELEM(*dst,uchar,nImageHeight-1-j,i) = 0;  
96.                }  
97.                else  
98.                {  
99.                    CV_IMAGE_ELEM(*dst,uchar,nImageHeight-1-j,i) = 255;  
100.                }  
101.            }  
102.        }  
103.    }  
104.    else if(nBitCunt<=8)  
105.    {  
106.        *dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_8U,1);   
107.        cvZero(*dst);  
108.        //对应图像调色版与标准调色版的关系   
109.        map<int,int> mapPalatte;  
110.        RGBQUAD szSystemPal[256];  
111.        int k = 0;  
112.        for(k=0;k<256;k++)  
113.        {  
114.            szSystemPal[k].rgbBlue = k;  
115.            szSystemPal[k].rgbGreen = k;  
116.            szSystemPal[k].rgbRed = k;  
117.            szSystemPal[k].rgbReserved = 0;  
118.        }  
119.        int m = 0;  
120.        for(m=0;m<m_nPalatteCount;m++)  
121.        {  
122.            for(k=0;k<256;k++)  
123.            {  
124.                if(m_pPal[m].rgbBlue==szSystemPal[k].rgbBlue && m_pPal[m].rgbGreen==szSystemPal[k].rgbGreen && m_pPal[m].rgbRed==szSystemPal[k].rgbRed)  
125.                {  
126.                    mapPalatte.insert(make_pair(m,k));  
127.                    break;  
128.                }  
129.            }  
130.        }  
131.        //////////////////////////////////////////////////////////////////////////   
132.  
133.        //转换Cximage to IplImage   
134.        map<int,int>::iterator iter;  
135.        BYTE btIndex = 0;  
136.        for(j=0;j<nImageHeight;j++)  
137.        {  
138.            for(i=0;i<nImageWidth;i++)  
139.            {  
140.                btIndex = src->GetPixelIndex(i,j);  
141.                iter = mapPalatte.find(btIndex);  
142.                if(iter!=mapPalatte.end())  
143.                {  
144.                    btIndex = iter->second;  
145.                }  
146.                CV_IMAGE_ELEM(*dst,uchar,nImageHeight-1-j,i) = btIndex;  
147.            }  
148.        }  
149.    }  
150.    else if(nBitCunt<=16)  
151.    {  
152.        *dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_16U,1);   
153.        (*dst)->origin = 1;//底—左结构 (Windows bitmaps 风格)    
154.        cvZero(*dst);  
155.        //转换Cximage to IplImage   
156.        for(j=0;j<nImageHeight;j++)  
157.        {  
158.            for(i=0;i<nImageWidth;i++)  
159.            {  
160.                BYTE *pSrc = src->GetBits(j) + 2*i;  
161.                CV_IMAGE_ELEM(*dst,ushort,j,i) = (*pSrc) + (*(pSrc+1))*256;  
162.            }  
163.        }  
164.    }  
165.    else //24色   
166.    {  
167.        *dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_8U,3);   
168.        (*dst)->origin = 1;//底—左结构 (Windows bitmaps 风格)    
169.        cvZero(*dst);  
170.        //转换Cximage to IplImag   
171.        memcpy((*dst)->imageData,src->GetBits(0),src->GetSize());  
172.    }  
173.    return bRet;  
174.}  
175.  
176./* 
177.*功能说明:转换IplImage到Cximage 
178.*参数说明:src,表示Opencv图像IplImage结构;dst,[out] 表示输出Cximage图像;nBpp,表示输出Cximage图像位数占多少位[一个像数占多少位] 
179.*返回值:bool类型。true,表示成功;flase,表示失败。 
180.*/  
181.bool OpenCV2CXimage::IplImage2Cximage(IplImage *src,CxImage *dst,long nBpp)  
182.{  
183.    bool bRet = true;  
184.    if(src==NULL || dst==NULL)  
185.    {  
186.        return false;  
187.    }  
188.    if(!(nBpp==1 || nBpp==8 || nBpp==24))  
189.    {  
190.        return false;  
191.    }  
192.    long i = 0,j = 0;  
193.    CvSize csImageSize = cvGetSize(src);  
194.    CxImage ciTmp;  
195.    ciTmp.Create(csImageSize.width,csImageSize.height,src->depth,CXIMAGE_FORMAT_BMP);  
196.    if(src->depth== IPL_DEPTH_8U)//灰度   
197.    {  
198.        ciTmp.SetStdPalette();  
199.        BYTE btIndex = 0;  
200.        for(j=0;j<csImageSize.height;j++)  
201.        {  
202.            for(i=0;i<csImageSize.width;i++)  
203.            {  
204.                btIndex = CV_IMAGE_ELEM(src,uchar,csImageSize.height-1-j,i);  
205.                ciTmp.SetPixelIndex(i,j,btIndex);  
206.            }  
207.        }  
208.    }  
209.    else //彩色   
210.    {  
211.        //转换IplImag to Cximage   
212.        memcpy(ciTmp.GetBits(0),src->imageData,src->imageSize);  
213.    }  
214.  
215.    //转换成需要的目标图像   
216.    dst->Create(csImageSize.width,csImageSize.height,nBpp,CXIMAGE_FORMAT_BMP);  
217.    if(nBpp==ciTmp.GetBpp())  
218.    {  
219.        dst->Copy(ciTmp);  
220.    }  
221.    else  
222.    {  
223.        if(nBpp==1)//二值   
224.        {  
225.            //对应图像调色版与标准调色版的关系   
226.            map<int,int> mapPalatte;  
227.            RGBQUAD szSystemPal[256];  
228.            int k = 0;  
229.            for(k=0;k<256;k++)  
230.            {  
231.                szSystemPal[k].rgbBlue = k;  
232.                szSystemPal[k].rgbGreen = k;  
233.                szSystemPal[k].rgbRed = k;  
234.                szSystemPal[k].rgbReserved = 0;  
235.            }  
236.            int m = 0;  
237.            for(k=0;k<256;k++)  
238.            {  
239.                for(m=0;m<m_nPalatteCount;m++)  
240.                {  
241.                    if(m_pPal[m].rgbBlue==szSystemPal[k].rgbBlue && m_pPal[m].rgbGreen==szSystemPal[k].rgbGreen && m_pPal[m].rgbRed==szSystemPal[k].rgbRed)  
242.                    {  
243.                        mapPalatte.insert(make_pair(k,m));  
244.                        break;  
245.                    }  
246.                }  
247.            }  
248.            //////////////////////////////////////////////////////////////////////////   
249.            byte btValue = 0;  
250.            map<int,int>::iterator iter;  
251.            long nImageWidth = 0;  
252.            long nImageHeight = 0;  
253.            if(ciTmp.GetBpp()>8)  
254.            {  
255.                ciTmp.GrayScale();  
256.            }  
257.            if(m_nPalatteCount==2) //表示原始的图象为二值图象   
258.            {  
259.                dst->SetPalette(m_pPal,m_nPalatteCount);  
260.                btValue = 0;  
261.                nImageWidth = ciTmp.GetWidth();  
262.                nImageHeight = ciTmp.GetHeight();  
263.                for(j=0;j<nImageHeight;j++)  
264.                {  
265.                    for(i=0;i<nImageWidth;i++)  
266.                    {  
267.                        btValue = ciTmp.GetPixelIndex(i,j);  
268.                        iter = mapPalatte.find(btValue);  
269.                        if(iter!=mapPalatte.end())  
270.                        {  
271.                            btValue = iter->second;  
272.                        }  
273.                        dst->SetPixelIndex(i,j,btValue);  
274.                    }  
275.                }  
276.            }  
277.            else  
278.            {  
279.                ciTmp.Threshold(128);  
280.                dst->Copy(ciTmp);  
281.            }  
282.        }  
283.        else if(nBpp==8)  
284.        {  
285.            //对应图像调色版与标准调色版的关系   
286.            map<int,int> mapPalatte;  
287.            RGBQUAD szSystemPal[256];  
288.            int k = 0;  
289.            for(k=0;k<256;k++)  
290.            {  
291.                szSystemPal[k].rgbBlue = k;  
292.                szSystemPal[k].rgbGreen = k;  
293.                szSystemPal[k].rgbRed = k;  
294.                szSystemPal[k].rgbReserved = 0;  
295.            }  
296.            int m = 0;  
297.            for(k=0;k<256;k++)  
298.            {  
299.                for(m=0;m<m_nPalatteCount;m++)  
300.                {  
301.                    if(m_pPal[m].rgbBlue==szSystemPal[k].rgbBlue && m_pPal[m].rgbGreen==szSystemPal[k].rgbGreen && m_pPal[m].rgbRed==szSystemPal[k].rgbRed)  
302.                    {  
303.                        mapPalatte.insert(make_pair(k,m));  
304.                        break;  
305.                    }  
306.                }  
307.            }  
308.            //////////////////////////////////////////////////////////////////////////   
309.            byte btValue = 0;  
310.            map<int,int>::iterator iter;  
311.            long nImageWidth = 0;  
312.            long nImageHeight = 0;  
313.            if(ciTmp.GetBpp()!=8)  
314.            {  
315.                ciTmp.GrayScale();  
316.            }  
317.            if(m_nPalatteCount==8) //表示原始的图象为灰度图象   
318.            {  
319.                dst->SetPalette(m_pPal,m_nPalatteCount);  
320.                btValue = 0;  
321.                nImageWidth = ciTmp.GetWidth();  
322.                nImageHeight = ciTmp.GetHeight();  
323.                for(j=0;j<nImageHeight;j++)  
324.                {  
325.                    for(i=0;i<nImageWidth;i++)  
326.                    {  
327.                        btValue = ciTmp.GetPixelIndex(i,j);  
328.                        iter = mapPalatte.find(btValue);  
329.                        if(iter!=mapPalatte.end())  
330.                        {  
331.                            btValue = iter->second;  
332.                        }  
333.                        dst->SetPixelIndex(i,j,btValue);  
334.                    }  
335.                }  
336.            }  
337.            else  
338.            {  
339.                dst->Copy(ciTmp);  
340.            }  
341.        }  
342.        else  
343.        {  
344.            if(ciTmp.GetBpp()==24)  
345.            {  
346.                dst->Copy(ciTmp);  
347.            }  
348.            else  
349.            {  
350.                byte btValue = 0;  
351.                COLORREF clValue;  
352.                map<int,int>::iterator iter;  
353.                long nImageWidth = 0;  
354.                long nImageHeight = 0;  
355.                bRet = ciTmp.IncreaseBpp(24);  
356.                dst->Copy(ciTmp);  
357.            }  
358.        }  
359.    }  
360.    return bRet;  
361.}  
362.  
363.//图象格式转换   
364.bool OpenCV2CXimage::CxImageFormatConvert(CxImage *src,CxImage *dst,long imagetype)  
365.{  
366.    bool bRet = true;  
367.    if(src==NULL || dst==NULL)  
368.    {  
369.        return false;  
370.    }  
371.    if(!(imagetype>0 && imagetype<=19))  
372.    {  
373.        return false;  
374.    }  
375.    if(src->GetType()==imagetype)  
376.    {  
377.        dst->Copy(*src);  
378.    }  
379.    else  
380.    {  
381.        dst->Create(src->GetWidth(),src->GetHeight(),src->GetBpp(),imagetype);  
382.        src->SetType(imagetype);  
383.        dst->Copy(*src);  
384.    }  
385.    return true;  
386.}  

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

你可能感兴趣的:(CxImage转换成IplImage)