把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
- 把ImageDib的unsigned char* m_pImgData转换为IplImage的char* imageData
- 关于OpenCV中IplImage的char类型的ImageData需要进行强制类型转换为uchar的说明
- QString unsigned char* 的转换
- unsigned char 转换为 unsigned long方法
- char, signed char, unsigned char的区别
- char、signed char、unsigned char的区别
- 补码和数的转换(unsigned/char|int)
- array<Byte>^ unsigned char* char* 之间的转换
- C语言unsigned char、char与int之间的转换
- unsigned char 的值
- unsigned char 的使用
- 把string转换为char* 的三种方法
- char*->IplImage、char*->Mat转换
- 将char转换为unsigned int时
- unsigned char与char 转换
- char,unsigned char,unsigned short,有符号和无符号之间的转换
- 把int转换为char把int转换为char
- unsigned char与char的区别
- 如何开启重装系统模式
- java中 redirect 和 froward 区别
- UIDatePicker 显示时间和打印时间不一样
- android生成二维码的封装包
- 动态申请二维数组(一)
- 把ImageDib的unsigned char* m_pImgData转换为IplImage的char* imageData
- 可以横向滑动竖向滑动的listview
- LeetCode:Merge Sorted Array
- HDOJ 4608 I-number
- C/C++ 在控制台下显示进度
- WAP网页 浏览器 拨打电话 发送短信 保存联系人
- HDU 4515 小Q系列故事——世界上最遥远的距离(模拟题)
- IIS附加进程方法
- 一摞烙饼的排序----《编程之美》读书笔记