OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8956|回复: 8

ov7725颜色识别

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-9-26
在线时间
3 小时
发表于 2018-10-23 17:36:40 | 显示全部楼层 |阅读模式
5金钱
我利用数组储存的颜色数据,数组里面的数值只有0和1。1就是我所需要的颜色,0则为不需要,我写了一个颜色识别程序,返回值是红色中点的横坐标,但是这个识别程序的返回值不受我控制,我测了一下,返回的数值好像是 44。以下是我的扫描程序和颜色中心寻找程序,有大佬可以帮帮忙吗?


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;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2018-10-24 02:26:09 | 显示全部楼层
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2018-10-31
在线时间
1 小时
发表于 2018-10-31 22:09:34 | 显示全部楼层
楼主要帮忙做啥呢?
回复

使用道具 举报

0

主题

12

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2019-7-23
在线时间
2 小时
发表于 2019-8-3 15:02:15 | 显示全部楼层
关注++
回复

使用道具 举报

2

主题

24

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2019-7-26
在线时间
22 小时
发表于 2019-8-4 08:24:04 | 显示全部楼层
遇见过同样的问题
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2021-7-9
在线时间
17 小时
发表于 2021-7-29 09:43:08 | 显示全部楼层
这是开发板发f1的吗,我想借鉴一下
回复

使用道具 举报

3

主题

177

帖子

0

精华

高级会员

Rank: 4

积分
774
金钱
774
注册时间
2019-11-27
在线时间
87 小时
发表于 2021-7-30 09:03:43 | 显示全部楼层
用HSL判断会好一点吧
个人CSDN 首页https://blog.csdn.net/qq_41930631
回复

使用道具 举报

2

主题

47

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2022-4-23
在线时间
7 小时
发表于 2022-4-23 10:36:14 | 显示全部楼层
en yousixiang
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2025-1-28
在线时间
1 小时
发表于 前天 16:48 | 显示全部楼层
请问为什么烧录后会白屏呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-22 02:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表