逐飞科技开源链接: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; } } }
原文:https://www.cnblogs.com/stephen0829/p/13328070.html