智能车制作

标题: 摄像头图像偏右边 [打印本页]

作者: ccsshu    时间: 2014-7-9 09:01
标题: 摄像头图像偏右边
请问下各位大神!我用的是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++;
}



作者: ccsshu    时间: 2014-7-9 09:09
附上程序!

作者: ccsshu    时间: 2014-7-9 09:10
附上程序2
作者: ccsshu    时间: 2014-7-9 09:10
附上程序3
作者: ccsshu    时间: 2014-7-9 09:11
附上程序4
作者: ccsshu    时间: 2014-7-9 09:11
附上程序5
作者: 925901184    时间: 2014-7-9 11:35
有没有看看是不是摄像头偏了
作者: 1023968138    时间: 2014-7-9 16:04
可能是采集的点数少,之前我们的也是,,后来多采了10个点每行
作者: 仪124    时间: 2014-7-9 20:45
我们的摄像头原来也有这中情况,摄像头一直斜着安,采集到的图像才居中,不会偏向一边,后来买了一个新的,安上之后发现旧的是调车时撞歪了。你要不找个同样的试试。
作者: ccsshu    时间: 2014-7-13 04:20
谢谢各位的回复,试过你们的方法都没有效果,图像偏左边
作者: 第109位梁山好汉    时间: 2014-7-13 19:27
我也遇到过骗的问题。
在行采集加延时会增加采集的宽度,但过多会出现骗的现象,过少图像会变形。
想办法改变每一场采集每一行的时间,可能会有作用。
你先增加一个大的延时,看看是否骗的现象有改变(好与坏,只要有反应就行,说明它起作用了)如果加延时不增校正,则减延时如有效果,把延时去掉,若还不行,则可能是每一场采集开始到采集到第一行的时间因为你的程序耽误太多时间,想办法减一减。

#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();
}


个人拙见,希望你能成功。
作者: 六安飞雨    时间: 2015-4-6 13:24
第109位梁山好汉 发表于 2014-7-13 19:27
我也遇到过骗的问题。
在行采集加延时会增加采集的宽度,但过多会出现骗的现象,过少图像会变形。
想办法 ...

加个延时就好了!!

作者: 创世神    时间: 2017-3-17 23:46
没有   备注的程序   看着好累啊。。:'(:'(




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2