我是靠谱客的博主 飘逸未来,最近开发中收集的这篇文章主要介绍把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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复