STM32驱动OV7725摄像头颜色识别
转载请注明出处:http://blog.csdn.net/hongbin_xu 或 http://hongbin96.com/
文章链接:http://blog.csdn.net/hongbin_xu/article/details/54911339 或 http://hongbin96.com/109
实验目的:
使用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摄像头颜色识别相关推荐
- Arduino驱动APDS-9960传感器颜色识别
Arduino驱动APDS-9960传感器颜色识别 前言 特征: 原理图 颜色和ALS检测功能 主要参数 时序图 接线 驱动程序 实物图 实验结果 总结 前言 APDS-9960是一款集成 ALS.红 ...
- Android studio3.6.1+ opencv3.4.1进行摄像头颜色识别的调试过程
Android studio3.6.1+ opencv3.4.1进行摄像头颜色识别的调试过程 本文过程建立在成功导入opencv3.4.1library并且成功运行打开摄像头的基础上的.在完成了验证并 ...
- 基于STM32的OV7725摄像头拍照实验
平台:STM32ZET6(核心板)+ST-LINK/V2+SD卡+USB串口线+鹰眼OV7725摄像头(注意,为了减少摄像头连线的麻烦,建议初学者选取单片机时选用带有摄像头接口的板子) 工程介绍:需要 ...
- OpenMV4 H7 PLUS摄像头颜色识别
使用OpenMV4 H7 PLUS摄像头进行红绿蓝三颜色的识别: 参考: 官网:https://book.openmv.cc 函数库:https://docs.singtown.com/micropy ...
- stm32驱动ov7670摄像头识别颜色并追踪
最近在搞摄像头识别颜色并追踪,有了那么一点点成过,记录一下防止以后忘了! 先上两张成果图:有点模糊,凑合看. 大神地址:https://www.amobbs.com/thread-5499408-1- ...
- ”WinForm上位机+OV7670摄像头+STM32+蓝牙“图像采集系统(一)STM32驱动CMOS摄像头OV7670
初衷:将摄像头放在防盗门猫眼位置,访客到来时,给访客拍个照,然后传到房主端显示. 现在只完成了蓝牙传输,和WinForm窗体显示,后面时间来得及的话会陆续完成WiFi传输,和手机端APK显示. 常规思 ...
- STM32 OV7725摄像头模块的颜色处理和简单物体识别(串口输出图片)
目录 前言 一.摄像头采集数据流程 二.如何将图像显示到电脑上 三.图像二值化 1.什么是RGB? 2.RGB565转RGB888 I.RGB565和RGB888的区别 II.代码 3.RGB转HSL ...
- 基于Jetson Nano与STM32通信的颜色识别与伺服驱动器控制
基于Jetson Nano与STM32通信的颜色识别与伺服驱动器控制 jetrson nano部分 颜色识别 串口通信 数据传输 完整代码 stm32 部分 数据解读 电机控制 主函数 电机加减速 硬 ...
- stm32f103ve驱动鹰眼ov7725摄像头
最近,由于想要做摄像头巡线小车,所以就花了两个星期的时间写了一个OV7725的摄像头驱动. 主要器材:鹰眼OV7725摄像头.stm32f103vet6.LCD液晶屏(ILI9341) 在这里我不讲解 ...
最新文章
- How your face shapes your economic chances
- GIS基础软件及操作(十)
- Hello Blazor:(9)Source Generators生成导航菜单
- 分行打印列表python_#python版一行内容分行输出
- 那些遇到的position-fixed无效事件
- Python爬去知乎上问题下所有图片
- mysql varchar java_关于MySQL varchar类型最大值,原来一直都理解错了
- windows下修改tomcat的startup.bat脚本文件后台运行
- win10如何安装域名系统服务器地址,win10搭建dns解析服务器地址
- pat乙级相当于什么水平_雅思6分是什么水平?相当于英语几级
- 从“中国听”到“听中国”!全球化下的音乐产业 迈向5G时代
- 北京交通大学计算机学院篮球,院际杯篮球赛|男篮小组赛第四轮战报
- [原创]mac终端前面的计算机名怎么改??
- 南阳理工ACM 第71题
- 一文看懂Web后端开发
- python列表中字典指定value的中文按照首字母拼音排序,数字在后
- ICC2使用report_placement检查floorplan
- 激活函数Sigmoid
- Ajax 完整教程-(二)
- mongo如何删除数据后相应的删除空间和内存占用