智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3808|回复: 10
打印 上一主题 下一主题

图像采集

[复制链接]

3

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
威望
182
贡献
70
兑换币
10
注册时间
2012-7-2
在线时间
29 小时
毕业学校
北京工商大学
跳转到指定楼层
1#
发表于 2012-7-3 13:26:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是小弟的图像采集程序,但是用串口助手调试出来的数据不对,不是二值化(0或1)数据,而是十六进制数据(如9D 9F E5 EB之类),我采用的是数字摄像头OV6620,单片机是mc9s12xs128,波特率为9600,PT0接行中断,PT1接场中断,走过的路过的望指导下,我学编程一个星期,不是很懂,望指导,程序编译也没有问题,该如何修改才能在串口助手中得到二值化数据?
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define ROW 36        //数字摄像头所采集的二维数组行数
#define COLUMN 70    // 数字摄像头所采集的二维数组列数
#define ROW_START 11  // 数字摄像头二维数组行开始行值
#define ROW_MAX   280//  数字摄像头所采集的二维数组行最大值
#define THRESHOLD  0x20 // 图像阈值,根据所采集图像亮度值大小的实际情况调整
unsigned char Buffer[ROW][COLUMN];//所采集的图像二维数组
unsigned char Buffer_Temp[ROW][COLUMN];
unsigned char SampleFlag=0  ;  //奇偶场标记
unsigned char Interval;
unsigned int m=0;            // 换行变量
unsigned int n=0;
unsigned int Line=0;        //行中断计数变量

/***************************************************
** 函数名称: PLL_Init
** 功能描述: 时钟初始化函数
** 说明:
****************************************************/
void PLL_Init(void)   
{                    
   CLKSEL=0x00;  //48mhz                                                                                                                               PLLCTL_PLLON=1;
   SYNR=0XC0 | 0X05;
   REFDV=0X80 | 0X01;
   POSTDIV=0X00;
   _asm(nop);
   _asm(nop);
   while(0==CRGFLG_LOCK);//锁相环锁定
   CLKSEL_PLLSEL=1;//选定外部时钟  
}                                                                                                                                                                                                                                                                                                                         /***************************************************                                                                         ** 函数名称: TIM_Init
** 功能描述: 行场中断初始化函数
** 说明:
****************************************************/
void TIM_Init(void)
{
   TIOS=0x00;          //外部输入捕捉 0,1 通道  
   TCTL4=0x09;         //通道0上升沿触发,通道 1 下降沿触发
   TSCR1=0x80;         //使能
   TIE=0x03;           //通道 0,1 中断使能
   TFLG1=0xFF;         //清中断标志位
}
/***************************************************
** 函数名称: IO_Init
** 功能描述: IO口初始化函数
** 说明:
****************************************************/
void IO_Init(void)
{
    DDRA=0X00;
}
/***************************************************
** 函数名称: SCI_Init
** 功能描述: 串口初始化函数
** 说明:
****************************************************/
void SCI_Init()
{
    SCI0BD=312;         //9600bps  Baud Rate=BusClock/(16*SCIBD)
    SCI0CR1=0;         //正常8位模式,无奇偶校验
    SCI0CR2=0X2C;      //发送允许   接受中断允许  
}
/**************************************************
** 函数名称: SCI_Write
** 功能描述: 给串行口写一个字符数据
** 输    入: SendChar为写入字符
** 输    出: 无
** 说明:  
***************************************************/
void SCI_Write(unsigned char SendChar)
{
    while (!(SCI0SR1&0x80));
    SCI0DRH=0;
    SCI0DRL=SendChar;
}
/**************************************************
** 函数名称: Image_Binaryzation
** 功能描述: 图像数据二值化
** 输    入: row
** 输    出: 无
** 说明:  
***************************************************/      
void Image_Binaryzation(unsigned int row)  //二值化程序
{
  unsigned char *p_Image;
  unsigned char *q_Image;
  q_Image=&Buffer_Temp[row][0];
  for(p_Image=&Buffer[row][0];p_Image<=&Buffer[row][COLUMN-1];p_Image++)      
    {*(q_Image++)=*p_Image; }  
}
/**************************************************
** 函数名称: Process
** 功能描述: 图像数据处理
** 输    入: 无
** 输    出: 无
** 说明:  
***************************************************/
void Process()
{
  unsigned char i,j;
  for(i=0;i<ROW;i++)
    {
    for(j=0;j<COLUMN;j++)
      {
       if(Buffer_Temp[j]>THRESHOLD)//二值化处理程序
       SCI_Write('1') ;
       else  SCI_Write('0') ;
      }   
    SCI_Write(0x0D);//回车符
    SCI_Write(0X0A);//换行符
  }
}
/***************************************************
** 函数名称: main
** 功能描述: 主函数
** 说明:
****************************************************/        
void main(void)
{
  /* put your own code here */
  PLL_Init();
  TIM_Init();
  IO_Init();
  SCI_Init();
EnableInterrupts;
  for(;;)
  {
  Process();
  
  //  _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}
/**************************************************
** 函数名称: 中断处理函数
** 功能描述: 行中断处理函数
** 输    入: 无
** 输    出: 无
** 说明:  
***************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 8  PT0_Interrupt()
{
  TFLG1_C0F=1;// 行中断标志位清除,以便于下次行中断进行
  Line++;   // 行中断计数变量
  if ( SampleFlag == 0 || Line<ROW_START ||  Line>ROW_MAX )  
  {
    return;   //判断是否从新的一场开始
   }      
     
  if(Line<=132)                Interval=12;
  else if(Line>132&&Line<=200) Interval=8;
  else if(Line>200&&Line<=248) Interval=6;
  else                         Interval=4;        
      
  if(Line%Interval==0)
  {
  Buffer[m][0]=PORTA;  Buffer[m][n+0]=PORTA;
  Buffer[m][1]=PORTA;  Buffer[m][n+1]=PORTA;
  Buffer[m][2]=PORTA;  Buffer[m][n+2]=PORTA;
  Buffer[m][3]=PORTA;  //Buffer[m][n+3]=PORTA;
  Buffer[m][4]=PORTA;  Buffer[m][n+4]=PORTA;
  Buffer[m][5]=PORTA;  Buffer[m][n+5]=PORTA;
  Buffer[m][6]=PORTA;  Buffer[m][n+6]=PORTA;
  Buffer[m][7]=PORTA;  //Buffer[m][n+7]=PORTA;
  Buffer[m][8]=PORTA;  Buffer[m][n+8]=PORTA;
  Buffer[m][9]=PORTA;  Buffer[m][n+9]=PORTA;
  Buffer[m][10]=PORTA; Buffer[m][n+10]=PORTA;
  Buffer[m][11]=PORTA; //Buffer[m][n+11]=PORTA;
  Buffer[m][12]=PORTA; Buffer[m][n+12]=PORTA;
  Buffer[m][13]=PORTA; Buffer[m][n+13]=PORTA;
  Buffer[m][14]=PORTA; Buffer[m][n+14]=PORTA;
  Buffer[m][15]=PORTA; //Buffer[m][n+15]=PORTA;
  Buffer[m][16]=PORTA; Buffer[m][n+16]=PORTA;
  Buffer[m][17]=PORTA; Buffer[m][n+17]=PORTA;
  Buffer[m][18]=PORTA; Buffer[m][n+18]=PORTA;
  Buffer[m][19]=PORTA; //Buffer[m][n+19]=PORTA;
  Buffer[m][20]=PORTA; Buffer[m][n+20]=PORTA;
  Buffer[m][21]=PORTA; Buffer[m][n+21]=PORTA;
  Buffer[m][22]=PORTA; Buffer[m][n+22]=PORTA;
  Buffer[m][23]=PORTA; //Buffer[m][n+23]=PORTA;
  Buffer[m][24]=PORTA; Buffer[m][n+24]=PORTA;
  Buffer[m][25]=PORTA; Buffer[m][n+25]=PORTA;
  Buffer[m][26]=PORTA; Buffer[m][n+26]=PORTA;
  Buffer[m][27]=PORTA; //Buffer[m][n+27]=PORTA;
  Buffer[m][28]=PORTA; Buffer[m][n+28]=PORTA;
  Buffer[m][29]=PORTA; Buffer[m][n+29]=PORTA;
  Buffer[m][30]=PORTA; Buffer[m][n+30]=PORTA;
  Buffer[m][31]=PORTA; //Buffer[m][n+31]=PORTA;
  Buffer[m][32]=PORTA; Buffer[m][n+32]=PORTA;
  Buffer[m][33]=PORTA; Buffer[m][n+33]=PORTA;
  Buffer[m][34]=PORTA; Buffer[m][n+34]=PORTA;
  Buffer[m][35]=PORTA; //Buffer[m][n+35]=PORTA;
  Buffer[m][36]=PORTA; Buffer[m][n+36]=PORTA;
  Buffer[m][37]=PORTA; Buffer[m][n+37]=PORTA;
  Buffer[m][38]=PORTA; Buffer[m][n+38]=PORTA;
  Buffer[m][39]=PORTA; //Buffer[m][n+39]=PORTA;
  Buffer[m][40]=PORTA; Buffer[m][n+40]=PORTA;
  Buffer[m][41]=PORTA; Buffer[m][n+41]=PORTA;
  Buffer[m][42]=PORTA; Buffer[m][n+42]=PORTA;
  Buffer[m][43]=PORTA; //Buffer[m][n+43]=PORTA;
  Buffer[m][44]=PORTA; Buffer[m][n+44]=PORTA;
  Buffer[m][45]=PORTA; Buffer[m][n+45]=PORTA;
  Buffer[m][46]=PORTA; Buffer[m][n+46]=PORTA;
  Buffer[m][47]=PORTA; //Buffer[m][n+47]=PORTA;
  Buffer[m][48]=PORTA; Buffer[m][n+48]=PORTA;
  Buffer[m][49]=PORTA; Buffer[m][n+49]=PORTA;
  Buffer[m][50]=PORTA; Buffer[m][n+50]=PORTA;
  Buffer[m][51]=PORTA; //Buffer[m][n+51]=PORTA;
  Buffer[m][52]=PORTA; Buffer[m][n+52]=PORTA;
  Buffer[m][53]=PORTA; Buffer[m][n+53]=PORTA;
  Buffer[m][54]=PORTA; Buffer[m][n+54]=PORTA;
  Buffer[m][55]=PORTA; //Buffer[m][n+55]=PORTA;
  Buffer[m][56]=PORTA; Buffer[m][n+56]=PORTA;
  Buffer[m][57]=PORTA; Buffer[m][n+57]=PORTA;
  Buffer[m][58]=PORTA; Buffer[m][n+58]=PORTA;
  Buffer[m][59]=PORTA; //Buffer[m][n+59]=PORTA;
  Buffer[m][60]=PORTA; Buffer[m][n+60]=PORTA;
  Buffer[m][61]=PORTA; Buffer[m][n+61]=PORTA;
  Buffer[m][62]=PORTA; Buffer[m][n+62]=PORTA;
  Buffer[m][63]=PORTA; //Buffer[m][n+63]=PORTA;
  Buffer[m][64]=PORTA; Buffer[m][n+64]=PORTA;
  Buffer[m][65]=PORTA; Buffer[m][n+65]=PORTA;
  Buffer[m][66]=PORTA; Buffer[m][n+66]=PORTA;
  Buffer[m][67]=PORTA; //Buffer[m][n+67]=PORTA;
  Buffer[m][68]=PORTA; Buffer[m][n+68]=PORTA;
  Buffer[m][69]=PORTA; Buffer[m][n+69]=PORTA;
  m++;
  }
  Image_Binaryzation(m);
}
/**************************************************
** 函数名称: 中断处理函数
** 功能描述: 场中断处理函数
** 输    入: 无
** 输    出: 无
** 说明:  
***************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED  
void interrupt 9 PT1_Interrupt()
{  
  TFLG1_C1F=1; //  场中断清楚,以便于下次的场中断的正常进行
  TFLG1_C0F=1; //  行中断清除,以便于开始采集图像数据
  m=0;         //  行中间变量清零,以便于开始从把采集的图像放到数组的第一行
  Line=0;      //  行中断临时变量清零
  SampleFlag=1;                                                                                                                                            }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               



10

主题

510

帖子

0

精华

金牌会员

000

Rank: 6Rank: 6

积分
2181

优秀会员奖章活跃会员奖章

QQ
威望
1158
贡献
481
兑换币
16
注册时间
2012-2-10
在线时间
272 小时
2#
发表于 2012-7-3 16:46:11 | 只看该作者
你要等一帧采完整了再上传嘛。。。不然。。。你懂
回复 支持 反对

使用道具 举报

42

主题

299

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4405
QQ
威望
2280
贡献
1049
兑换币
767
注册时间
2011-11-29
在线时间
538 小时
3#
发表于 2012-7-25 11:17:36 | 只看该作者
兄弟,我也在图像二值化,加qq聊。550734872
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
威望
168
贡献
55
兑换币
0
注册时间
2012-7-11
在线时间
75 小时
毕业学校
安徽工业大学
4#
发表于 2012-8-3 17:19:03 | 只看该作者
我也是   你怎么解决的啊?求指教
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
威望
182
贡献
70
兑换币
10
注册时间
2012-7-2
在线时间
29 小时
毕业学校
北京工商大学
5#
 楼主| 发表于 2012-9-20 21:00:17 | 只看该作者
蔚城-拜金主义者 发表于 2012-8-3 17:19
我也是   你怎么解决的啊?求指教

我的问题解决了,将程序中的所有串口0改为串口1,原理图中串口0经过了RS-232有一个电平转换的过程,可能有影响,串口1没有经过RS232,直接将采集到的数据输出
回复 支持 反对

使用道具 举报

15

主题

83

帖子

0

精华

高级会员

Rank: 4

积分
594
威望
390
贡献
88
兑换币
37
注册时间
2012-7-28
在线时间
58 小时
6#
发表于 2012-11-3 02:16:53 | 只看该作者
我也是碰到了这样的问题,可是用串口一串口二都没有用,怎么回事儿呀
回复 支持 反对

使用道具 举报

15

主题

83

帖子

0

精华

高级会员

Rank: 4

积分
594
威望
390
贡献
88
兑换币
37
注册时间
2012-7-28
在线时间
58 小时
7#
发表于 2012-11-3 02:49:02 | 只看该作者
你的串口1没有与RS-232有一个电平转换,那么你的串口一的硬件怎么弄的
回复 支持 反对

使用道具 举报

68

主题

1086

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4578

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

QQ
威望
2515
贡献
1213
兑换币
1382
注册时间
2012-9-19
在线时间
425 小时
8#
发表于 2013-3-13 22:50:04 | 只看该作者
学习了
回复 支持 反对

使用道具 举报

0

主题

91

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1608
威望
861
贡献
273
兑换币
388
注册时间
2012-6-9
在线时间
237 小时
9#
发表于 2013-3-31 20:41:45 | 只看该作者
我用的是CCD摄像头,单片机mc9s12xs128。和你的程序一样。那可以出来图像吗?
回复 支持 反对

使用道具 举报

68

主题

1086

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4578

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

QQ
威望
2515
贡献
1213
兑换币
1382
注册时间
2012-9-19
在线时间
425 小时
10#
发表于 2013-4-2 13:14:32 | 只看该作者
叶林杰00 发表于 2012-7-3 16:46
你要等一帧采完整了再上传嘛。。。不然。。。你懂

哥们怎么判断一帧图像采集完毕啊!!!求仔细 解答,小弟感激不尽,现在困惑呀
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-2 16:14 , Processed in 0.083887 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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