📄 imagemanager.cpp
字号:
for(i=0;i<W;i+=1)
{
ps=pOriginData+(H-1-j)*W+i;
pd=pBase+j*W*3+i*3;
*pd=*ps;
*(pd+1)=*ps;
*(pd+2)=*ps;
}
}
break;
case RGB8888:
for(j=0;j<H;j++)
{
for(i=0;i<W;i+=1)
{
ps=pOriginData+(H-1-j)*W*4+i*4;
pd=pBase+j*W*3+i*3;
*pd=*ps;
*(pd+1)=*(ps+1);
*(pd+2)=*(ps+2);
}
}
break;
case RGB555:
for(j=0;j<H;j++)
{
for(i=0;i<W;i+=1)
{
ps=pOriginData+(H-1-j)*W*2+i*2;
pd=pBase+j*W*3+i*3;
byteTemp=(*ps)&31;
*pd=byteTemp*8;
byteTemp=(*ps)>>5;
byteTemp=byteTemp&7;
byteTemp1=(*(ps+1))&3;
byteTemp1=byteTemp1<<2;
*(pd+1)=(byteTemp1+byteTemp)*8;
byteTemp=(*(ps+1))>>2;
byteTemp=byteTemp&31;
*(pd+2)=byteTemp*8;
}
}
break;
case RGB565:
for(j=0;j<H;j++)
{
for(i=0;i<W;i+=1)
{
ps=pOriginData+(H-1-j)*W*2+i*2;
pd=pBase+j*W*3+i*3;
byteTemp=(*ps)&31;
*pd=byteTemp*8;
byteTemp=(*ps)>>5;
byteTemp=byteTemp&7;
byteTemp1=(*(ps+1))&7;
byteTemp1=byteTemp1<<3;
*(pd+1)=(byteTemp1+byteTemp)*4;
byteTemp=(*(ps+1))>>3;
byteTemp=byteTemp&31;
*(pd+2)=byteTemp*8;
}
}
break;
case RGB888:
for(j=0;j<H;j++)
{
for(i=0;i<W;i+=1)
{
ps=pOriginData+(H-1-j)*W*3+i*3;
pd=pBase+j*W*3+i*3;
*pd=*ps;
*(pd+1)=*(ps+1);
*(pd+2)=*(ps+2);
}
}
break;
}
}
//************************************
void CImageManager::RobertOperator(BYTE *pSrc,BYTE *pDes, int w, int h)
{
BYTE *p;
BYTE *pp;
BYTE *pBegin;
BYTE *pEnd;
double Mid;
BYTE Pixels[4];
int i,j;
BYTE *buffer0;
BYTE *buffer1;
p=pSrc;
pp=pDes;
buffer0=new BYTE[w];
buffer1=new BYTE[w];
pBegin=pSrc;
pEnd=pSrc+w*h*3;
for(i=0;i<w;i++)
{
for(j=0;j<h;j++)
{
Mid=0;
p=pBegin+j*w*3+i*3;
pp=pDes+j*w*3+i*3;
Pixels[0]=(*p+*(p+1)+*(p+2))/3;
if((p-w*3)<pBegin)
Pixels[1]=0;
else
Pixels[1]=(*(p-w*3)+*(p-w*3+1)+*(p-w*3+2))/3;
if((p-w*3+3)<pBegin)
Pixels[2]=0;
else
Pixels[2]=(*(p-w*3+3)+*(p-w*3+4)+*(p-w*3+5))/3;
if((p+3)>pEnd)
Pixels[3]=0;
else
Pixels[3]=(*(p+3)+*(p+4)+*(p+5))/3;
Mid=(double)(Pixels[0]-Pixels[2])*(Pixels[0]-Pixels[2]);
Mid+=(double)((Pixels[1]-Pixels[3])*(Pixels[1]-Pixels[3]));
Mid=sqrt(Mid)*4;
if(Mid>255)
Mid=255;
if(pSrc==pDes)
{
if(j==0)
{
buffer0[i]=(BYTE)Mid;
}
else if(j==1)
{
buffer1[i]=(BYTE)Mid;
}
else
{
*(pp-w*3*2)=buffer0[i];
*(pp-w*3*2+1)=buffer0[i];
*(pp-w*3*2+2)=buffer0[i];
buffer0[i]=buffer1[i];
buffer1[i]=(BYTE)Mid;
}
}
else
*pp=*(pp+1)=*(pp+2)=(BYTE)Mid;
}
}
if(pSrc==pDes)
{
for(i=0;i<w;i++)
{
pp=pDes+w*3*(h-1)+i*3;
*(pp-w*3)=buffer0[i];
*(pp-w*3+1)=buffer0[i];
*(pp-w*3+2)=buffer0[i];
*pp=buffer1[i];
*(pp+1)=buffer1[i];
*(pp+2)=buffer1[i];
}
}
delete[] buffer0;
delete[] buffer1;
}
void CImageManager::Binary(BYTE *pData, int nThreshod,int w,int h)
{
BYTE *p;
p=pData;
for(int i=0;i<w;i++)
{
for(int j=0;j<h;j++)
{
p=pData+j*w*3+i*3;
if(*p>nThreshod)
*p=*(p+1)=*(p+2)=255;
else
*p=*(p+1)=*(p+2)=0;
}
}
}
void CImageManager::FindLine(BYTE *pData, int w, int h)
{
BYTE *p,*pp;
POINT nP[16][247];
int nNum[16];
int nBegin,nLast;
for(int j=0;j<16;j++)
nNum[j]=0;
for(j=1;j<16;j++)
{
nBegin=0;
nLast=0;
int nCount=0;
for(int i=0;i<320;i++)
{
p=pData+j*16*w*3+i*3;
if(*p==255)
{
nBegin=nLast=i;
for(int m=1;m<247-i;m++)
{
pp=p+m*3;
if(*pp==255)
{
nCount=0;
if(m<10)
{
nLast=i+m;
}
else
{
nBegin=0;
nLast=0;
i=i+m;
break;
}
}
else
{
nCount++;
if(nCount>8)
{
if(nLast>nBegin)
{
nP[j][nNum[j]].x=(nBegin+nLast)/2;
nP[j][nNum[j]].y=j*16;
nNum[j]++;
}
nBegin=0;
nLast=0;
i=i+m;
break;
}
}
}
}
}
}
CArray <double,double> Theta;
CArray <double,double> a;
CArray <int,int> nLineDot;
int nLineCount;
double temp1,temp2,temp3,temp4;
int nTemp;
bool bExsited;
Theta.SetSize(0);
a.SetSize(0);
nLineDot.SetSize(0);
nLineCount=0;
for(j=0;j<16;j++)
{
for(int i=j+1;i<16;i++)
{
for(int m=0;m<nNum[j];m++)
{
for(int n=0;n<nNum[i];n++)
{
if(nP[j][m].x==nP[i][n].x)
{
temp2=90;
}
else
{
temp1=((double)(nP[j][m].y-nP[i][n].y))/((double)(nP[j][m].x-nP[i][n].x));
temp2=180.00*atan(temp1)/3.14159;
}
if(temp2==90.00)
temp3=(double)nP[j][m].x;
else
{
temp3=(double)nP[j][m].x-(double)nP[j][m].y/tan(3.14159*temp2/180.00);
}
bExsited=false;
for(int t=0;t<nLineCount;t++)
{
temp1=Theta.GetAt(t);
nTemp=nLineDot.GetAt(t);
temp4=a.GetAt(t);
if((fabs(temp1-temp2)<6.0)&&(fabs(temp3-temp4)<10.0))
{
bExsited=true;
temp1=(((double)nTemp)*temp1+temp2)/((double)(nTemp+1));
Theta.RemoveAt(t);
Theta.InsertAt(t,temp1);
temp4=(((double)nTemp)*temp4+temp3)/((double)(nTemp+1));
a.RemoveAt(t);
a.InsertAt(t,temp4);
nLineDot.RemoveAt(t);
nLineDot.InsertAt(t,nTemp+1);
break;
}
}
if(!bExsited)
{
nLineCount++;
Theta.Add(temp2);
a.Add(temp3);
nLineDot.Add(1);
}
}
}
}
}
int nMax,nIndex;
nMax=0;
for(j=0;j<nLineCount;j++)
{
nTemp=nLineDot.GetAt(j);
if(nMax<nTemp)
{
nMax=nTemp;
nIndex=j;
}
}
int x1,y1;
double phei;
if(nMax!=0)
{
temp1=Theta.GetAt(nIndex);
temp2=a.GetAt(nIndex);
if(temp1==90)
{
x1=(int)temp2;
y1=120;
temp1=3.14159*temp1/180.00;
}
else
{
temp1=3.14159*temp1/180.00;
x1=(int)(temp2+120.00/tan(temp1));
}
if(x1==160)
{
phei=90;
}
else
{
phei=atan(120.00/((double)(x1-160)));
phei=phei*180.00/3.14159;
if(phei<0)
phei=phei+180;
}
g_phei=(short)((90-phei)*2.0/3.0);
g_v=25;
for(int i=0;i<240;i++)
{
nTemp=(int)(temp2+((double)i)/tan(temp1));
i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -