OpenEdv-开源电子网

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

OV7670的图像处理

[复制链接]

4

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-7-21
在线时间
10 小时
发表于 2014-7-21 21:03:42 | 显示全部楼层 |阅读模式
5金钱
OV7670摄像头读取之后怎么把图像处理然后送到串口上,哪位大神!求助,求助......................

最佳答案

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

printf是最简单的方式。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-21 21:03:43 | 显示全部楼层
printf是最简单的方式。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-7-21
在线时间
10 小时
 楼主| 发表于 2014-7-22 08:10:26 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,你看一下下面的程序,这也是专区的人写的图像这一块的,可是没注释,我看不懂,如果你看得懂,你帮我看看:
#include <stm32f10x.h>
#include <stdio.h>
#include <usart.h>
#include <Nvic_Exit.h>
#include <delay.h>
#include <tft.h>
#include <ov7670.h>
#include <I2C.h>
#include "Image.h"
#include "include.h"
 
 u8 Get_a_Y()
 {
 u8 t1,t2;
            //????????Y·?????????

FIFO_RCK=0;
FIFO_RCK=1;  
t1=(0x00ff&GPIOB->IDR);  
FIFO_RCK=0;
FIFO_RCK=1;
t2=(0x00ff&GPIOB->IDR);


//????????????
    FIFO_RCK=0;
FIFO_RCK=1;  
t2=(0x00ff&GPIOB->IDR);  
FIFO_RCK=0;
FIFO_RCK=1;
t2=(0x00ff&GPIOB->IDR);

  return t1;
    
 }

 void skip_a_row()
 {
     u16 i;
 u8 temp;
for (i=0;i<320;i++)
{
//????????????
          FIFO_RCK=0;
FIFO_RCK=1;  
temp=(0x00ff&GPIOB->IDR);  
FIFO_RCK=0;
FIFO_RCK=1;
temp=(0x00ff&GPIOB->IDR);

}
 }

 void Get_a_Image()

 {
   u16 i,j;
   for (i=0;i<R;i++)
   {
    for(j=0;j<C;j++)
{
         // data[j]= Get_a_Y();

}

   //????????×???5??
skip_a_row();
skip_a_row();
skip_a_row();
    skip_a_row();
    skip_a_row();


 }

 u8 Abs8(u8 a)
{
  if (a>=0)
  {
    return a;
  }
  else
  {
    return -a;

  }
}
void send_pic(void)
{
       u8 i,j;
        USART_SendData(USART1,0xFF);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
       for (i=0;i<R;i++)
       {

         for (j=0;j<C;j++)
         {
           
   if(data[j]==255) data[j]--;

            USART_SendData(USART1,data[j]);
           while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

         }
       }
}

//*************************************************************//
//??????: DataAnalyse
//?????à????void  ??????l????????×é??
//??????????????·???
//*************************************************************//
void DataAnalyse(u8 l)
{
    Data=&data[0][0];

   ImageProcess();

}

///////////////////////////////////////////

//????±?????????
///////////////////////////////////////////
void ImageProcess()
{
int i=0,j=0;
u8 *p=0;
//unsigned char *q=0;
        //ThresholdValue = otsu ((unsigned char *)Data, C, 0, 0, R, C);
        //ThresholdValue = 130;

        //?ù?????¨

//        for(i=0;i<38;i++)
//        {
//          for (p=Data+i*C+3;p<Data+(i+1)*C-3;p++)
//          {
//              *p=(*p+*(p+1)+*(p-1))/3;  //?????ù?????¨??·??????¨
//          }
//        }

        //??????

for (p = Data; p ><= Data+R*C; p++)
{
if (*p > ThresholdValue){*p = White;}
else{*p = Black;}
}

          //???¨
for (i=0;i<R;i++)
{
p = Data+i*C+1;
j=0;
while (j><C-2)
{
if (*(p-1) == White && *p == Black && *(p+1) == White)
{
*p = White;
}
else if (*(p-1) == Black && *p == White && *(p+1) == Black)
{
*p = Black;
}
j++;
p++;
}
}
}
void mygetLmr()
{

        u8 i=0;
        u8 j=0;
       u8 pLeft,pRight ;
       u8 bFoundLeft = 0;
       u8 bFoundRight = 0;
      /// unsigned char TripLen = 4;
        char bLeftEnd=0;
        char bRightEnd=0;
        char bMidEnd=0;
        BlackLineData[R-1]=LastFieldMid1;
        for (i=R-2;i>3&&bMidEnd!=1;i--)
        {
            //????????±???????????
              bFoundLeft=0;
              bFoundRight=0;
          //?ò×ó?¨?è

            for (pLeft=BlackLineData[i+1];pLeft>2;pLeft--)
            {
              if (*(Data+i*C+pLeft)==Black)
              {

                  bFoundLeft=1;
                  Left=pLeft;
                  pLeft=1;

              }
            }
            if(bFoundLeft!=1)
             Left=1;

            //?ì????·????????·
            //?ò???¨?è

            for (pRight=BlackLineData[i+1];pRight<C-2;pRight++)
            {
              if (*(Data+i*C+pRight)==Black)//&&*(Data+i*C+pRight+1)==Black)
              {
                bFoundRight=1;
                Right=pRight;
                pRight=C;

              }
            }
            if (bFoundRight!=1)
             Right=C-1;
            BlackLineData=((Left+Right))/2;
            //×ó??±????????á???????????????í???×?í???????????? ????????·??ú??°???
           /*
            if ( *(Data+i*C+ BlackLineData)==Black)
            bMidEnd=1;
            */
            if ((BlackLineData>C-4)||BlackLineData<4)
            bMidEnd=1;
        }

        LastFieldMid1= BlackLineData[ R-5];
        LastFieldMid2=BlackLineData[ R-6];
}
void SmoothMid()
{

 u8  i;
 for (i=R-3;i>2;i--) {
  if (Abs8(BlackLineData-BlackLineData[i-1])>5&& Abs8(BlackLineData-BlackLineData[i+1])>5 )

         BlackLineData=(BlackLineData[i-1]+BlackLineData[i+1] )/2;
 }
 }
void AddMtoPic(void)
{
  u8 i;
  for(i=0;i<R;i++)
  {
    data[BlackLineData]=Black;
    data[80]=Black;
  }
}
void Steer_control(void)
{

  u8 kp,kd,ki;
  s16 steererr  = 0;
 // s32 sum=0;
  //s8  dircnt=0;
  Err=(BlackLineData[12]+BlackLineData[113]+BlackLineData[14]+BlackLineData[15]+BlackLineData[11])/5-80;
  //Err=Err+45;
 /*
  Errd=Err-Errlast;
  Errlast=Err;
  Errdlast  = Errd;
  Errhistory[7]=Errhistory[6];
  Errhistory[6]=Errhistory[5];
  Errhistory[5]=Errhistory[4];
  Errhistory[4]=Errhistory[3];
  Errhistory[3]=Errhistory[2];
  Errhistory[2]=Errhistory[1];
  Errhistory[1]=Errhistory[0];
  Errhistory[0]=Err;
  Erri=(s16)((Errhistory[0]+Errhistory[1]+Errhistory[2]+Errhistory[3]+Errhistory[4]+Errhistory[5]+Errhistory[6]+Errhistory[7])>>3);


  */
  kp=8;
  kd=0;
  ki=0;
  steererr  = kp*Err;
  Steerangle  = STRM-steererr;
  if(Steerangle<=STRL) Steerangle=STRL;
  if(Steerangle>=STRR) Steerangle=STRR;
  TIM3->CCR1 = Steerangle;
}
void SpeedContiol(u16 speed)
{
    TIM3->CCR2 =speed;
     //TIM2->CCR2 = speed;
}
回复

使用道具 举报

4

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-7-21
在线时间
10 小时
 楼主| 发表于 2014-7-31 16:08:30 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥有这方面的例程吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-31 23:25:52 | 显示全部楼层
回复【4楼】zsy3830:
---------------------------------
这个自己写下很简单了。现成代码没有。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2014-10-25
在线时间
8 小时
发表于 2014-11-28 16:11:44 | 显示全部楼层
怎么把16位的数据把它处理成8位的256的数据,16位的数据量实在是太大啦,处理不过来。。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 18:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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