基于Opencv实现颜色识别

彩色模型  

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

HSV模型

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

(1)色调(H:hue):用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

(2)饱和度(S:saturation):取值范围为0.0~1.0,值越大,颜色越饱和。

(3)亮度(V:value):取值范围为0(黑色)~255(白色)

RGB转成HSV

设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSV 空间中的 (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

具体实现

(1) 读取一张图片

cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV);

(2)将彩色图像均衡化

split(imgHSV, hsvSplit);

equalizeHist(hsvSplit[2],hsvSplit[2]);

merge(hsvSplit,imgHSV);

(3)检测颜色

inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);

(4)进行开操作和闭操作,去除噪声的影响。

Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));

morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);

morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);

#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>

using namespace cv;
using namespace std;

//入口主函数
int main(int argc, char** argv)
{
 //打开摄像头,从摄像头获取图像
 VideoCapture cap(0);
 if (!cap.isOpened())
 {
 cout << "Cannot open the web cam"<<endl;
 return -1;
 }
 //创建窗口
 namedWindow("Control",CV_WINDOW_AUTOSIZE);

 int iLowH = 100;
 int iHighH = 140;

 int iLowS = 90;
 int iHighS = 255;

 int iLowV = 90;
 int iHighV = 255;
 //创建进度条
 cvCreateTrackbar("LowH","Control",&iLowH,179);
 cvCreateTrackbar("HighH", "Control", &iHighH,179);

 cvCreateTrackbar("LowS", "Control", &iLowS,255);
 cvCreateTrackbar("Highs", "Control", &iHighS,255);

 cvCreateTrackbar("LowV", "Control", &iLowV,255);
 cvCreateTrackbar("HighV", "Control", &iHighV,255);
 //while循环加载图片
 while (true)
 {
 Mat imgOriginal;
 bool bSuccess = cap.read(imgOriginal);

 if (!bSuccess)
 {
  cout << "Cannot read a frame from video stream" << endl;
  break;
 }
 //
 Mat imgHSV;
 vector<Mat> hsvSplit;
 cvtColor(imgOriginal,imgHSV,COLOR_BGR2HSV);

 //转化成直方图均衡化
 split(imgHSV,hsvSplit);
 equalizeHist(hsvSplit[2],hsvSplit[2]);
 merge(hsvSplit,imgHSV);
 Mat imgThresholded;
 //确定颜色显示的范围
 inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS,iHighV),imgThresholded);
 //去除噪点
 Mat element = getStructuringElement(MORPH_RECT,Size(5,5));
 morphologyEx(imgThresholded,imgThresholded,MORPH_OPEN,element);
   //连接连通域
 morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);
 imshow("Thresholded Image",imgThresholded);
 imshow("Original",imgOriginal);
 //等待时间
 char Key = (char)waitKey(300);
 if (Key==27)
 {
  break;
 }
 }
 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • opencv摄像头捕获识别颜色

    本文实例为大家分享了opencv摄像头捕获识别颜色的具体代码,供大家参考,具体内容如下 #include "highgui.h" #include "iostream" using namespace std; int main() { CvCapture* pCap = cvCreateCameraCapture(1 );//这里-1也可以,不过我的电脑装的有CyberLink YouCam软件, int flag=0; //OpenCV会默认调用该摄像头,而不调

  • OpenCV HSV颜色识别及HSV基本颜色分量范围

    一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出). H:  0 - 180 S:  0 - 255 V:  0 - 255 此处把部分红色归为紫色范围: 目前在计算机视觉领域存在着较多类型的颜色空间(color space).HSL和HSV是两种最常见的圆柱坐标表示的颜色模型,它重新影射了RGB模型,从而能够视觉上比RGB模型更具有视觉直观性. HSV颜色空间  HSV(hu

  • 基于Opencv实现颜色识别

    彩色模型   数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型.而HSV模型更符合人描述和解释颜色的方式,HSV的彩色描述对人来说是自然且非常直观的. HSV模型 HSV模型中颜色的参数分别是:色调(H:hue),饱和度(S:saturation),亮度(V:value).由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model). (1

  • python基于opencv实现人脸识别

    将opencv中haarcascade_frontalface_default.xml文件下载到本地,我们调用它辅助进行人脸识别. 识别图像中的人脸 #coding:utf-8 import cv2 as cv # 读取原始图像 img = cv.imread('face.png') # 调用熟悉的人脸分类器 识别特征类型 # 人脸 - haarcascade_frontalface_default.xml # 人眼 - haarcascade_eye.xml # 微笑 - haarcascad

  • python基于OpenCV模板匹配识别图片中的数字

    前言 本博客主要实现利用OpenCV的模板匹配识别图像中的数字,然后把识别出来的数字输出到txt文件中,如果识别失败则输出"读取失败". 操作环境: OpenCV - 4.1.0 Python 3.8.1 程序目标 单个数字模板:(这些单个模板是我自己直接从图片上截取下来的) 要处理的图片: 终端输出: 文本输出: 思路讲解 代码讲解 首先定义两个会用到的函数 第一个是显示图片的函数,这样的话在显示图片的时候就比较方便了 def cv_show(name, img): cv2.imsh

  • python+opencv实现文字颜色识别与标定功能

    最近接了一个比较简单的图像处理的单子,花了一点时间随便写了一下: 数据集客户没有是自己随便创建的: 程序如下: """ Code creation time:September 11, 2021 Author:PanBo Realize function:It mainly realizes the recognition and calibration of fonts with different colors """ import nump

  • 基于opencv实现视频中的颜色识别功能

    目录 颜色识别的原理 opencv中的颜色模型 颜色识别的实现(c++) 颜色识别的原理 opencv中的颜色模型 RGB RGB具有三个通道其,分别表示红色通道®,绿色通道(G),蓝色通道(B),3个通道在opencv中的取值均为0~255,它的颜色由3个通道的取值来共同决定,因此如果使用RGB图像来进行颜色的识别,会丢失很多的颜色. HSV HSV具有三个通道,其分别表示色调(H),饱和度(S),亮度(V),3个通道在opencv中的取值分别如下: H:0~180 S:0~255 V:0~2

  • Python基于OpenCV库Adaboost实现人脸识别功能详解

    本文实例讲述了Python基于OpenCV库Adaboost实现人脸识别功能.分享给大家供大家参考,具体如下: 以前用Matlab写神经网络的面部眼镜识别算法,研究算法逻辑,采集大量训练数据,迭代,计算各感知器的系数...相当之麻烦~而现在运用调用pythonOpenCV库Adaboost算法,无需知道算法逻辑,无需进行模型训练,人脸识别变得相当之简单了. 需要用到的库是opencv(open source computer vision),下载安装方式如下: 使用pip install num

  • Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

    可以直接跳到最后整体代码看一看是不是很少的代码!!!! 思路: 1. 数据的整合 2. 图片的灰度转化 3. 图片的二值转化 4. 图片的轮廓识别 5. 得到图片的顶点数 6. 依据顶点数判断图像形状 一.原数据的展示 图片文件共36个文件夹,每个文件夹有100张图片,共3600张图片. 每一个文件夹里都有形同此类的图形 二.数据的整合 对于多个文件夹,分析起来很不方便,所有决定将其都放在一个文件夹下进行分析,在python中具体实现如下: 本次需要的包 import cv2 import os

  • Python基于Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简单几句就说清,所以本文只作基本算法的科普向. 看到一篇博客是介绍这个,但他用的是PIL中的Image实现的,感觉比较麻烦,于是利用Opencv库进行了更简洁化的实现. 相关背景 要识别两张相似图像,我们从感性上来谈是怎么样的一个过程?首先我们会区分这两张相片的类型,例如是风景照,还是人物照.风景照中

  • 基于OpenCV 差分法实现绿叶识别

    目录 实现原理 功能函数代码 C++测试代码 实现原理 物体识别是图像处理学在现实生活中较多的应用之一,目前最为流行的就是运用AI.机器学习等技术结合图像处理学,大量训练数据集,以实现智能且精确的识别.说到人工智能,很多人可能觉得它非常深奥和复杂,其实说白了它最底层的识别逻辑还是基于普通的图像分析,像特征提取.轮廓分析.比对分析等等,再在庞大的数据集中按照相似程度,分析出一个最可能的结果. 本文提供了一种相对简单的思路来实现绿叶识别,适合初学图像处理的新人研究参考.该方法为差分法:首先对图像进行

随机推荐