OpenEdv-开源电子网

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

STM32F103ZET6+OV7670S实现简易的运动识别,但显示有问题【求助】

[复制链接]

4

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-12-12
在线时间
15 小时
发表于 2020-4-20 22:14:10 | 显示全部楼层 |阅读模式
1金钱
STM32F103ZET6+OV7670实现简易的运动识别,但显示有问题。
具体问题描述:使用的硬件是STM32F1精英版和配套的OV7670摄像头,代码基础是板子给的程序源码,加了图像二值化的代码。想通过计算两帧二值化图像里的值为0的像素点个数(ab1和ab2)之差,与设定的阈值做对比,大于阈值则说明有物体运动。但实际显示是只要屏幕上值为0的像素点数量大于阈值,就直接出提示”someone is here”,表示检测到运动了。就好像ab2的值一直为0一样。想看看ab1和ab2的值,显示的数值也是怪怪的,不知道是逻辑问题还是代码本身不能这么写,求大佬指点。程序和截图如下:#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"         
#include "string.h"
#include "ov7670.h"
#include "tpad.h"
#include "timer.h"
#include "exti.h"
#include "usmart.h"
#include "stdio.h"

extern u8 ov_sta;        
extern u8 ov_frame;        
u32 ab1=0;
u32 ab2=0;
u32 ab3=0;
char tmp1[10];
char tmp2[10];
void camera_refresh(void)
{
        u32 j;
        u16 color;         
        if(ov_sta)
        {
                LCD_Scan_Dir(U2D_L2R);               
                if(lcddev.id==0X1963)LCD_Set_Window((lcddev.width-240)/2,(lcddev.height-320)/2,240,320);
                else if(lcddev.id==0X5510||lcddev.id==0X5310)LCD_Set_Window((lcddev.width-320)/2,(lcddev.height-240)/2,320,240);
                LCD_WriteRAM_Prepare();           
                OV7670_RRST=0;                              
                OV7670_RCK_L;
                OV7670_RCK_H;
                OV7670_RCK_L;
                OV7670_RRST=1;                           
                OV7670_RCK_H;


                for(j=0;j<76800;j++)
                            {
                                    OV7670_RCK_L;
                                    color=GPIOC->IDR&0XFF;       
                                    OV7670_RCK_H;
                                    color<<=8;  
                                    OV7670_RCK_L;
                                    color|=GPIOC->IDR&0XFF;       
                                    OV7670_RCK_H;
                  if(color > 0x6000)
                     {
                       color = 0xffff;         
                     }
                  else
                     {
                       color = 0x0000;  
                       ab1++;                                                                                         
                     }      
                        LCD->LCD_RAM=color;   
                                                                }               
                                                                       
                ov_sta=0;                                 
                ov_frame++;
                LCD_Scan_Dir(DFT_SCAN_DIR);      
        }
}



int main(void)
{         
        u8 key;
        u8 lightmode=0,saturation=2,contrast=2;
        u8 effect=0;         
        u8 i=0;            

        delay_init();                             
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        uart_init(115200);            
        usmart_dev.init(72);                          
        LED_Init();                                         
        KEY_Init();                              
        LCD_Init();                                          
        TPAD_Init(6);                           
        POINT_COLOR=RED;                              
        LCD_ShowString(30,70,200,16,16,"OV7670 TEST");        
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/18");
        LCD_ShowString(30,130,200,16,16,"KEY0ight Mode");
        LCD_ShowString(30,150,200,16,16,"KEY1:Saturation");
        LCD_ShowString(30,170,200,16,16,"KEY_UP:Contrast");
        LCD_ShowString(30,190,200,16,16,"TPAD:Effects");         
        LCD_ShowString(30,210,200,16,16,"OV7670 Init...");         
        while(OV7670_Init())
        {
                LCD_ShowString(30,210,200,16,16,"OV7670 Error!!");
                delay_ms(200);
                LCD_Fill(30,210,239,246,WHITE);
                delay_ms(200);
        }
        LCD_ShowString(30,210,200,16,16,"OV7670 Init OK");
        delay_ms(1500);                    
        OV7670_Light_Mode(lightmode);
        OV7670_Color_Saturation(saturation);
        OV7670_Contrast(contrast);
        OV7670_Special_Effects(effect);         
        TIM6_Int_Init(10000,7199);                                                                                               
        EXTI8_Init();                                                
        OV7670_Window_Set(12,176,240,320);           
        OV7670_CS=0;                        
        LCD_Clear(BLACK);                                                         
         while(1)
        {      
                                                       
                key=KEY_Scan(0);  
                camera_refresh();
                if(ab1>ab2)
                {
                        ab3=ab1-ab2;
                }
                else
                {
                        ab3=ab2-ab1;
                }
                if(ab3>10000)
                {
                        LCD_ShowString(30,20,200,16,16,"someone is here");
                }
                sprintf(tmp1,"%u",ab1);
                 LCD_ShowString(30,60,200,16,16,tmp1);       
                sprintf(tmp2,"%u",ab2);
                LCD_ShowString(30,100,200,16,16,tmp2);
                                                               
                if(key==WKUP_PRES)
                {
                  delay_ms(10000);
                }
                  ab2=ab1;
                  ab1=0;
                                             
                i++;
                if(i==15)
                {
                        i=0;
                        LED0=!LED0;
                 }
        }           
}

IMG_20200420_215218_1.jpg

最佳答案

查看完整内容[请看2#楼]

那你就加标志位去判断运行 当一帧采集完成后再去运行while里边的逻辑判断
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14410
金钱
14410
注册时间
2018-8-3
在线时间
1156 小时
发表于 2020-4-20 22:14:11 | 显示全部楼层
Ken042 发表于 2020-4-21 15:34
谢谢,我找到问题所在了。刷新速度的问题,主函数while循环很快,但摄像头保存一帧数据没那么快。camera_ ...

那你就加标志位去判断运行 当一帧采集完成后再去运行while里边的逻辑判断
啊哈~加油!!
回复

使用道具 举报

4

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-12-12
在线时间
15 小时
 楼主| 发表于 2020-4-20 22:16:38 | 显示全部楼层
中间不小心打了个表情上去....
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14410
金钱
14410
注册时间
2018-8-3
在线时间
1156 小时
发表于 2020-4-21 15:11:11 | 显示全部楼层
建议你先搞个全部白色的图像 去读下你的ab1的像素点值 是不是对的   然后再去做逻辑比较 估计是你ab1的问题 仿真调试看看吧
回复

使用道具 举报

4

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-12-12
在线时间
15 小时
 楼主| 发表于 2020-4-21 15:34:43 | 显示全部楼层
翼行园子 发表于 2020-4-21 15:11
建议你先搞个全部白色的图像 去读下你的ab1的像素点值 是不是对的   然后再去做逻辑比较 估计是你ab1的问题 ...

谢谢,我找到问题所在了。刷新速度的问题,主函数while循环很快,但摄像头保存一帧数据没那么快。camera_refresh()函数里用的if(ov_sta),if检测不到就直接跳过了,但主函数里的一直在运行,所以大多数时间ab1和ab2都是0,这也是显示出的数据第一位一直是0的原因。
回复

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2021-2-1
在线时间
21 小时
发表于 2021-5-17 20:41:59 | 显示全部楼层
Ken042 发表于 2020-4-21 15:34
谢谢,我找到问题所在了。刷新速度的问题,主函数while循环很快,但摄像头保存一帧数据没那么快。camera_ ...

那后续怎么修改的呢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 18:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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