文章目录
前言
ov2640色块识别,提取RGB格式图像的R,G,B,调节阈值,将图像进行二值化传输到LCD上。(注:免费源码链接,请点赞关注私信)
一、提取R,G,B。
red = (uint16_t)((RGB&0xf800)>>8); //提取像素的R ,G ,B
green = (uint16_t)((RGB&0x07e0)>>3);
blue = (uint16_t)((RGB&0x001f)<<3);
二、色块识别。
1: 通过调节R,G,B的大小范围来捕获所要识别的颜色,
uint8_t r=100,g=0,b=0;
uint8_t r1=190,g1=100,b1=100;
void rgb_data_process(void)
{
uint16_t sum_x =0,sum_y =0, i_xy =0;
uint16_t X=0,Y=0,n_i=0;
uint8_t key=0,key1=0;
key1=remote_scan(); //红外遥控按键
if(g_ov ) //一帧图像标志
{
dcmi_stop(); //停止数据传输
lcd_set_cursor(0,0); //开始写入LCD坐标
lcd_write_ram_prepare(); //开始写入
for(find_y=0;find_y<B;find_y++) //显示色块二值化图像
{
for(find_x=0;find_x<A;find_x++)
{
if(find_x==(A-1))
{
lcd_set_cursor(0,find_y+1);
lcd_write_ram_prepare();
}
red = (uint16_t)((rgb_buf[find_y][find_x]&0xf800)>>8); //提取像素的RED ,GREEN ,BLUE
green = (uint16_t)((rgb_buf[find_y][find_x]&0x07e0)>>3);
blue = (uint16_t)((rgb_buf[find_y][find_x]&0x001f)<<3);
if((red>r && red<r1 && green>g && green<g1 && blue> b && blue< b1) ) //调节阈值,识别色块
{
sum_x = sum_x+find_x ;
sum_y = sum_y+find_y ;
i_xy++;
LCD->LCD_RAM=BLACK;
}
else
{
LCD->LCD_RAM=WHITE;
}
}
}
//计算色块的中心点
n_i=i_xy;
X=sum_x /n_i;
Y=sum_y /n_i;
lcd_show_num(200,210,X,3,16,RED);//显示中心点坐标
lcd_show_num(200,230,Y,3,16,RED);
for(find_y=0;find_y<B;find_y++) //显示摄像的图像
{
for(find_x=0;find_x<A;find_x++)
{
if(find_x==(A-1))
{
lcd_set_cursor(0,100+find_y+1);
lcd_write_ram_prepare(); //开始写入GRAM
}
LCD->LCD_RAM=rgb_buf[find_y][find_x];
}
}
g_ov=0; //清零一帧图像标志
dcmi_start(); //启动摄像数据传输
__HAL_DCMI_ENABLE_IT(&g_dcmi_handle, DCMI_IT_FRAME); //使能帧中端
}
key= key_scan(1);
if(key==1)r++;
if(key==2)r1++;
// if(key==3)b++;
// if(key==4)g1++;
// if(key1==12)r++;
// if(key1== 24)r1++;
// if(key1== 8)g++;
// if(key1== 28)g1++;
// if(key1== 66)b++;
// if(key1== 82)b1++;
//
lcd_show_string(30, 220, 200, 16, 16, "R:", RED);
lcd_show_string(30, 240, 200, 16, 16, "G:", RED);
lcd_show_string(30, 260, 200, 16, 16, "B:", RED);
lcd_show_string(120, 220, 200, 16, 16, "R1:", RED);
lcd_show_string(120, 240, 200, 16, 16, "G1:", RED);
lcd_show_string(120, 260, 200, 16, 16, "B1:", RED);
lcd_show_num(50,220,r,3,16,RED);
lcd_show_num(50,240,g,3,16,RED);
lcd_show_num(50,260,b,3,16,RED);
lcd_show_num(140,220,r1,3,16,RED);
lcd_show_num(140,240,g1,3,16,RED);
lcd_show_num(140,260,b1,3,16,RED);
}
2:效果演示
总结
以上就是今天要讲的内容RGB格式的色块识别,网络上大都是推荐HSL / HSV格式的想了解区别的话自己可以搜一下,RGB的话方便点不用转换格式。后期还会分享单片机相关的学习,感兴趣的话可以支持一下,关注一下博主,让咱们一块成长。想要下载源码的小伙伴点击这里stm32f407+ov2640色块识别