STM32 OV2640图像二值化处理

在网上找了好久关于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轴的坐标(这种找坐标是最笨的方法,有简单方法的欢迎在下面留言)

IMG_0805.JPG
IMG_0804.JPG
IMG_0806.JPG
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。