智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5471|回复: 12
打印 上一主题 下一主题

摄像头图像偏右边

[复制链接]

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
跳转到指定楼层
1#
发表于 2014-7-9 09:01:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问下各位大神!我用的是ov7620摄像头,超核的采集程序,什么都没改过!采集回来的图像偏向一边。咨询了其他人,他们说在行采集哪里加延时就可以了。但是加了之后没有效果!付上程序,请大神指点!

#include "ov7620.h"
#include "delay.h"
#include "main.h"
#include "isr.h"
#include "pit.h"
#include "adc.h"
#include "ftm.h"
#include "uart.h"
#include "main.h"
#include "led.h"

DMA_InitTypeDef DMA_InitStruct1;
uint8_t DMABuffer[400];
OV7620Dev_TypeDef OV7620Dev;
uint8_t CCD_Image[CCD_IMAGE_H][CCD_IMAGE_W];   //í¼Ïñêy¾Y
//óDD§DDêy  Ö»2é¼ˉ 68 71 74 77DD μè
uint8_t  CCD_Valid_Line[CCD_IMAGE_H];
uint8_t CCD_Image_01[CCD_IMAGE_H][CCD_IMAGE_W];   //í¼Ïñêy¾Y

//3¡ÖD¶Ïoˉêy
void OV7620_StartTransfer()
{
        GPIO_InitTypeDef GPIO_InitStruct1;
        //½«×′ì¬éèÖÃÎa¿aê¼′«êä
        if(OV7620Dev.State == OV7620_STATE_IDLE)
        {
                OV7620Dev.State = OV7620_STATE_START;
        }
        //¿a3¡ÖD¶Ï
        GPIO_InitStruct1.GPIO_Pin = OV7620_VSYNC_PIN;
        GPIO_InitStruct1.GPIO_InitState = Bit_SET;
        GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_RISING;
        GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPD;
        GPIO_InitStruct1.GPIOx = OV7620_VSYNC_PORT;
        GPIO_Init(&GPIO_InitStruct1);
        //GPIO_SetInterrupt(OV7620_VSYNC_PORT,OV7620_VSYNC_PIN,GPIO_IRQC_RISING);
}

//3õê¼»ˉOV7620Ä£¿é
void OV7620_Init()
{
        GPIO_InitTypeDef GPIO_InitStruct1;
        uint32_t i = 0;
        //óDD§DDêy
        for(i=0;i<sizeof(CCD_Valid_Line);i++)
        {
                CCD_Valid_Line[i] = i*2; //*2Õa¸ö2ÎêyoüÖØòa£¬¾ö¶¨í¼Ïñ¸ß¶è·Ö±æ
        }
        //¿ÕÏD×′ì¬
        OV7620Dev.State = OV7620_STATE_IDLE;
        //éãÏñí·êy¾Y D0-D7
        for(i=0;i<8;i++)
        {
                GPIO_InitStruct1.GPIO_Pin = i;
                GPIO_InitStruct1.GPIO_InitState = Bit_SET;
                GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_DISABLE;
                GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IN_FLOATING;
                GPIO_InitStruct1.GPIOx = OV7620_DATAPORT;
                GPIO_Init(&GPIO_InitStruct1);
        }
       
        //ÏñËØÖD¶Ï PCLK
        GPIO_InitStruct1.GPIO_Pin = OV7620_PCLK_PIN;
        GPIO_InitStruct1.GPIO_InitState = Bit_SET;
        GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_DMA_RISING;
        GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPD;
        GPIO_InitStruct1.GPIOx = OV7620_PCLK_PORT;
        GPIO_Init(&GPIO_InitStruct1);
        //DDÖD¶Ï HREF
        GPIO_InitStruct1.GPIO_Pin = OV7620_HREF_PIN;
        GPIO_InitStruct1.GPIO_InitState = Bit_SET;
        GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_RISING;
        GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPD;
        GPIO_InitStruct1.GPIOx = OV7620_HREF_PORT;
        GPIO_Init(&GPIO_InitStruct1);
        // 3¡ÖD¶Ï VSYNC
        GPIO_InitStruct1.GPIO_Pin = OV7620_VSYNC_PIN;
        GPIO_InitStruct1.GPIO_InitState = Bit_SET;
        GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_RISING;
        GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPD;
        GPIO_InitStruct1.GPIOx = OV7620_VSYNC_PORT;
        GPIO_Init(&GPIO_InitStruct1);
       
        NVIC_EnableIRQ(PORTB_IRQn);
  //ÅäÖÃDMA
  DMA_InitStruct1.Channelx          = DMA_CH1;         //DMA 1í¨μà
  DMA_InitStruct1.PeripheralDMAReq   =PORTC_DMAREQ;    //C¶Ë¿ú(PCLK) éÏéyѽ′¥·¢   
  DMA_InitStruct1.MinorLoopLength = 170;               //′«êä′Îêy 3¬1yéãÏñí·Ã¿DDÏñËØêy¼′¿é
        DMA_InitStruct1.TransferBytes = 2;                   //ÿ′Î′«êä3¸ö×Ö½ú      
        DMA_InitStruct1.DMAAutoClose  = ENABLE;              //á¬Dø2é¼ˉ
        DMA_InitStruct1.EnableState = ENABLE;                //3õê¼»ˉoóᢼ′2é¼ˉ
         
  DMA_InitStruct1.SourceBaseAddr =(uint32_t)&PTD->PDIR;//éãÏñí·¶Ë¿ú½óD0-D7
        DMA_InitStruct1.SourceMajorInc = 0;                  //μØÖ·2»Ôö¼ó
        DMA_InitStruct1.SourceDataSize = DMA_SRC_8BIT;       //8BITêy¾Y
        DMA_InitStruct1.SourceMinorInc = 0;

       
  DMA_InitStruct1.DestBaseAddr =(uint32_t)DMABuffer;  //DMA Äú′æ
        DMA_InitStruct1.DestMajorInc = 0;
        DMA_InitStruct1.DestDataSize = DMA_DST_8BIT;
        DMA_InitStruct1.DestMinorInc = 1;                   //ÿ′Î′«êä +1¸ö×Ö½ú
}


void HIsr(void);
void VIsr(void);
/***********************************************************************************************
1|Äü£oPORTBía2¿ÖD¶Ïèë¿ú
DÎ2Σo0      
·μ»Ø£o0
Ïê½a£o0
************************************************************************************************/
void PORTB_IRQHandler(void)
{
        uint8_t i = 31;
        for(i=31;i>0;i--)  //ÅD¶ÏÄĸöòy½ÅμÄÖD¶Ï·¢éú£¬i±íê¾Äĸöòy½Å·¢éúμÄÖD¶Ï
        {
          if((PORTB->ISFR>>i)==1)break;
        }
        switch(i)
        { //ÖD¶Ï′|àí
                case 9: //DDÖD¶Ï
                                KEY=1;break;
          case OV7620_HREF_PIN: //DDÖD¶Ï
                                HIsr();
                        break;
          case OV7620_VSYNC_PIN://3¡ÖD¶Ï
                                VIsr();
                        break;
    // ...               
          default : break;
        }
    PORTB->ISFR|=PORT_ISFR_ISF_MASK;   //Çå3y±ê־λ
}

//3¡ÖD¶Ï
void VIsr()
{
        GPIO_InitTypeDef GPIO_InitStruct1;
        switch(OV7620Dev.State)
        {
                case OV7620_STATE_IDLE:  //¿ÕÏD
                        break;
                case OV7620_STATE_START: //¿aê¼oóμúò»¸ö3¡ÖD¶ÏDÅoÅμ½à′
                        //¿aDDÖD¶Ï
                        GPIO_InitStruct1.GPIO_Pin = OV7620_HREF_PIN;
                        GPIO_InitStruct1.GPIO_InitState = Bit_SET;
                        GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_RISING;
                        GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPD;
                        GPIO_InitStruct1.GPIOx = OV7620_HREF_PORT;
                        GPIO_Init(&GPIO_InitStruct1);
                  //¼ÆêyÇå0
                        OV7620Dev.HREFCnt = 0;
                        OV7620Dev.HREFITCnt = 0;
                        OV7620Dev.State = OV7620_STATE_COMPLETE;
                        break;
                case OV7620_STATE_COMPLETE: //¿aê¼oóμú¶t¸ö3¡ÖD¶ÏDÅoÅμ½à′£¬2é¼ˉíê3é
                        OV7620Dev.TransferCompleteFlag = TRUE;
                        //1رÕDDÖD¶Ï
                        GPIO_InitStruct1.GPIO_Pin = OV7620_HREF_PIN;
                        GPIO_InitStruct1.GPIO_InitState = Bit_SET;
                        GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_DISABLE;
                        GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPD;
                        GPIO_InitStruct1.GPIOx = OV7620_HREF_PORT;
                        GPIO_Init(&GPIO_InitStruct1);
      //1رÕ3¡ÖD¶Ï
                        GPIO_InitStruct1.GPIO_Pin = OV7620_VSYNC_PIN;
                        GPIO_InitStruct1.GPIO_InitState = Bit_SET;
                        GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_DISABLE;
                        GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPD;
                        GPIO_InitStruct1.GPIOx = OV7620_VSYNC_PORT;
                        GPIO_Init(&GPIO_InitStruct1);
                  //′«êäíê3飬½øèë¿ÕÏDì¬
                        OV7620Dev.State = OV7620_STATE_IDLE;
                        OV7620Dev.FiledCnt ++; //3¡¼Æêy
                        break;
                default:break;
        }
}

//DDí¬2½»Øμ÷ÖD¶Ïoˉêy
void HIsr() //μ÷óÃDDÖD¶Î»Øμ÷oˉêy
{
        uint16_t i;
       
        if(OV7620Dev.HREFITCnt == (CCD_Valid_Line[OV7620Dev.HREFCnt]-1))
        {
                //Æô¶ˉDMA′«êä
                DMA_Init(&DMA_InitStruct1); //′«êäò»DDêy¾Y
        }
       
        //DelayUs(3);
        if(OV7620Dev.HREFITCnt == CCD_Valid_Line[OV7620Dev.HREFCnt])
        {
               
                for(i=0;i<CCD_IMAGE_W;i++)
                {
                       
                        CCD_Image[OV7620Dev.HREFCnt][i] = DMABuffer[i*3]; //*3Õa¸ö2ÎêyoüÖØòa ¾ö¶¨í¼Ïñ¿í¶è
                }
                OV7620Dev.HREFCnt++;
        }
        //DD¼Æêy
        OV7620Dev.HREFITCnt++;
}


回复

使用道具 举报

10

主题

545

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5757

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
2692
贡献
1741
兑换币
1789
注册时间
2014-3-16
在线时间
662 小时
毕业学校
菏泽学院
推荐
发表于 2014-7-13 19:27:20 | 只看该作者
我也遇到过骗的问题。
在行采集加延时会增加采集的宽度,但过多会出现骗的现象,过少图像会变形。
想办法改变每一场采集每一行的时间,可能会有作用。
你先增加一个大的延时,看看是否骗的现象有改变(好与坏,只要有反应就行,说明它起作用了)如果加延时不增校正,则减延时如有效果,把延时去掉,若还不行,则可能是每一场采集开始到采集到第一行的时间因为你的程序耽误太多时间,想办法减一减。

#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt VectorNumber_Vporth void VSYN1 (void)
{                                                
   if((PIFH&0x01)==0x01)                                  //判断中断标志,场中断信号
   {   
      PIFH = 0x03;                                        //清除两个中断标志
      line=0;
      HREF_counter=0;
      VSYN_counter+=1;     
   }
   
   if((PIFH&0x02)==0x02)                                  //判断中断标志,行中断信号
   {
      PIFH = 0x02;                                        //清除行中断标志
      line++;                  
               
      if(line>0 && line<98 && line%3==0)                  //每个3行采集一行。   50  148  3
      {
        delay_V();                  //加这个延时试试啊
                  
        *(*(Data+HREF_counter)+1)= PORTA;   asm NOP;asm NOP;asm NOP;asm NOP;asm NOP;asm NOP;asm NOP;asm NOP;asm NOP;asm NOP;asm NOP;asm NOP;asm NOP;//delay_H();
}


个人拙见,希望你能成功。
回复 支持 2 反对 0

使用道具 举报

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
2#
 楼主| 发表于 2014-7-9 09:09:55 | 只看该作者
附上程序!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
3#
 楼主| 发表于 2014-7-9 09:10:24 | 只看该作者
附上程序2

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
4#
 楼主| 发表于 2014-7-9 09:10:44 | 只看该作者
附上程序3

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
5#
 楼主| 发表于 2014-7-9 09:11:01 | 只看该作者
附上程序4

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
6#
 楼主| 发表于 2014-7-9 09:11:20 | 只看该作者
附上程序5

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

61

主题

545

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3810

优秀会员奖章活跃会员奖章论坛骨干奖章在线王奖章论坛元老奖章

威望
1747
贡献
995
兑换币
1052
注册时间
2013-9-7
在线时间
534 小时
7#
发表于 2014-7-9 11:35:46 | 只看该作者
有没有看看是不是摄像头偏了
回复 支持 反对

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
748
威望
429
贡献
145
兑换币
244
注册时间
2013-10-27
在线时间
87 小时
毕业学校
天津工业大学
8#
发表于 2014-7-9 16:04:37 | 只看该作者
可能是采集的点数少,之前我们的也是,,后来多采了10个点每行
回复 支持 反对

使用道具 举报

23

主题

241

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1405
威望
717
贡献
428
兑换币
453
注册时间
2014-2-6
在线时间
130 小时
9#
发表于 2014-7-9 20:45:10 | 只看该作者
我们的摄像头原来也有这中情况,摄像头一直斜着安,采集到的图像才居中,不会偏向一边,后来买了一个新的,安上之后发现旧的是调车时撞歪了。你要不找个同样的试试。
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1842
威望
877
贡献
507
兑换币
557
注册时间
2013-1-21
在线时间
229 小时
10#
 楼主| 发表于 2014-7-13 04:20:51 | 只看该作者
谢谢各位的回复,试过你们的方法都没有效果,图像偏左边
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 23:38 , Processed in 0.078182 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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