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

📄 objectrecognition-final.c

📁 TI达芬奇开发平台下的目标识别程序主要匹配准则为力矩直方图和人的肤色等
💻 C
📖 第 1 页 / 共 3 页
字号:
	for( i=0; i<256; i++ )
	{
              tempDot += (*(Crzft+i))* (*(Crzftt3+i));
		tempSrc += (*(Crzft+i))* (*(Crzft+i));
		tempObj += (*(Crzftt3+i))* (*(Crzftt3+i));
	}
	Crzftsim3= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );
	tempDot = 0, tempSrc = 0, tempObj = 0;
	for( i=0; i<256; i++ )
	{
              tempDot += (*(Crzft+i))* (*(Crzftt4+i));
		tempSrc += (*(Crzft+i))* (*(Crzft+i));
		tempObj += (*(Crzftt4+i))* (*(Crzftt4+i));
	}
	Crzftsim4= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );



		*ckb=(float)dx/dy>1?(float)dx/dy:(float)dy/dx;//compute length/width ratio
		 memset(imY,0,7*sizeof(float));
			
		IM(SubIY,dx,dy,imY);  //compute IM of object
			  
		for(i=0;i<7;i++)inIM[i]=*(imY+i);

		//compute lenth/width ratio distances
		ckbdis1=(*ckb-*ckbt1)>0?((*ckb-*ckbt1)/(*ckb)):((*ckbt1-*ckb)/(*ckbt1));
		
		ckbdis2=(*ckb-*ckbt2)>0?((*ckb-*ckbt2)/(*ckb)):((*ckbt2-*ckb)/(*ckbt2));
		
		ckbdis3=(*ckb-*ckbt3)>0?((*ckb-*ckbt3)/(*ckb)):((*ckbt3-*ckb)/(*ckbt3));
		
		ckbdis4=(*ckb-*ckbt4)>0?((*ckb-*ckbt4)/(*ckb)):((*ckbt4-*ckb)/(*ckbt4));
             
        	ckbdis[0]=ckbdis1; 
		ckbdis[1]=ckbdis2;
		ckbdis[2]=ckbdis3;
		ckbdis[3]=ckbdis4;
	

		//sort ckbdis, first is smallest 
		for(i=0;i<4;i++)
		{
			for(j=i+1;j<4;j++)
			{
				if(ckbdis[i]>ckbdis[j])
				{
					ckbtemp=ckbdis[i];
					ckbdis[i]=ckbdis[j];
					ckbdis[j]=ckbtemp;
				}
            		}
		}
				  
				  //compute IM distances
				  Dis1=Distance(imY,imt1);
				  Dis2=Distance(imY,imt2);
				  Dis3=Distance(imY,imt3);
				  Dis4=Distance(imY,imt4);



					   if((ckbdis[0]==ckbdis1&&ckbdis[1]==ckbdis2)||(ckbdis[0]==ckbdis2&&ckbdis[1]==ckbdis1))//l/w is close to 1 and 2
					  {
					 			inIM[6]=1;
								inIM[7]=2;

																
								inIM[14]=(float)Crzftsim1;//YCCmostdis1;
								inIM[15]=(float)Crzftsim2;//YCCmostdis2;	

								inIM[16]=(float)Cbzftsim1;//YCCmostdis1;
								inIM[17]=(float)Cbzftsim2;//YCCmostdis2;	

					
								inIM[19]=ckbdis1;
								inIM[20]=ckbdis2;

								inIM[21]=Dis1;//inIM[23]=avgdis1;
								inIM[22]=Dis2;//inIM[24]=avgdis2;

								inIM[23]=(float)Yzftsim1;//YCCmostdis1;
								inIM[24]=(float)Yzftsim2;//YCCmostdis2;
	
								if(fabs(Cbzftsim1-Cbzftsim2)>0.12&&fabs(Crzftsim1-Crzftsim2)>0.12&&fabs(Yzftsim1-Yzftsim2)>0.12&&fabs(Dis1-Dis2)>0.2)
								{
									if(Yzftsim1>0.15&&Cbzftsim1>0.15&&Crzftsim1>0.15&&Yzftsim1>Yzftsim2&&Cbzftsim1>Cbzftsim2&&Crzftsim1>Crzftsim2&&Dis1<Dis2&&Dis1<0.86)
									Obj=1;
									else if(Yzftsim2>0.15&&Cbzftsim2>0.15&&Crzftsim2>0.15&&Yzftsim1<Yzftsim2&&Cbzftsim1<Cbzftsim2&&Crzftsim1<Crzftsim2&&Dis2<Dis1&&Dis2<0.86)
									Obj=2;
								}
	
					}

					else if((ckbdis[0]==ckbdis1&&ckbdis[1]==ckbdis3)||(ckbdis[0]==ckbdis3&&ckbdis[1]==ckbdis1))//l/w is close to 1 and 3
					{
															inIM[6]=1;
								inIM[7]=3;

								
																
								inIM[14]=(float)Crzftsim1;//YCCmostdis1;
								inIM[15]=(float)Crzftsim3;//YCCmostdis2;	

								inIM[16]=(float)Cbzftsim1;//YCCmostdis1;
								inIM[17]=(float)Cbzftsim3;//YCCmostdis2;	

								inIM[18]=fabs(ckbdis1-ckbdis3)/(ckbdis1+ckbdis3);
								inIM[19]=ckbdis1;
								inIM[20]=ckbdis3;

								inIM[21]=Dis1;//inIM[23]=avgdis1;
								inIM[22]=Dis3;//inIM[24]=avgdis2;

								inIM[23]=(float)Yzftsim1;//YCCmostdis1;
								inIM[24]=(float)Yzftsim3;//YCCmostdis2;
								
														if(fabs(Cbzftsim1-Cbzftsim3)>0.12&&fabs(Crzftsim1-Crzftsim3)>0.12&&fabs(Yzftsim1-Yzftsim3)>0.12&&fabs(Dis1-Dis3)>0.2)
								{					
									if(Yzftsim1>0.15&&Cbzftsim1>0.15&&Crzftsim1>0.15&&Yzftsim1>Yzftsim3&&Cbzftsim1>Cbzftsim3&&Crzftsim1>Crzftsim3&&Dis1<Dis3&&Dis1<0.86)
									Obj=1;
									else if(Yzftsim3>0.15&&Cbzftsim3>0.15&&Crzftsim3>0.15&&Yzftsim1<Yzftsim3&&Cbzftsim1<Cbzftsim3&&Crzftsim1<Crzftsim3&&Dis3<Dis1&&Dis3<0.86)
									Obj=3;
								}
			  
					}
					else if((ckbdis[0]==ckbdis1&&ckbdis[1]==ckbdis4)||(ckbdis[0]==ckbdis4&&ckbdis[1]==ckbdis1))//l/w is close to 1 and 4
					{
								inIM[6]=1;
								inIM[7]=4;

						
								inIM[14]=(float)Crzftsim1;//YCCmostdis1;
								inIM[15]=(float)Crzftsim4;//YCCmostdis2;	

								inIM[16]=(float)Cbzftsim1;//YCCmostdis1;
								inIM[17]=(float)Cbzftsim4;//YCCmostdis2;	

					
								inIM[19]=ckbdis1;
								inIM[20]=ckbdis4;

								inIM[21]=Dis1;//inIM[23]=avgdis1;
								inIM[22]=Dis4;//inIM[24]=avgdis2;

								inIM[23]=(float)Yzftsim1;//YCCmostdis1;
								inIM[24]=(float)Yzftsim4;//YCCmostdis2;
													if(fabs(Cbzftsim1-Cbzftsim4)>0.12&&fabs(Crzftsim1-Crzftsim4)>0.12&&fabs(Yzftsim1-Yzftsim4)>0.12&&fabs(Dis1-Dis4)>0.2)
								{					
									if(Yzftsim1>0.15&&Cbzftsim1>0.15&&Crzftsim1>0.15&&Yzftsim1>Yzftsim4&&Cbzftsim1>Cbzftsim4&&Crzftsim1>Crzftsim4&&Dis1<Dis4&&Dis1<0.86)
									Obj=1;
									else if(Yzftsim4>0.15&&Cbzftsim4>0.15&&Crzftsim4>0.15&&Yzftsim1<Yzftsim4&&Cbzftsim1<Cbzftsim4&&Crzftsim1<Crzftsim4&&Dis4<Dis1&&Dis4<0.86)
									Obj=4; 	
								}
		
					}	


					else if((ckbdis[0]==ckbdis2&&ckbdis[1]==ckbdis3)||(ckbdis[0]==ckbdis3&&ckbdis[1]==ckbdis2))//l/w is close to 2 and 3
					{
								inIM[6]=2;
								inIM[7]=3;

								
																
								inIM[14]=(float)Crzftsim2;//YCCmostdis1;
								inIM[15]=(float)Crzftsim3;//YCCmostdis2;	

								inIM[16]=(float)Cbzftsim2;//YCCmostdis1;
								inIM[17]=(float)Cbzftsim3;//YCCmostdis2;	

					
								inIM[19]=ckbdis2;
								inIM[20]=ckbdis3;

								inIM[21]=Dis2;//inIM[23]=avgdis1;
								inIM[22]=Dis3;//inIM[24]=avgdis2;

								inIM[23]=(float)Yzftsim2;//YCCmostdis1;
								inIM[24]=(float)Yzftsim3;//YCCmostdis2;
								
								if(fabs(Cbzftsim2-Cbzftsim3)>0.12&&fabs(Crzftsim2-Crzftsim3)>0.12&&fabs(Yzftsim2-Yzftsim3)>0.12&&fabs(Dis2-Dis3)>0.2)
								{
									if(Yzftsim2>0.15&&Cbzftsim2>0.15&&Crzftsim2>0.15&&Yzftsim2>Yzftsim3&&Cbzftsim2>Cbzftsim3&&Crzftsim2>Crzftsim3&&Dis2<Dis3&&Dis2<0.86)
									Obj=2;
									else if(Yzftsim3>0.15&&Cbzftsim3>0.15&&Crzftsim3>0.15&&Yzftsim2<Yzftsim3&&Cbzftsim2<Cbzftsim3&&Crzftsim2<Crzftsim3&&Dis3<Dis2&&Dis3<0.86)
									Obj=3;
								}
				
					}	
					else if((ckbdis[0]==ckbdis2&&ckbdis[1]==ckbdis4)||(ckbdis[0]==ckbdis4&&ckbdis[1]==ckbdis2))//l/w is close to 2 and 4
					{
								
								inIM[6]=2;
								inIM[7]=4;

								
								
								inIM[14]=(float)Crzftsim2;//YCCmostdis1;
								inIM[15]=(float)Crzftsim4;//YCCmostdis2;	

								inIM[16]=(float)Cbzftsim2;//YCCmostdis1;
								inIM[17]=(float)Cbzftsim4;//YCCmostdis2;	

				
								inIM[19]=ckbdis2;
								inIM[20]=ckbdis4;

								inIM[21]=Dis2;//inIM[23]=avgdis1;
								inIM[22]=Dis4;//inIM[24]=avgdis2;

								inIM[23]=(float)Yzftsim2;//YCCmostdis1;
								inIM[24]=(float)Yzftsim4;//YCCmostdis2;
				
								if(fabs(Cbzftsim2-Cbzftsim4)>0.12&&fabs(Crzftsim2-Crzftsim4)>0.12&&fabs(Yzftsim2-Yzftsim4)>0.12&&fabs(Dis2-Dis4)>0.2)
								{
									if(Yzftsim2>0.15&&Cbzftsim2>0.15&&Crzftsim2>0.15&&Yzftsim2>Yzftsim4&&Cbzftsim2>Cbzftsim4&&Crzftsim2>Crzftsim4&&Dis2<Dis4&&Dis2<0.86)
									Obj=2;
									else if(Yzftsim4>0.15&&Cbzftsim4>0.15&&Crzftsim4>0.15&&Yzftsim2<Yzftsim4&&Cbzftsim2<Cbzftsim4&&Crzftsim2<Crzftsim4&&Dis4<Dis2&&Dis4<0.86)
									Obj=4;
								}
 		
					}	

					else if((ckbdis[0]==ckbdis4&&ckbdis[1]==ckbdis3)||(ckbdis[0]==ckbdis3&&ckbdis[1]==ckbdis4))//l/w is close to 3 and 4
					{
								inIM[6]=3;
								inIM[7]=4;

								
								inIM[14]=(float)Crzftsim3;//YCCmostdis1;
								inIM[15]=(float)Crzftsim4;//YCCmostdis2;	

								inIM[16]=(float)Cbzftsim3;//YCCmostdis1;
								inIM[17]=(float)Cbzftsim4;//YCCmostdis2;	

					
								inIM[19]=ckbdis3;
								inIM[20]=ckbdis4;

								inIM[21]=Dis3;//inIM[23]=avgdis1;
								inIM[22]=Dis4;//inIM[24]=avgdis2;

								inIM[23]=(float)Yzftsim3;//YCCmostdis1;
								inIM[24]=(float)Yzftsim4;//YCCmostdis2;

								if(fabs(Cbzftsim3-Cbzftsim4)>0.12&&fabs(Crzftsim3-Crzftsim4)>0.12&&fabs(Yzftsim3-Yzftsim4)>0.12&&fabs(Dis3-Dis4)>0.2)
								{
									if(Yzftsim3>0.15&&Cbzftsim3>0.15&&Crzftsim3>0.15&&Yzftsim3>Yzftsim4&&Cbzftsim3>Cbzftsim4&&Crzftsim3>Crzftsim4&&Dis3<Dis4&&Dis3<0.86)
									Obj=3;
									else if(Yzftsim4>0.15&&Cbzftsim4>0.15&&Crzftsim4>0.15&&Yzftsim3<Yzftsim4&&Cbzftsim3<Cbzftsim4&&Crzftsim3<Crzftsim4&&Dis4<Dis3&&Dis4<0.86)
									Obj=4;
			
								}						
					}	


		inIM[2]=Objt;

		if(Objt==Obj&&Obj>0)//update background when object  doesn't move for longtime
		{
		temp1=0;
		temp3=0;
		temp4=0;
		temp5=0;
		temp2+=1;
		inIM[1]=temp2;
		if(  temp2==60)
		{
			temp2=0;
			temp4=0;
			
			for(i =0; i< COLS*ROWS; i++)
				*(BImageY+i)=1* (*(frameY+i))+ 0* (*(PBImageY+i));
			
			for(i =0; i< (COLS*ROWS>>1); i++)
			{
			  *(BImageCb+i)=1* (*(frameCb+i))+0 * (*(PBImageCb+i));
			  *(BImageCr+i)=1* (*(frameCr+i))+ 0 * (*(PBImageCr+i));
			}
			
		}
		}
		else//update background when unknown object  doesn't move for longtime
		{
		temp1=0;
		temp2=0;
		temp3=0;
		temp5=0;
		temp4+=1;
		if(  temp4==60)
		{
			temp4=0;
			
			for(i =0; i< COLS*ROWS; i++)
				*(BImageY+i)=1* (*(frameY+i))+ 0* (*(PBImageY+i));
			
			for(i =0; i< (COLS*ROWS>>1); i++)
			{
			  *(BImageCb+i)=1* (*(frameCb+i))+0 * (*(PBImageCb+i));
			  *(BImageCr+i)=1* (*(frameCr+i))+ 0 * (*(PBImageCr+i));
			}
			
		}
		}

		temp1=0;
		
		temp3=0;
		
		temp5=0;
		Objt=Obj;
		*kind=Obj;
		inIM[6]=temp4;

		}

		}
		
		}
		
	}	

}	
/********************************************************************
jpeg compress
jpegRGB:ÊÇ´«ËͽøÀ´µÄ»º³åÇø£¬µÈÍê³ÉYUV->RGBת»»²¢ÇÒ
Íê³É²åÖµºó£¬°ÑÊý¾Ý´æÈë¸Ã»º³åÇø
********************************************************************/
 int  jpegCompressDSP(unsigned char *jpegp,unsigned char *jpegRGB, int imagesize, int quality)
 {
 	int width;
	int height;
      //YUV to RGB first
      unsigned char yuv_y0, yuv_u0, yuv_v0; // yuv_v1;  // {y0, u0, v0, v1};
      unsigned char r, g, b;
	
	//char *rgbjpeg;//Bilinear   Interpolation buffer
	unsigned char bufRGB[3];  // ÁÙʱ±£´æ{R,G,B}
	unsigned char bufYUV[3];  // ÁÙʱ±£´æ{Y,U,V}
	int i,j;	
	r=0;
	g=0;
	b=0;
	memset(bufRGB,0, sizeof(unsigned char)*3); 
	memset(bufYUV,0, sizeof(unsigned char)*3); 
	memset(rgbbuf,0,sizeof(unsigned char)*D1_WIDTH*D1_HEIGHT*3);
	width=D1_WIDTH;
	height=D1_HEIGHT;
	for (  i = height-1; i>=0; i--) {
		for (  j = 0; j<width; j++) {
			//if(!(i%2)==0) 
			{
				// UYVY±ê×¼  [U0 Y0 V0 Y1] [U1 Y2 V1 Y3] [U2 Y4 V2 Y5]
				// ÿÏñËØµãÁ½¸ö×Ö½Ú£¬[ÄÚ]ΪËĸö×Ö½Ú 
				if ((j%2)==0) 
				{
					yuv_u0 = *jpegp;  
					jpegp++;
				} 
				else
				{
					yuv_v0 = *jpegp;  
					jpegp++;
				}
				yuv_y0 = *jpegp;      
				jpegp++;

				bufYUV[0] = yuv_y0;  //Y
				bufYUV[1] = yuv_u0;  // U
				bufYUV[2] = yuv_v0;  // V

				// RGBת»»ÎªYUV
				YUV2RGB(bufRGB,bufYUV);
				r = bufRGB[0];   // y
				g = bufRGB[1];   // u
				b = bufRGB[2];   // v
				if (r>255) r=(unsigned char)255; 
				if (r<0) r=0;
				if (g>255) g=(unsigned char)255;
				if (g<0) g=0;
				if (b>255) b=(unsigned char)255;
				if (b<0) b=0;
				*(rgbbuf+(height-1-i)*width*3+j*3)=r;
				*(rgbbuf+(height-1-i)*width*3+j*3+1)=g;
				*(rgbbuf+(height-1-i)*width*3+j*3+2)=b;
				}
			}
		}   
	switch(imagesize){
		case D1:					
			width=720;
			height=576;			
			Interpolation(rgbbuf,jpegRGB,D1,width,height,quality);				
			break;
		case VGA:			
			width=640;
			height=480;			
			Interpolation(rgbbuf,jpegRGB,VGA,width,height,quality);		
			break;
		case CIF:				
			width=352;
			height=288;		
			Interpolation(rgbbuf,jpegRGB,CIF,width,height,quality);			
			break;
		} 	
	return SUCCESS;
 }
/********************************************************************
 Bilinear   Interpolation   Algorithm 
********************************************************************/
int Interpolation(unsigned char *pbufin, unsigned char *pbufout, int imagesize, int newwidth, int newheight,int quality)
{
	float xFactor = (float) (D1_WIDTH) / newwidth;
	float yFactor = (float) (D1_HEIGHT) / newheight;
	int x;
	int y;
	int	ox, oy;
	unsigned char *	p;
	float	      fox, foy, dx1, dy1, dx2, dy2;
	int		ox1, oy1, ox2, oy2;
	int		ymax = D1_HEIGHT- 1;
	int		xmax = D1_WIDTH - 1;
	unsigned char	       v1, v2;
	unsigned char *tp1, *tp2;
	unsigned char *p1, *p2, *p3, *p4;
	float	       dx, dy, k1, k2;
	float	r, g, b;
	int i,m,n;
	
	switch(quality){
		case LOWER:		
			// for each line
			for ( y = 0; y < newheight; y++)
			{
				// Y coordinate of the nearest point
				oy = (int) (y * yFactor);

				// for each pixel
				for ( x = 0; x < newwidth; x++)
				{
					// X coordinate of the nearest point
					ox = (int) (x * xFactor);

					p = pbufin + oy * D1_WIDTH*3 + ox*3;

					*(pbufout+y * newwidth*3+x*3)=*p;
					*(pbufout+y * newwidth*3+x*3+1)=*(p+1);
					*(pbufout+y * newwidth*3+x*3+2)=*(p+2);
				}				
			}
			break;
		case MIDDLE:			
			
			// for each line
			for (y = 0; y < newheight; y++)
			{
				// Y coordinates
				foy	= (float) y * yFactor;
				oy1	= (int) foy;
				oy2	= (oy1 == ymax) ? oy1 : oy1 + 1;
				dy1	= foy - (float) oy1;
				dy2 = 1.0f - dy1;

				// get temp pointers
				tp1 = pbufin + oy1 * D1_WIDTH*3;
				tp2 = pbufin + oy2 * D1_WIDTH*3;

				// for each pixel
				for ( x = 0; x < newwidth; x++)
				{
					// X coordinates
					fox	= (float) x * xFactor;
					ox1	= (int) fox;
					ox2	= (ox1 == xmax) ? ox1 : ox1 + 1;
					dx1	= fox - (float) ox1;
					dx2	= 1.0f - dx1;

					// get four points
					p1 = tp1 + ox1 * 3;
					p2 = tp1 + ox2 * 3;
					p3 = tp2 + ox1 * 3;
					p4 = tp2 + ox2 * 3;

					// interpolate using 4 points
					for ( i = 0; i < 3; i++, pbufout++, p1++, p2++, p3++, p4++)
					{
						v1 = (char)(dx2 * (*p1) + dx1 * (*p2));
						v2 = (char)(dx2 * (*p3) + dx1 * (*p4));
						*pbufout = (char)(dy2 * v1 + dy1 * v2);
					}
				}							
			}			
			break;		
		case HIGH:			
			
			// RGB
			for ( y = 0; y < newheight; y++)
			{
				// Y coordinates
				foy	= (float) y * yFactor - 0.5f;
				oy1	= (int) foy;
				dy	= foy - (float) oy1;

				for ( x = 0; x < newwidth; x++, pbufout += 3)
				{
					// X coordinates
					fox	= (float) x * xFactor - 0.5f;
					ox1	= (int) fox;
					dx	= fox - (float) ox1;
					r = g = b = 0;
					for ( n = -1; n < 3; n++) 
					{
						k1 = BiCubicKernel(dy - (float) n);

					 	oy2 = oy1 + n;
						if (oy2 < 0)
							oy2 = 0;
						if (oy2 > ymax)
							oy2 = ymax;

						for ( m = -1; m < 3; m++) 
						{
							k2 = k1 * BiCubicKernel((float) m - dx);

							ox2 = ox1 + m;
							if (ox2 < 0)
								ox2 = 0;
							if (ox2 > xmax)
								ox2 = xmax;

							// get pixel of original image
							p = pbufin + oy2 * D1_WIDTH*3+ ox2 * 3;

							r += k2 * (*p);
							g += k2 * (*(p+1));
							b += k2 * (*(p+2));
						}
					}
					
					*(pbufout)= (char) r;
					*(pbufout+1) = (char) g;
					*(pbufout+2)= (char) b;
				}					
			}
			break;			
		}	
	return SUCCESS;
}
/********************************************************************
 BiCubicKernel
********************************************************************/
float BiCubicKernel(float x)
{
	float	a, b, c, d;
	float xm1,xp1,xp2;
	if (x > 2.0f)
		return 0.0f;	
	xm1 = x - 1.0f;
	xp1 = x + 1.0f;
	xp2 = x + 2.0f;

	a = (xp2 <= 0.0f) ? 0.0f : xp2 * xp2 * xp2;
	b = (xp1 <= 0.0f) ? 0.0f : xp1 * xp1 * xp1;
	c = (x   <= 0.0f) ? 0.0f : x * x * x;
	d = (xm1 <= 0.0f) ? 0.0f : xm1 * xm1 * xm1;
	return (0.16666666666666666667f * (a - (4.0f * b) + (6.0f * c) - (4.0f * d)));
}
/********************************************************************
 YUV to RGB
********************************************************************/
 int YUV2RGB(unsigned char *pRGB, unsigned char *pYUV)
 {
 	unsigned char y, u, v;
	y = *pYUV; pYUV++;
	u = *pYUV; pYUV++;
	v = *pYUV; 

	*pRGB = (unsigned char)(1.0*y + 8 + 1.402*(v-128));    pRGB++;                 // r
	*pRGB = (unsigned char)(1.0*y - 0.34413*(u-128) - 0.71414*(v-128));  pRGB++;   // g
	*pRGB = (unsigned char)(1.0*y + 1.772*(u-128) + 0);                            // b
	return SUCCESS;

 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -