把ImageDib的unsigned char* m_pImgData转换为IplImage的char* imageData

来源:互联网 发布:gson对复杂的json解析 编辑:程序博客网 时间:2024/05/18 00:39

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

我原本想把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);}}


0 0
原创粉丝点击