在网上找了好久关于OV2640二值化的资料,都没有找到很理想的,今天参考了别人的程序,自己终于捉摸着写出了一点,来做个笔记,防止日后忘掉
前面的初始化函数在这里不赘述了(使用的原子的开发板)
程序里面是通过DMA不断采集图像信息 , 存放在一个二维数组中
DCMI_DMA_Init((u32)rgb_buf,sizeof(rgb_buf)/4,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);
然后用两个for语句对每个像素点进行处理
while(1){
LCD_SetCursor(0,0);
LCD_WriteRAM_Prepare();
hang=0;
POINT_COLOR=RED;
for(i=0;i<B;i++)
{
for(j=0;j<A;j++)
{
if(j==(A-1))
{
hang++;
LCD_SetCursor(0,i+1);
LCD_WriteRAM_Prepare(); //开始写入GRAM
}
gray=((rgb_buf[i][j]>>11)*19595+((rgb_buf[i][j]>>5)&0x3f)*38469 +(rgb_buf[i][j]&0x1f)*7472)>>16;
if(gray>=37) //这里是图像黑白二值化
{
num++;
X_SUM+=i;
Y_SUM+=j;
LCD->LCD_RAM=WHITE;
}
else
{
LCD->LCD_RAM=BLACK;
}
}
}
LCD_ShowNum(0,250,(X_SUM)/num,8,16);
LCD_ShowNum(0,270,(Y_SUM)/num,8,16);
X_SUM=0;Y_SUM=0;num=0;
}
对每个像素进行二值化,然后再进行阈值判断,就可以在屏幕上看到如图下的画面了
寻找目标位置 :
对所有的白色像素XY轴进行累加和,再除以加了多少次,就可以得到小球XY轴的坐标(这种找坐标是最笨的方法,有简单方法的欢迎在下面留言)