OpenCV与CxImage转换(IplImage)

44 篇文章 2 订阅

     最近由于在项目中用到了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;
}


 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值