OpenCV颜色识别

彩色模型

数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型。而HSV模型更符合人描述和解释颜色的方式,HSV的彩色描述对人来说是自然且非常直观的。

HSV模型

HSV模型中颜色的参数分别是:色调(H:hue),饱和度(S:saturation),亮度(V:value)。由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。

色调(H:hue):用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度(S:saturation):取值范围为0.0~1.0,值越大,颜色越饱和。
亮度(V:value):取值范围为0(黑色)~255(白色)。

RGB转HSV

设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 H SV 空间中的 (h, s, v) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, v ∈ [0,1] 是饱和度和亮度,计算为:

max=max(R,G,B)
min=min(R,G,B)
if R = max, H = (G-B)/(max-min)
if G = max, H = 2 + (B-R)/(max-min)
if B = max, H = 4 + (R-G)/(max-min) H = H * 60
if H < 0, H = H + 360 V=max(R,G,B)
S=(max-min)/max

OpenCV下有个函数可以直接将RGB模型转换为HSV模型,注意的是OpenCV中H∈ [0, 180), S ∈ [0, 255], V ∈ [0, 255]。我们知道H分量基本能表示一个物体的颜色,但是S和V的取值也要在一定范围内,因为S代表的是H所表示的那个颜色和白色的混合程度,也就说S越小,颜色越发白,也就是越浅;V代表的是H所表示的那个颜色和黑色的混合程度,也就说V越小,颜色越发黑。经过实验,识别蓝色的取值是 H在100到140,S和V都在90到255之间。一些基本的颜色H的取值可以如下设置:

Orange  0-22
Yellow 22- 38
Green 38-75
Blue 75-130
Violet 130-160
Red 160-179

OpenCV实现

首先我们读取一张图片或从视频读取一帧图像,用下面的函数转为HSV模型。

cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV);

然后我们对彩色图像做直方图均衡化

//因为我们读取的是彩色图,直方图均衡化需要在HSV空间做split(imgHSV, hsvSplit);equalizeHist(hsvSplit[2],hsvSplit[2]);merge(hsvSplit,imgHSV);

接着就是进行颜色检测,我们用void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);函数进行颜色检测,这个函数的作用就是检测src图像的每一个像素是不是在lowerb和upperb之间,如果是,这个像素就设置为255,并保存在dst图像中,否则为0。

inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); //Threshold the image

通过上面的函数我们就可以得到目标颜色的二值图像,接着我们先对二值图像进行开操作,删除一些零零星星的噪点,再使用闭操作,连接一些连通域,也就是删除一些目标区域的白色的洞。

//开操作 (去除一些噪点)Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);//闭操作 (连接一些连通域)morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);

整个代码实现:

#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"using namespace cv;
using namespace std;int main( int argc, char** argv ){VideoCapture cap(0); //capture the video from web camif ( !cap.isOpened() )  // if not success, exit program{cout << "Cannot open the web cam" << endl;return -1;}namedWindow("Control", CV_WINDOW_AUTOSIZE); //create a window called "Control"int iLowH = 100;int iHighH = 140;int iLowS = 90; int iHighS = 255;int iLowV = 90;int iHighV = 255;//Create trackbars in "Control" windowcvCreateTrackbar("LowH", "Control", &iLowH, 179); //Hue (0 - 179)cvCreateTrackbar("HighH", "Control", &iHighH, 179);cvCreateTrackbar("LowS", "Control", &iLowS, 255); //Saturation (0 - 255)cvCreateTrackbar("HighS", "Control", &iHighS, 255);cvCreateTrackbar("LowV", "Control", &iLowV, 255); //Value (0 - 255)cvCreateTrackbar("HighV", "Control", &iHighV, 255);while (true){Mat imgOriginal;bool bSuccess = cap.read(imgOriginal); // read a new frame from videoif (!bSuccess) //if not success, break loop{cout << "Cannot read a frame from video stream" << endl;break;}Mat imgHSV;vector<Mat> hsvSplit;cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); //Convert the captured frame from BGR to HSV//因为我们读取的是彩色图,直方图均衡化需要在HSV空间做split(imgHSV, hsvSplit);equalizeHist(hsvSplit[2],hsvSplit[2]);merge(hsvSplit,imgHSV);Mat imgThresholded;inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); //Threshold the image//开操作 (去除一些噪点)Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);//闭操作 (连接一些连通域)morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);imshow("Thresholded Image", imgThresholded); //show the thresholded imageimshow("Original", imgOriginal); //show the original imagechar key = (char) waitKey(300);if(key == 27)break;}return 0;}

实验结果图:

颜色识别的应用

经典的颜色识别的经典应用就是车牌定位了,因为中国的车牌无非就是蓝色和黄色,还有就是交通标志定位也是个应用。比如下面两张图片,有很明显的颜色区分。

原文参考:https://blog.csdn.net/zwhlxl/article/details/46381353

OpenCV颜色识别相关推荐

  1. opencv颜色识别思路

    一.Opencv颜色识别步骤: 调用手机摄像头 Opencv颜色处理 存储色块图像和位置信息 接下来主要介绍opencv颜色处理过程 二. Opencv图像处理思路 创建滑动条:用来调节阈值,识别出不 ...

  2. OpenCV颜色识别(所有颜色均可识别)

    OpenCV颜色识别实例(所有颜色均可识别) 本文中的颜色识别为红色,颜色阈值设置如下: lower_apple = np.array([0, 100, 100]) higher_apple = np ...

  3. opencv颜色识别python_opencv使用HSV颜色空间实现颜色识别

    一.颜色空间介绍 RGB 颜色空间是大家最熟悉的颜色空间,即三基色空间,任何一种颜色都可以由该三种 颜色混合而成.然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV(色调 Hue, ...

  4. android opencv颜色识别,opencv学习(2)-简单颜色识别并跟踪

    本次来我们用opencv来实现识别跟踪蓝色物体并返回位置坐标的功能. 该功能分为两部分,识别颜色,跟踪颜色. 要想实现颜色的识别,我们要打开摄像头,读取捕获的图像.将图像的颜色通道转化为HSV,设置选 ...

  5. opencv颜色识别_opencv-python污水颜色识别

    # -*- coding: utf-8 -*- """ 污水颜色识别 """import cv2 import numpy as npimg ...

  6. [OpenCV]颜色识别

    颜色识别作为电赛中图像处理方面最常用的算法,应用非常广泛. 处理的流程:预处理  ->滤波->  二值化  ->  (膨胀->  )腐蚀 ->  寻找轮廓 一.预处理 将 ...

  7. opencv颜色识别-红色

    前言 在进行opencv的颜色处理的时候,发现HSV通道进行阈值化的效果优于BGR通道,因此采用了HSV通道进行阈值划分,但是在识别红色时发现了一个问题,在opnecv中,HSV通道被划分为以下范围 ...

  8. opencv颜色识别并用二值化处理

     #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespac ...

  9. android opencv颜色识别,OpenCV学习——颜色识别的简单应用(一)

    第1步:获取到桌球台的图像信息 需要获取桌面固定区域的实时图像(这里为了方便,直接截取了一张图片) 第2步:识别出球杆和白球 创建滑条from cv2 import cv2 import numpy ...

最新文章

  1. jakarta-taglibs-standard-1.1.0查找下载
  2. BETA:由清华大学等多家研究机构联合提出的面向SSVEP-BCI应用程序的大型基准测试数据库...
  3. 浅析SQL Server在可序列化隔离级别下,防止幻读的范围锁的锁定问题
  4. Linux下文件的三个时间意义及用法
  5. CnForums国庆特别版
  6. java 抽象类语法_JAVA基础语法8--多态/抽象类/抽象方法
  7. 9008刷机怎么刷_OV快捷进入高通进9008或fastboot模式刷机解锁,和MTK关机解锁
  8. CentOS7开发环境搭建(1)
  9. 【Java】蒙提霍尔问题的概率原理及随机化模拟
  10. antdesign 地图_React 使用recharts实现散点地图的示例代码
  11. qpushbutton设置两个图标_宝马显示屏上的各种图标是啥意思,这里分享几个问的最多的!...
  12. Android开发笔记(二十九)使用SharedPreferences存取数据
  13. 13. jQuery - 设置内容和属性
  14. PAT 7-14 公路村村通
  15. Windows 下 docker 部署 gitlab ci
  16. iis10 asp 如何连接mdb_网站500内部服务器错误如何解决 - 最蜘蛛池
  17. define语句换行\后不能有空格
  18. android开发中悬浮窗被禁用,无权限开启悬浮窗的解决方案
  19. 主流集成控制系统:EPICS和TANGO
  20. x58服务器主板装win7系统,技嘉Z390主板重装win7方法|Z390主板Bios设置及安装win7图文教程...

热门文章

  1. JZOJ 3388. 【NOIP2013模拟】绿豆蛙的归宿
  2. 正则表达式 校验基础
  3. android屏幕共享mac,Mirror for Android TV
  4. iPhone开发初试锋芒 一个简单的iPhone播放器 --紫枫凝潇烟
  5. Adsafe 导致win10 中窗口错位
  6. 如何给网站安装SSL证书?
  7. 3ml乐谱制作工具_用于生产的ML基础结构工具(第1部分)
  8. 打造高效敏捷的研发独立团 (2009年培训心得)
  9. iOS 贪吃蛇单机版的实现
  10. 黑客独角兽_写作是产品设计师真正的独角兽技能