首页 > 其他 > 详细

从0开始的智能车代码(1)

时间:2020-07-19 11:46:41      阅读:44      评论:0      收藏:0      [点我收藏+]

逐飞科技开源链接:https://gitee.com/seekfree

代码从 Seekfree_RT1064_Opensource_Library 开始。

想要站在巨人的肩膀上,首先要爬上巨人。在抄别人的代码时,我将会经常发现一些不尽如人意的地方,但是为了使代码顺利运行,我将标记出这些问题而不改善。

根据 Seekfree 总钻风例程说明,只使用一个摄像头时选择 CSI 接口(CSI 接口为图像采集专用接口内嵌 DMA,可以接受更高的像素时钟)。摄像头 TX:C29,RX:C28。

void CSI_IRQHandler(void)
{
    CSI_DriverIRQHandler();     //调用SDK自带的中断函数 这个函数最后会调用我们设置的回调函数
    __DSB();                    //数据同步隔离
}

这个中断函数在 Seekfree_RT1064_Opensource_Library 中已经写好了,不需要修改。

在主循环中首先判断摄像头数据是否采集完成(mt9v03x_csi_finish_flag),然后使用大津法求阈值。

大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于 1979 年提出。从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。

uint8 getThreshold(uint8 *image,uint16 col,uint16 row)//使用原图像计算阈值
{
  uint16 grayCount[256]={0};//灰度值分布
  uint32 graySum=0;//灰度值总和
  uint16 pixelSum=0;//像素点总数
  float graypro[256];
  
  uint8 threshold;
  uint16 i,j;
  uint16 step=2;//每行/列在step个像素点的灰度值中取一个有效值
  
  //统计灰度值分布
  for(i=0;i<row;i+=step){
    for(j=0;j<col;i+=step){
      grayCount[image[i*col+j]]++;//将前的点的像素值作为计数数组的下标
      graySum+=image[i*col+j];//灰度值总和
      pixelSum++;
    }
  }
  
  //计算每个像素值的点在整幅图像中的比例
  for(i=0;i<256;i++){
    graypro[i]=(float)grayCount[i]/pixelSum;
  }
  
  float darkPixel=0;//深色像素点所占比例之和
  float lightPixel;//浅色像素点所占比例之和
  float darkPixelGray=0;//深色像素点所占比例与灰度值乘积之和
  float lightPixelGray;//浅色像素点所占比例与灰度值乘积之和
  float darkAverage;//深色像素点平均灰度
  float lightAverage;//浅色像素点平均灰度
  
  float delta;
  float maxDelta=0;
  
  for(i=0;i<256;i++){
    darkPixel+=graypro[i];
    lightPixel=1-darkPixel;
    
    darkPixelGray+=i*graypro[i];
    lightPixelGray=graySum/pixelSum-darkPixelGray;
    
    darkAverage=darkPixelGray/darkPixel;
    lightAverage=lightPixelGray/lightPixel;
    
    delta=darkPixel*(darkAverage-graySum/pixelSum)*(darkAverage-graySum/pixelSum)
      +lightPixel*(lightAverage-graySum/pixelSum)*(lightAverage-graySum/pixelSum);
    if(delta>maxDelta){
      maxDelta=delta;
      threshold=i;
    }
    else{
      break;
    }
  }
  return threshold;
}

 求出阈值后对原图像数组进行二值化。在二值化函数中,我将二值化后的数组地址作为参数传进函数。

void imageBinary(uint8 threshold,uint8 *image,uint8 *binaryImage,uint16 col,uint16 row){
  uint8 gray;
  uint16 i,j;
  for(i=0;i<row;i++){
    for(j=0;j<col;i++){
      gray=*(image+i*col+j);
      *(binaryImage+i*col+j)=gray>threshold?255:0;
    }
  }
}

 

从0开始的智能车代码(1)

原文:https://www.cnblogs.com/stephen0829/p/13328070.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!