STM32驱动OV7725摄像头颜色识别
实验目的:
使用stm32驱动OV7725摄像头进行图像实时采集,在tft屏幕上实时显示并识别图像中的特定颜色,在颜色的周围画上框。
实验现象:
我的工程代码链接:
http://download.csdn.net/detail/hongbin_xu/9749105
程序移植自阿莫论坛某位大神的程序。
链接:http://www.amobbs.com/thread-5499408-1-1.html?_dsign=85056954
实现原理:
将摄像头的数据读出写入tft屏,读取tft屏幕上的像素点的颜色进行识别。由于RGB格式的颜色数据的效果不好,所以将其转换为HSL格式数据。首先遍历寻找腐蚀中心,然后在之前腐蚀中心点处进行迭代向外寻找新的腐蚀中心。腐蚀算法从该点开始分别向上下左右四个方向进行读点,若点的颜色符合条件则往外读,等四个方向都结束后得到四个边缘点的坐标,记左边缘点的x轴坐标为left,右边缘点的x轴坐标为right,上边缘点的y轴坐标为up,下边缘点的y轴坐标为bottom,那么坐标( (right-left)/2 , (up-bottom)/2 ) 即为新的腐蚀中心。
关于程序中使用到的参数值,我是参照下面这些该大神在论坛说的调试经验得到的参数:
设置好H、S、L的阈值,用起来没有问题。分享一下我的调节参数时总结的技巧:
1.识别绿色和蓝色的效果最好,因为他们在色调谱中占据的范围最大
2.先将S、L的范围设的广一些(如 5 -250 ),先调节H的值的范围
3.H值调节好后,再调节S、L值
这里介绍下一些相关概念:
HSL:(摘自百度百科)
HSL的H(hue)分量,代表的是人眼所能感知的颜色范围,这些颜色分布在一个平面的色相环上,取值范围是0°到360°的圆心角,每个角度可以代表一种颜色。基本参照:360°/0°红、60°黄、120°绿、180°青、240°蓝、300°洋红,它们在色相环上按照60°圆心角的间隔排列。
HSL的S(saturation)分量,指的是色彩的饱和度,它用0%至100%的值描述了相同色相、明度下色彩纯度的变化。数值越大,颜色中的灰色越少,颜色越鲜艳,呈现一种从理性(灰度)到感性(纯色)的变化。
HSL的L(lightness)分量,指的是色彩的明度,作用是控制色彩的明暗变化。它同样使用了0%至100%的取值范围。数值越小,色彩越暗,越接近于黑色;数值越大,色彩越亮,越接近于白色。
HSL与RGB之间的计算:
从RGB推算HSL:
R、G、B的数值定在【0,255】
亮度L只依赖于R、G、B的最大值和最小值。若令M、N分别是R、G、B的最大值和最小值,则有:若M=0(N=0),即R、G、B均为0时,L=0;否则,亮度L为
其中。由公式可知,L的取值范围在0到240之间。
对于饱和度S:当M或N改变时S随之改变;否则,S不变。即S与L的情况类似,只与最大和最小值有关,换句话说与L有关。所以可以得到S与L之间的数学关系:
当M=N=0或者M=N=255时,没有意义;l=0时,s=0;
当(M+N)>256时,S为:S=240(M-N)/(512-M-N);当l>120时,s = (M-N)* 240 / ( 480 - ( M+ N) );
当(M+N)<256时,S为:S=240(M-N)/(M+N);当l<=120时,s = (M-N)* 240 / ( M+ N);
同理,色相H也是只与最大值和最小值有关。
当M=N时,H无定义;
当最大值为红色,最小值为蓝色,即M=R、N=B,H介于0到40之间,有:
H=40(G-N)/(M-N);
当最大值为红色,最小值为绿色,即M=R、N=G,H介于200到240之间,有:
H=240+40(G-B)/(M-N);
当最大值为绿色,最小值为红色,即M=G、N=R,H介于80到120之间;
当最大值为绿色,最小值为蓝色,即M=G、N=B,H介于40到80之间;
h = 40 * ( B - R ) / (M-N)+ 80;
当最大值为蓝色,最小值为红色,即M=B、N=R,H介于120到160之间;
当最大值为蓝色,最小值为绿色,即M=B、N=G,H介于160到200之间;
h = 40 * ( R - G ) / (M-N)+ 160;
从HSL反算RGB:
当H无定义时,表示R、G、B三者相等,因策,他们的值可以直接由下面公式求得:
当L=0时,R=G=B=0;
当L!=0时,R=G=B=(17L-8)/16;
当H有定义时,令SUM为M与N之和,由上面的公式可知,若L=0,则SUM=0,否则SUM=(17L-8)*2/16。
若SUM<256,则最大值M为:M=SUM/2+SUM*S/480;
若SUM<=256,则最大值M为:M=SUM/2+(512-SUM)*S/480;
求出最大值后,可以求出最小值N=SUM-M。
下面分六种情况求出R、G、B的值:
令L为H/40的整数部分:
若L=0,则:
R=M
B=N
G=B+H *(R-B)/40
若L=1,则:
G=M
B=N
R=G+(G-B)(H-40)/40
若L=2,则:
G=M
R=N
B=R+(G-R)(H-80)/40
若L=3,则:
B=M
R=N
G=B+(B-R)(H-120)/40
若L=4,则:
G=N
B=M
R=G+(B-G)(H-160)/40
若L=5,则:
R=M
G=N
B=R +(R-G)(H-200)/40
至此RGB的反算就完成了。
如果想要更快捷地将HSL转换成RGB格式,可以使用下面的工具:
网络工具链接:
HSL取色器
链接: http://hslpicker.com/#f9aee5,0.82
RGB、HEX、HSL等颜色形式相互转换工具
链接: http://tools.jb51.net/color/rgb_hex_hsl
推荐使用windos自带的绘图工具软件中,点“颜色”->”编辑颜色”->”规定自定义颜色” 进入调色板进行调色。
具体代码请参考我上传的工程代码。
参考链接:
杨朝霞,逯峰,图像处理中RGB与HLS之间的转换,http://www.doc88.com/p-9991476681520.html
STM32驱动OV7725摄像头颜色识别的更多相关文章
- python3 树莓派 + usb摄像头 做颜色识别 二维码识别
今天又啥也没干 我完蛋了哦 就是没办法沉下心来,咋办....还是先来条NLP吧.. 七,凡事必有至少三个解决方法 对事情只有一个方法的人,必陷入困境,因为别无选择. 对事情有两个方法的人也陷入困境, ...
- STM32驱动ILI9341控制器控制TFTLCD显示
STM32驱动ILI9341控制器控制TFTLCD显示 一.用STM32控制TFTLCD显示的编程方法,在编程驱动TFTLCD液晶显示器之前,我们先熟悉以下概念: 1.色彩深度,这是一个与TFTLCD ...
- 颜色传感器TCS230及颜色识别电路(转)
摘要 TCS230是美国TAOS公司生产的一种可编程彩色光到频率的传感器.该传感器具有分辨率高.可编程的颜色选择与输出定标.单电源供电等特点:输出为数字量,可直接与微处理器连接.文中主要介绍TCS23 ...
- 50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等 ...
- Opencv颜色识别与追踪
这是基于颜色识别的物体追踪 不废话 直接看代码 这是Opencv3的代码 //---------------------------------[头文件.命名空间包含部分]-------------- ...
- 【雕爷学编程】Arduino动手做(63)---TCS3200D颜色识别传感器
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...
- STM32驱动LCD实战
前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文章,本文将对STM32驱动LCD进行实战应用.LCD是深圳市拓普微科技开发有限公司的LMT028 ...
- STM32—驱动六轴MPU6050输出欧拉角
文章目录 一.MPU6050介绍 1.MPU6050与陀螺仪.加速度计的关系: 2.整体概括 3.引脚说明 4.基本配置及相关寄存器 电源管理寄存器1 陀螺仪配置寄存器 加速度计配置寄存器 FIFO使 ...
- 基于OpenCV实现对图片及视频中感兴趣区域颜色识别
基于OpenCV实现图片及视频中选定区域颜色识别 近期,需要实现检测摄像头中指定坐标区域内的主体颜色,通过查阅大量相关的内容,最终实现代码及效果如下,具体的实现步骤在代码中都详细注释,代码还可以进一步 ...
随机推荐
- 转:微信开发获取地理位置实例(java,非常详细,附工程源码)
微信开发获取地理位置实例(java,非常详细,附工程源码) 在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一 ...
- SDOI Day2
今天做了SDOI Day2 觉得自己萌萌哒= =题目真的有点水,一点编程复杂度都没有 T1:星际战争 描述:http://www.lydsy.com/JudgeOnline/problem.php?i ...
- index_merge引发的死锁排查
概述 前几天排查了一个死锁问题,最开始百思不得其解,因为发生死锁的两个事务是单语句事务,语句类型相同(where属性列相同,仅值不同),而且语句都走了相同的索引,但最终确实发生了死锁.通过定位排查发现 ...
- 多线程简介及GCD的使用
多线程简介: 对于任意一个iOS应用,程序运行起来后,默认会产生一个主线程(MainThread),主线程专门用来处理UIKit对象的操作,如界面的显示与更新.处理用户事件触发的操作等等.(记忆这点, ...
- 自定义view(二)
这里是自定义view(二),上一篇关于自定义view的一些基本知识,比如说自定义view的步骤.会涉及到哪些函数以及如何实现自定义属性,同时实现了一个很基础的自定义控件,一个自定义的计时器,需要看的人 ...
- 用ASP.NET创建网站
ASP.NET提供三种框架来创建web应用:WebForms,ASP.NET MVC和ASP.NET WebPages.这三种框架都是稳定成熟的,你可以用任何一种方式开发一个很棒的web应用.不管你选 ...
- 用DapperExtensions和反射来实现一个通用搜索
前言 搜索功能是一个很常用的功能,当然这个搜索不是指全文检索,是指网站的后台管理系统或ERP系统列表的搜索功能.常见做法一般就是在搜索栏上加上几个常用字段来搜索.代码可能一般这样实现 StringBu ...
- Mac下ssh连接远程服务器时自动断开问题
在mac下使用securecrt通过ssh连接远程服务器时,总会一段时间没有动作后,ssh被自动断开.在windows下用xmanager貌似没有遇到过这个问题. 在网上找了解决方法如下: 客户端配置 ...
- ajax 实现页面加载和内容的删除
ajax最大的好处就在于加载和删除的时候不会跳转页面,现在的网页大多都会选择用ajax来写,相比嵌入PHP代码来说减少了代码量,同时加载页面也会比较快, 下面是用ajax以数据库fruit表为例写的 ...
- 3360: [Usaco2004 Jan]算二十四
3360: [Usaco2004 Jan]算二十四 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6 Solved: 6[Submit][Statu ...