我是靠谱客的博主 飘逸未来,最近开发中收集的这篇文章主要介绍把ImageDib的unsigned char* m_pImgData转换为IplImage的char* imageData,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

	今天终于把困扰我三天的问题解决了。

我原本想把Visual C++数字图像模式识别典型案例详解中的人脸定位的CalSim()函数移植到VS2010中的。

但是就被unsigned char* 转换为char* 这个思想给困住了。

贴上书上的原函数:

void FaceDetect::CalSim()
{
	//若灰度图像,则返回
	if(m_nBitCount==8) return;

	//释放旧的输出图像数据及颜色表缓冲区
	if(m_pImgDataOut!=NULL){
		delete []m_pImgDataOut;
		m_pImgDataOut=NULL;
	}
	if(m_lpColorTableOut!=NULL){
		delete []m_lpColorTableOut;
		m_lpColorTableOut=NULL;
	}

	//灰值化后,每像素位数为8比特
	m_nBitCountOut=8;

	//颜色表长度
	m_nColorTableLengthOut=ComputeColorTabalLength(m_nBitCountOut);

	//申请颜色表缓冲区,生成灰度图像的颜色表
	if(m_nColorTableLengthOut!=0){
    	m_lpColorTableOut=new RGBQUAD[m_nColorTableLengthOut];
		for(int i=0; i<m_nColorTableLengthOut;i++){
			m_lpColorTableOut[i].rgbBlue=i;
			m_lpColorTableOut[i].rgbGreen=i;
			m_lpColorTableOut[i].rgbRed=i;
			m_lpColorTableOut[i].rgbReserved=0;
		}
	}

	//输入图像每像素字节数,彩色图像为3字节/像素
	int pixelByteIn=3;
	
	//输入图像每行像素所占字节数,必须是4的倍数
	int lineByteIn=(m_imgWidth*pixelByteIn+3)/4*4;

	//输出图像的宽高,与输入图像相等
	m_imgWidthOut=m_imgWidth;
	m_imgHeightOut=m_imgHeight;

	//输出图像每行像素所占字节数,必须是4的倍数
	int lineByteOut=(m_imgWidth*m_nBitCountOut/8+3)/4*4;

	//申请输出图像位图数据缓冲区
	m_pImgDataOut=new unsigned char[lineByteOut*m_imgHeight];

	//循环变量,图像的坐标
	int i,j,k;
	char c_t1[4];

	for(i=0;i<m_imgHeight;i++){
		for(j=0;j<m_imgWidth;j++){
			*(m_pImgDataOut+i*lineByteOut+j)=255;
		}
	}

	m_pSimArray = new double*[m_imgHeight];
	for(i=0;i<m_imgHeight;i++)
		m_pSimArray[i] = new double[m_imgWidth];

	for(i=0;i<m_imgHeight;i++)
	{
		for (j=0;j<m_imgWidth;j++)
		{
			for(k=0;k<3;k++)
			{
				c_t1[k]=*(m_pImgDataIn1+i*lineByteIn+j*pixelByteIn+k);
			}
			int C_b=(int)c_t1[0]&255;
			int C_g=(int)c_t1[1]&255;
			int C_r=(int)c_t1[2]&255;
			double Cb=(128-37.797*C_r/255-74.203*C_g/255+112*C_b/255);
			double Cr=(128+112*C_r/255-93.786*C_g/255-18.214*C_b/255);
			double tt =(Cb-Cb_Mean)*((Cb-Cb_Mean)*Cov11-(Cr-Cr_Mean)*Cov10)+(Cr-Cr_Mean)*(-(Cb-Cb_Mean)*Cov01+(Cr-Cr_Mean)*Cov00);
			tt =(-0.5*tt)/(Cov00*Cov11-Cov01*Cov10);
			m_pSimArray[i][j]=exp(tt);
		}
	}
	CalMedFl(m_pSimArray,m_imgWidth, m_imgHeight,9);
	double max=0.0;

	for(i=0;i<m_imgHeight;i++)
		for (j=0;j<m_imgWidth;j++)
		{
			if(m_pSimArray[i][j]>max)
				max=m_pSimArray[i][j];
		}
	for( i=0;i<m_imgHeight;i++)
		for (j=0;j<m_imgWidth;j++)
		{
			m_pSimArray[i][j]= m_pSimArray[i][j]/max;
		}

	for(i=0;i<m_imgHeight;i++)
		for(j=0;j<m_imgWidth;j++)
		{
			*(m_pImgDataOut+i*lineByteOut+j)=(int)(m_pSimArray[i][j]*255);
		}
}
void FaceDetect::CalMedFl(double **s, int w, int h, int n)
{

int i,j;
double **temp;
temp = new double*[h+2*(int)(n/2)];
for(i=0;i<h+2*(int)(n/2);i++)
temp[i] = new double[w+2*(int)(n/2)];
for(i=0;i<w+2*(int)(n/2);i++)
for(j=0;j<h+2*(int)(n/2);j++)
temp[j][i] = 0.0;

for(i=0;i<h;i++)
for(j=0;j<w;j++)
temp[i+(int)(n/2)][j+(int)(n/2)]=s[i][j];
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{
s[i][j]=0.0;
for(int r=0;r<n;r++)
for(int c=0;c<n;c++)
s[i][j]+=temp[i+r][j+c];
s[i][j]/=n*n;
}
if(temp!=NULL)
{
for(i=0;i<h+2;i++)
if(temp[i]!=NULL)
delete temp[i];
delete temp;
}

}

前面很多什么调色板啊之类的是不用的。

但对数据的处理就需要经过思考了。


我主要面临的数据处理部分的问题代码是这么一段:

for(i=0;i<m_imgHeight;i++)
	{
		for (j=0;j<m_imgWidth;j++)
		{
			for(k=0;k<3;k++)
			{
				c_t1[k]=*(m_pImgDataIn1+i*lineByteIn+j*pixelByteIn+k);
			}
			int C_b=(int)c_t1[0]&255;
			int C_g=(int)c_t1[1]&255;
			int C_r=(int)c_t1[2]&255;
			double Cb=(128-37.797*C_r/255-74.203*C_g/255+112*C_b/255);
			double Cr=(128+112*C_r/255-93.786*C_g/255-18.214*C_b/255);
			double tt =(Cb-Cb_Mean)*((Cb-Cb_Mean)*Cov11-(Cr-Cr_Mean)*Cov10)+(Cr-Cr_Mean)*(-(Cb-Cb_Mean)*Cov01+(Cr-Cr_Mean)*Cov00);
			tt =(-0.5*tt)/(Cov00*Cov11-Cov01*Cov10);
			m_pSimArray[i][j]=exp(tt);
m_pImgDataIn1的定义是unsigned char*型的,说明其指向的数据范围是0~255.
而我需要转换到IplImage的ImgData是char*型的,着还不是什么问题。
不知道怎么说了。我改过之后的源码贴下去吧。其中C_b,C_g,C_r我把他们改成了unsigned char型了。
	for(i=0;i<img->height;i++)
	{
		for(j=0;j<img->width;j++)
		{
			for(k=0;k<3;k++)
			{
//				if(img->imageData+(img->height-1-i)*img->widthStep+j*3+k>=0)
				c_t1[k]=((img->imageData + i*img->widthStep))[j*3+k];
//					c_t1[k]=*(img->imageData+(img->height-1-i)*img->widthStep+j*3+k);
//				else
//					c_t1[k]=*((img->imageData+(img->height-1-i)*img->widthStep+j*3+k))+256;
			}
			C_b=c_t1[0];
			C_g=c_t1[1];
			C_r=c_t1[2];
			Cb=(128-37.797*C_r/255-74.203*C_g/255+112*C_b/255);
			Cr=(128+112*C_r/255-93.786*C_g/255-18.214*C_b/255);
			double tt =(Cb-Cb_Mean)*((Cb-Cb_Mean)*Cov11-(Cr-Cr_Mean)*Cov10)+(Cr-Cr_Mean)*(-(Cb-Cb_Mean)*Cov01+(Cr-Cr_Mean)*Cov00);
			tt =(-0.5*tt)/(Cov00*Cov11-Cov01*Cov10);
			m_pSimArray[i][j]=exp(tt);
		}
	}


最后

以上就是飘逸未来为你收集整理的把ImageDib的unsigned char* m_pImgData转换为IplImage的char* imageData的全部内容,希望文章能够帮你解决把ImageDib的unsigned char* m_pImgData转换为IplImage的char* imageData所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部