⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imagemanager.cpp

📁 使用大恒采集卡的图像显示
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			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 + -