转载请注明出处: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摄像头颜色识别相关推荐

  1. Arduino驱动APDS-9960传感器颜色识别

    Arduino驱动APDS-9960传感器颜色识别 前言 特征: 原理图 颜色和ALS检测功能 主要参数 时序图 接线 驱动程序 实物图 实验结果 总结 前言 APDS-9960是一款集成 ALS.红 ...

  2. Android studio3.6.1+ opencv3.4.1进行摄像头颜色识别的调试过程

    Android studio3.6.1+ opencv3.4.1进行摄像头颜色识别的调试过程 本文过程建立在成功导入opencv3.4.1library并且成功运行打开摄像头的基础上的.在完成了验证并 ...

  3. 基于STM32的OV7725摄像头拍照实验

    平台:STM32ZET6(核心板)+ST-LINK/V2+SD卡+USB串口线+鹰眼OV7725摄像头(注意,为了减少摄像头连线的麻烦,建议初学者选取单片机时选用带有摄像头接口的板子) 工程介绍:需要 ...

  4. OpenMV4 H7 PLUS摄像头颜色识别

    使用OpenMV4 H7 PLUS摄像头进行红绿蓝三颜色的识别: 参考: 官网:https://book.openmv.cc 函数库:https://docs.singtown.com/micropy ...

  5. stm32驱动ov7670摄像头识别颜色并追踪

    最近在搞摄像头识别颜色并追踪,有了那么一点点成过,记录一下防止以后忘了! 先上两张成果图:有点模糊,凑合看. 大神地址:https://www.amobbs.com/thread-5499408-1- ...

  6. ”WinForm上位机+OV7670摄像头+STM32+蓝牙“图像采集系统(一)STM32驱动CMOS摄像头OV7670

    初衷:将摄像头放在防盗门猫眼位置,访客到来时,给访客拍个照,然后传到房主端显示. 现在只完成了蓝牙传输,和WinForm窗体显示,后面时间来得及的话会陆续完成WiFi传输,和手机端APK显示. 常规思 ...

  7. STM32 OV7725摄像头模块的颜色处理和简单物体识别(串口输出图片)

    目录 前言 一.摄像头采集数据流程 二.如何将图像显示到电脑上 三.图像二值化 1.什么是RGB? 2.RGB565转RGB888 I.RGB565和RGB888的区别 II.代码 3.RGB转HSL ...

  8. 基于Jetson Nano与STM32通信的颜色识别与伺服驱动器控制

    基于Jetson Nano与STM32通信的颜色识别与伺服驱动器控制 jetrson nano部分 颜色识别 串口通信 数据传输 完整代码 stm32 部分 数据解读 电机控制 主函数 电机加减速 硬 ...

  9. stm32f103ve驱动鹰眼ov7725摄像头

    最近,由于想要做摄像头巡线小车,所以就花了两个星期的时间写了一个OV7725的摄像头驱动. 主要器材:鹰眼OV7725摄像头.stm32f103vet6.LCD液晶屏(ILI9341) 在这里我不讲解 ...

最新文章

  1. How your face shapes your economic chances
  2. GIS基础软件及操作(十)
  3. Hello Blazor:(9)Source Generators生成导航菜单
  4. 分行打印列表python_#python版一行内容分行输出
  5. 那些遇到的position-fixed无效事件
  6. Python爬去知乎上问题下所有图片
  7. mysql varchar java_关于MySQL varchar类型最大值,原来一直都理解错了
  8. windows下修改tomcat的startup.bat脚本文件后台运行
  9. win10如何安装域名系统服务器地址,win10搭建dns解析服务器地址
  10. pat乙级相当于什么水平_雅思6分是什么水平?相当于英语几级
  11. 从“中国听”到“听中国”!全球化下的音乐产业 迈向5G时代
  12. 北京交通大学计算机学院篮球,院际杯篮球赛|男篮小组赛第四轮战报
  13. [原创]mac终端前面的计算机名怎么改??
  14. 南阳理工ACM 第71题
  15. 一文看懂Web后端开发
  16. python列表中字典指定value的中文按照首字母拼音排序,数字在后
  17. ICC2使用report_placement检查floorplan
  18. 激活函数Sigmoid
  19. Ajax 完整教程-(二)
  20. mongo如何删除数据后相应的删除空间和内存占用

热门文章

  1. html5 3d柱形,Highcharts 3D柱形图
  2. BootStrap-表格
  3. 用 Axure RP 9 设计百度搜索网页
  4. ubuntu开启TFTP服务和NFS服务
  5. 如何分辨on-policy和off-policy
  6. 沃尔玛将与乐天Kobo合开首家电子书商店,挑战亚马逊
  7. 金属材料领域模型与通用语言之钢铁加工——面向软件领域的简介
  8. 在Idea中修改项目名称
  9. rviz-Ros Wiki官网教程学习笔记(1)-用户指南
  10. 多媒体阅读软件ReadM(文字篇)-详解