ov7725颜 {MOD}识别

2019-07-21 08:28发布

我利用数组储存的颜 {MOD}数据,数组里面的数值只有0和1。1就是我所需要的颜 {MOD},0则为不需要,我写了一个颜 {MOD}识别程序,返回值是红 {MOD}中点的横坐标,但是这个识别程序的返回值不受我控制,我测了一下,返回的数值好像是 44。以下是我的扫描程序和颜 {MOD}中心寻找程序,有大佬可以帮帮忙吗?


void camera_refresh3(void)
{
        COLOR_RGB  color_rgb;
        u16 i,j;
         u16 color;        
        unsigned char sum=0;        
        if(ov_sta==2)
        {
                 OV7725_CS=0;         
                 OV7725_RRST=0;                        
                OV7725_RCK_L;
                OV7725_RCK_H;
                OV7725_RCK_L;
                OV7725_RRST=1;                                 
                OV7725_RCK_H;  
                for(i=0;i<240;i++)
                {
                        for(j=0;j<320;j++)
                        {
//                                LEDL_H;
                                GPIOB->CRL=0X88888888;                  
                                OV7725_RCK_L;
                                color=GPIOC->IDR&0XFF;                //
                                OV7725_RCK_H;         
                                color<<=8;                                          
                                OV7725_RCK_L;
                                color|=GPIOC->IDR&0XFF;                //
                                OV7725_RCK_H;
                                GPIOB->CRL=0X33333333;
                                ex(color,&color_rgb);
                                sum++;
                                if(sum==4)
                                {
                                        sum=0;
                                        if((color_rgb.Red<=255)&(color_rgb.Red>240))xs[(j+1)/4]=1;
                                        else xs[(j+1)/4]=0;
                                }
                        }
                }
                 OV7725_CS=1;                                                         
                OV7725_RCK_L;
                OV7725_RCK_H;
                EXTI->PR=1<<15;                     
                ov_sta=0;                                       
        }

}         


extern unsigned char xs[80][240];
void ex(u16 color,COLOR_RGB* color_rgb)
{
        unsigned short rgb;
        color_rgb->Red                 = (unsigned char)( ( rgb & 0xF800 ) >> 8 )+0x07;
        color_rgb->Green  = (unsigned char)( ( rgb & 0x07E0 ) >> 3 )+0x03;
        color_rgb->Blue         = (unsigned char)( ( rgb & 0x001F ) << 3 )+0x07;        
}


int SeachCentre(const SEARCH_AREA *Area)
{
        unsigned int SpaceX,SpaceY,i,j,k,FailCount=0,spot1=0,spot2=0,l,r,centre_x;
                        SpaceX = 4;  
                        SpaceY = 12;  
                                for(i=Area->Y_Start;i<Area->Y_End;i+=SpaceY)
                                {
                                        for(j=Area->X_Start;j<Area->X_End;j+=SpaceX)
                                        {
//                                                LEDR_H;
                                                FailCount=0;
                                                for(k=0;k<SpaceX+SpaceY;k++)
                                                {
                                                        if(k<SpaceX)
                                                        {
                                                                if(xs[j+k][i+SpaceY/2]==0)
                                                                        FailCount++;
                                                        }
                                                        else if(k>SpaceX)
                                                        {
                                                                if(xs[j+SpaceX/2][i+(k-SpaceX)]==0)
                                                                        FailCount++;
                                                        }
                                                
                                                        if(FailCount>((SpaceX+SpaceY)>>ALLOW_FAIL_PER))
                                                                break;
                                                }
                                                // determining left,right and top endpoints
                                                if(spot1==0)//if spot1 is open, get left and top
                                                {
                                                        if(k==SpaceX+SpaceY)
                                                        {
                                                                l = j+SpaceX/2;
                                                                spot1=1;   //close spot1
                                                        }
                                                }
                                                else
                                                {
                                                        if((k!=SpaceX+SpaceY)&&(spot2==0))  //if spot1 is close while spot2 is open and k dosen't equal SpaceX+SpaceY,get right
                                                        {
                                                                r=j-SpaceX/2;
                                                                if((r-l)>=10)
                                                                {
                                                                        centre_x=(l+r)/2;
                                                                        spot2=1;//close spot2
                                                                        return centre_x;
                                                                }
                                                                else
                                                                {
                                                                        spot1=0;//open spot1
                                                                        l=0;//clear left
                                                                        r=0;//clear right
                                                                }
                                                        }
                                                }//if spot2 is close, this program will naver be start.
                                        }
                                }
                                return 0;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。