STM32驱动OV7725摄像头颜色识别「建议收藏」

STM32驱动OV7725摄像头颜色识别「建议收藏」实验目的:使用stm32驱动OV7725摄像头进行图像实时采集,在tft屏幕上实时显示并识别图像中的特定颜色,在颜色的周围画上框。实验现象:我的工程代码链接:http://download.csdn.net/my程序移植自阿莫论坛某位大神的程序。链接:http://www.amobbs.com/thread-5499408-1-1.html?_dsign=85056954实现原理:

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

转载请注明出处:http://blog.csdn.net/hongbin_xuhttp://hongbin96.com/
文章链接:http://blog.csdn.net/hongbin_xu/article/details/54911339http://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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190393.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 全局路径规划:图搜索算法介绍4(RRT/RRT*)

    全局路径规划:图搜索算法介绍4(RRT/RRT*)本节介绍RRT/RRT*的算法:RRT的基本原理是:我们首先初始化我们的起点,接下来随机撒点,选出一个x_rand,在x_near和x_rand之间选择一个x_new,再在原有的已经存在的x中找到离这个点最近的点将这两个点连接起来,同时这个最近的点也会作为x_new的父节点。RRT算法的伪代码如下:对照着图,再看一次:首先我们随机生成一个点,x_rand然后再tree上面…

    2025年8月6日
    3
  • 为什么opencv安装成功但import cv2失败_python和opencv

    为什么opencv安装成功但import cv2失败_python和opencv遇到的问题:win10如何安装opencvpycharm中importcv2模块出现错误,找不到该模块处理经过:win10如何安装opencv自己的电脑上已经装有anaconda,下载地址为:https://www.anaconda.com/download/,像numpy等包已经伴随anaconda安装到电脑上了,只需要再安装opencv就行。使用pipinstal…

    2022年8月27日
    6
  • 复试–矩阵行列对角和

    复试–矩阵行列对角和

    2021年5月19日
    156
  • python如何设置窗口背景色为白色_pycharm怎么将背景颜色设置成白色?「建议收藏」

    python如何设置窗口背景色为白色_pycharm怎么将背景颜色设置成白色?「建议收藏」方法:1、在pycharm中,点击顶部的“文件”选项;2、点击“设置”按钮,进入设置页面;3、点击“编辑器”选项,再点击“颜色&字体”选项;4、点击“控制台的颜色”选项,在右侧的“scheme”菜单中,选择“default”选项,点击确定即可。pycharm背景颜色设置成白色的方法1、如果没有安装pycharm可以先进行安装,安装完成之后我们点击桌面的pycharm图标进入首页。2、进入之…

    2022年8月28日
    4
  • acwing-1142. 繁忙的都市[通俗易懂]

    acwing-1142. 繁忙的都市[通俗易懂]城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造。城市C的道路是这样分布的:城市中有 n 个交叉路口,编号是 1∼n,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路相连接。这些道路是 双向 的,且把所有的交叉路口直接或间接的连接起来了。每条道路都有一个分值,分值越小表示这个道路越繁忙,越需要进行改造。但是市政府的资金有限,市长希望进行改造的道路越少越好,于是他提出下面的要求:1.改造的那些道路能够把所有的交叉路口直接或间接的连通起来。2.在满足

    2022年8月9日
    12
  • CICD – docker私有仓库

    CICD – docker私有仓库1、创建私有仓库dockerpullregistrydockerrun-d-v/opt/registory:/var/lib/registory-p5000:5000–restart=always–nameregistryregistry2、查看私有仓库curlhttp://47.99.211.128:5000/v2/_catalog#域名解析后…

    2022年5月10日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号