最近由于在项目中用到了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=); /*
*功能说明:图象格式转换
*参数说明: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 = ;
} OpenCV2CXimage::~OpenCV2CXimage(void)
{
if(m_pPal!=NULL)
{
delete []m_pPal;
m_pPal = NULL;
}
} //函数名: GetBlackColor
//功能: 获取黑点标记的方式
//参数: cxImage 图像处理类
//返回值: 黑点标记
int OpenCV2CXimage::GetBlackColor(CxImage cxImage)
{
long i;
int iBlackFlag = ;
RGBQUAD *pData = cxImage.GetPalette();
long nPaletteSize = cxImage.GetPaletteSize()/sizeof(RGBQUAD);
for(i=;i<nPaletteSize;i++)
{
if(pData[i].rgbBlue== && pData[i].rgbGreen== && pData[i].rgbRed==)
{
iBlackFlag = i;
break;
}
}
return iBlackFlag;
} //函数名: GetWhiteColor
//功能: 获取白点标记的方式
//参数: cxImage 图像处理类
//返回值: 黑点标记
int OpenCV2CXimage::GetWhiteColor(CxImage cxImage)
{
long i;
int iWhiteFlag = ;
RGBQUAD *pData = cxImage.GetPalette();
long nPaletteSize = cxImage.GetPaletteSize()/sizeof(RGBQUAD);
for(i=;i<nPaletteSize;i++)
{
if(pData[i].rgbBlue== && pData[i].rgbGreen== && pData[i].rgbRed==)
{
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 = ,j = ;
long nImageWidth = ,nImageHeight = ;
nImageWidth = src->GetWidth();
nImageHeight = src->GetHeight();
long nBitCunt = src->GetBpp();
if(nBitCunt<=)
{
*dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_8U,);
cvZero(*dst);
//转换Cximage to IplImage
for(j=;j<nImageHeight;j++)
{
for(i=;i<nImageWidth;i++)
{
if(src->GetPixelIndex(i,j)==iBackColor)
{
CV_IMAGE_ELEM(*dst,uchar,nImageHeight--j,i) = ;
}
else
{
CV_IMAGE_ELEM(*dst,uchar,nImageHeight--j,i) = ;
}
}
}
}
else if(nBitCunt<=)
{
*dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_8U,);
cvZero(*dst);
//对应图像调色版与标准调色版的关系
map<int,int> mapPalatte;
RGBQUAD szSystemPal[];
int k = ;
for(k=;k<;k++)
{
szSystemPal[k].rgbBlue = k;
szSystemPal[k].rgbGreen = k;
szSystemPal[k].rgbRed = k;
szSystemPal[k].rgbReserved = ;
}
int m = ;
for(m=;m<m_nPalatteCount;m++)
{
for(k=;k<;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 = ;
for(j=;j<nImageHeight;j++)
{
for(i=;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--j,i) = btIndex;
}
}
}
else if(nBitCunt<=)
{
*dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_16U,);
(*dst)->origin = ;//底—左结构 (Windows bitmaps 风格)
cvZero(*dst);
//转换Cximage to IplImage
for(j=;j<nImageHeight;j++)
{
for(i=;i<nImageWidth;i++)
{
BYTE *pSrc = src->GetBits(j) + *i;
CV_IMAGE_ELEM(*dst,ushort,j,i) = (*pSrc) + (*(pSrc+))*;
}
}
}
else //24色
{
*dst = cvCreateImage(cvSize(nImageWidth,nImageHeight),IPL_DEPTH_8U,);
(*dst)->origin = ;//底—左结构 (Windows bitmaps 风格)
cvZero(*dst);
//转换Cximage to IplImag
memcpy((*dst)->imageData,src->GetBits(),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== || nBpp== || nBpp==))
{
return false;
}
long i = ,j = ;
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 = ;
for(j=;j<csImageSize.height;j++)
{
for(i=;i<csImageSize.width;i++)
{
btIndex = CV_IMAGE_ELEM(src,uchar,csImageSize.height--j,i);
ciTmp.SetPixelIndex(i,j,btIndex);
}
}
}
else //彩色
{
//转换IplImag to Cximage
memcpy(ciTmp.GetBits(),src->imageData,src->imageSize);
} //转换成需要的目标图像
dst->Create(csImageSize.width,csImageSize.height,nBpp,CXIMAGE_FORMAT_BMP);
if(nBpp==ciTmp.GetBpp())
{
dst->Copy(ciTmp);
}
else
{
if(nBpp==)//二值
{
//对应图像调色版与标准调色版的关系
map<int,int> mapPalatte;
RGBQUAD szSystemPal[];
int k = ;
for(k=;k<;k++)
{
szSystemPal[k].rgbBlue = k;
szSystemPal[k].rgbGreen = k;
szSystemPal[k].rgbRed = k;
szSystemPal[k].rgbReserved = ;
}
int m = ;
for(k=;k<;k++)
{
for(m=;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 = ;
map<int,int>::iterator iter;
long nImageWidth = ;
long nImageHeight = ;
if(ciTmp.GetBpp()>)
{
ciTmp.GrayScale();
}
if(m_nPalatteCount==) //表示原始的图象为二值图象
{
dst->SetPalette(m_pPal,m_nPalatteCount);
btValue = ;
nImageWidth = ciTmp.GetWidth();
nImageHeight = ciTmp.GetHeight();
for(j=;j<nImageHeight;j++)
{
for(i=;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();
dst->Copy(ciTmp);
}
}
else if(nBpp==)
{
//对应图像调色版与标准调色版的关系
map<int,int> mapPalatte;
RGBQUAD szSystemPal[];
int k = ;
for(k=;k<;k++)
{
szSystemPal[k].rgbBlue = k;
szSystemPal[k].rgbGreen = k;
szSystemPal[k].rgbRed = k;
szSystemPal[k].rgbReserved = ;
}
int m = ;
for(k=;k<;k++)
{
for(m=;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 = ;
map<int,int>::iterator iter;
long nImageWidth = ;
long nImageHeight = ;
if(ciTmp.GetBpp()!=)
{
ciTmp.GrayScale();
}
if(m_nPalatteCount==) //表示原始的图象为灰度图象
{
dst->SetPalette(m_pPal,m_nPalatteCount);
btValue = ;
nImageWidth = ciTmp.GetWidth();
nImageHeight = ciTmp.GetHeight();
for(j=;j<nImageHeight;j++)
{
for(i=;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()==)
{
dst->Copy(ciTmp);
}
else
{
byte btValue = ;
COLORREF clValue;
map<int,int>::iterator iter;
long nImageWidth = ;
long nImageHeight = ;
bRet = ciTmp.IncreaseBpp();
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> && imagetype<=))
{
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

【转】OpenCV与CxImage转换(IplImage)、IplImage QImage Mat 格式互转的更多相关文章

  1. opencv IplImage各参数详细介绍以及如何从一个JPEG图像数据指针转换得到IplImage

    这篇文章里介绍得最清楚了.http://blog.chinaunix.net/uid-22682903-id-1771421.html 关于颜色空间  RGB颜色空间已经非常熟悉了.HSV颜色空间需要 ...

  2. 【OpenCV开发】OpenCV3后IPLimage转换成MAT的问题

    IplImage* img1 = cvCreateImage(cvGetSize(resizeRes), IPL_DEPTH_8U, 1);//创建目标图像 Mat test = img1;  报错 ...

  3. IplImage 与 QImage 相互转换

    在使用Qt和OpenCV编程时,对于它们各自的图像类QImage和IplImage难以避免的需要互相之间的转换,下面我们就来看它们的相互转换. 1. QImage 转换为 IplImage IplIm ...

  4. OpenCV数据结构:CvMat,IplImage,CvArr的应用

    最近看HS算法时,发现在新的OpenCV3.0已经移除了该算法,于是不得不看老版的.这其中涉及到了CvMat,CvArr,IplImage的使用.关于这三个结构与Mat的转换关系,总结如下: (1)派 ...

  5. OpenCV 3.0中IplImage* 转cv::Mat

    在OpenCV 2.0中使用: IplImage * ipl1, *ipl2; // ... const cv::Mat m = cv::Mat(ipl,false); cv::Mat m2 = ip ...

  6. OpenCV学习笔记(二) cv::Mat

    部分内容转自:OpenCV Tuturial,ggicci 在OpenCV Tuturial中可查看Mat的初始化与打印方法. Mat本质上是由两个数据部分组成的类: 矩阵头(包含矩阵尺寸,存储方法, ...

  7. opencv中Mat格式的数据访问.at

    opencv3中图形存储基本为Mat格式,如果我们想获取像素点的灰度值或者RGB值,可以通过image.at<uchar>(i,j)的方式轻松获取. Mat类中的at方法对于获取图像矩阵某 ...

  8. Excel将秒转换成标准的时间格式HH:MM:SS

    Excel将秒转换成标准的时间格式HH:MM:SS 比如120秒,转换成00:02:00 Excel公式为: =TEXT(A1/86400,"[hh]:mm:ss") A1为秒数据 ...

  9. qrcode.js插件将你的内容转换成二维码格式

    ---qrcode.js插件将你的内容转换成二维码格式--- 我之前一直想知道二维码是怎么生成,所以就了解了一下, 最后还是不知道它的原理, 但是,我知道怎么生成. 现在就让我带你制作一个你喜爱的二维 ...

随机推荐

  1. Linux一键安装web环境全攻略(阿里云服务器)

    摘自阿里云服务器官网,此处 一键安装包下载: 点此下载 安装须知 1.此安装包可在阿里云所有linux系统上部署安装,此安装包包含的软件及版本为: nginx:1.0.15.1.2.5.1.4.4 a ...

  2. saiku中默认级别all的国际化

    在制作saiku的schema文件的时候,当你选择层次的属性hasAll为true的时候,系统默认会为你的层次添加一个“(all)”级别,你无法给它增加一个caption属性来国际化它,因为他不是你创 ...

  3. js 使用for循环遍历数组

    今天写个无聊的东西!for循环的使用! 例如以下:定义a数组,b为伪数组! var a = [1,2,3,0,5,4]; var b = document.getElementsByTagName(' ...

  4. Python操作Access数据库

    我们在这篇文章中公分了五个步骤详细分析了Python操作Access数据库的相关方法,希望可以给又需要的朋友们带来一些帮助. AD: Python编 程语言的出现,带给开发人员非常大的好处.我们可以利 ...

  5. JavaScript之获取和设置元素属性

    1.与我前面的随笔获取元素的那些方法不同http://www.cnblogs.com/GreenLeaves/p/5689075.html 获取元素属性的方法getAttribute()不属于docu ...

  6. Asp.net 获取服务器指定文件夹目录文件,并提供下载

    string dirPath = HttpContext.Current.Server.MapPath("uploads/"); if (Directory.Exists(dirP ...

  7. VIM中格式化json

    在vim输入以下命令就可以格式化:%!python -m json.tool可以在~/.vimrc增加快捷键map <F4><Esc>:%!python -m json.too ...

  8. 2014.9.20CSS样式表

    一.前景与背景 background-color: 背景色,定义背景的颜色 background-image:url() 定义背景图片 background-attachment:fixed/scro ...

  9. iOS 导航条的影响

    如果是push出来的控制器,self.view的(0,0)点从状态栏下面开始: 如果有present出来的控制器,self.view的(0,0)点包含状态栏:

  10. BZOJ 1407: [Noi2002]Savage( 数论 )

    枚举答案, 然后O(N^2)枚举野人去判他们是否会在有生之年存在同山洞. 具体做法就是: 设第x年相遇, 则 Ci+x*Pi=Cj+x*Pj (mod M), 然后解同余方程. 复杂度应该是O(ans ...