opencv3颜色识别(C++)

2023-05-16

文章目录

  • opencv3颜色识别(C++)
    • 目标
    • 思路
      • 1. 读取图像
      • 2. 对比度调整(直方图均衡)
      • 3.RGB颜色分类
      • 4.形态学去噪声
    • 代码
    • 结果
    • 参考

opencv3颜色识别(C++)

目标

给定一幅图像,可以是读取指定文件或者从摄像机获取,识别图像中的颜色。这里我们只识别8种颜色,包括黑、红、绿、黄、蓝、紫、靛、白。这8种颜色是RGB颜色空间中位于8个顶点的颜色。

思路

1. 读取图像

读取摄像机的一帧

VideoCapture cap(0); //capture the video from web cam
	if (!cap.isOpened())  // if not success, exit program
	{
		cout << "Cannot open the web cam" << endl;
		return -1;
	}
Mat imgOriginal;
		bool bSuccess = cap.read(imgOriginal); // read a new frame from video
		if (!bSuccess) //if not success, break loop
		{
			cout << "Cannot read a frame from video stream" << endl;
			break;
		}

读取指定路径的图片

Mat imgOriginal = imread("1.jpg");

2. 对比度调整(直方图均衡)

  • 这一步是可选步骤,根据情况选择是否使用。
  • 类似于灰度图像使用直方图均衡调整对比度。根据冈萨雷斯的书,对于彩色图像,一般不建议在RGB空间中分别对三种通道进行直方图均衡,因为这样可能会引入一些特殊的颜色。一般的做法是将RGB空间转换到HSI空间或者HSV空间。然后对强度分量或者明度分量进行直方图均衡。关于这三种颜色空间的区别和联系可以参考博客RGB、HSV、HSI颜色空间。
  • 直方图均衡完成以后再转回值RGB颜色空间。
vector<Mat> hsvSplit;   						//创建向量容器,存放HSV的三通道数据
cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); 	//Convert the captured frame from BGR to HSV
split(imgHSV, hsvSplit);						//分类原图像的HSV三通道
equalizeHist(hsvSplit[2], hsvSplit[2]);   	 	//对HSV的亮度通道进行直方图均衡
merge(hsvSplit, imgHSV);				   		//合并三种通道
cvtColor(imgHSV, imgBGR, COLOR_HSV2BGR);    	//将HSV空间转回至RGB空间,为接下来的颜色识别做准备

3.RGB颜色分类

  • 将RGB颜色立方体分解为等大的8个小正方体,判断输入的RGB颜色值属于哪一个小块,则该RGB的颜色就是该小块的颜色。8个小正方体的颜色分别对应上述的8种颜色。
  • 注意opencv中图像的彩色通道顺序为BGR,而不是RGB。
  • 8种颜色BGR值分别为
颜色BGR
黑色0 0 0
红色0 0 255
绿色0 255 0
黄色0 255 255
蓝色255 0 0
紫色255 0 255
靛色255 255 0
白色255 255 255
  • 若输入的BRG为(x,y,z),则分别对三个变量与127作比较,确定其属于哪一个小块。
Mat imgThresholded;
int ctrl = 0;       //该变量用于控制识别何种颜色
switch(ctrl)
		{
		case 0:
			{
				inRange(imgBGR, Scalar(128, 0, 0), Scalar(255, 127, 127), imgThresholded); //蓝色  
				//这个函数将BGR图像中满足在(128, 0, 0)与(255, 127, 127)范围内的像素点选出来,并将该范围内的像素值赋值为白色,
				//其他区域赋值为黑色,并将这个二值图像存入 imgThresholded。
				break;
			}
		case 1:
			{
				inRange(imgBGR, Scalar(128, 128, 128), Scalar(255, 255, 255), imgThresholded); //白色
				break;
			}
		case 2:
			{
				inRange(imgBGR, Scalar(128, 128, 0), Scalar(255, 255, 127), imgThresholded); //靛色
				break;
			}
		case 3:
			{
				inRange(imgBGR, Scalar(128, 0, 128), Scalar(255, 127, 255), imgThresholded); //紫色
				break;
			}
		case 4:
			{
				inRange(imgBGR, Scalar(0, 128, 128), Scalar(127, 255, 255), imgThresholded); //黄色
				break;
			}
		case 5:
			{
				inRange(imgBGR, Scalar(0, 128, 0), Scalar(127, 255, 127), imgThresholded); //绿色
				break;
			}
		case 6:
			{
				inRange(imgBGR, Scalar(0, 0, 128), Scalar(127, 127, 255), imgThresholded); //红色
				break;
			}
		case 7:
			{
				inRange(imgBGR, Scalar(0, 0, 0), Scalar(127, 127, 127), imgThresholded); //黑色
				break;
			}
		}

4.形态学去噪声

  • 使用开操作和闭操作去除二值化图像中的噪声。原理可以参考冈萨雷斯的书。
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 cam
	
	if (!cap.isOpened())  // if not success, exit program
	{
		cout << "Cannot open the web cam" << endl;
		return -1;
	}

	namedWindow("control", 1);
	int ctrl = 0;
	createTrackbar("ctrl", "control", &ctrl, 7);

	while (true)
	{
		Mat imgOriginal;

		bool bSuccess = cap.read(imgOriginal); // read a new frame from video
		if (!bSuccess) //if not success, break loop
		{
			cout << "Cannot read a frame from video stream" << endl;
			break;
		}

		// imgOriginal = imread("4.jpg");

		Mat imgHSV, imgBGR;
		Mat imgThresholded;

		if(0)
		{
			vector<Mat> hsvSplit;   //创建向量容器,存放HSV的三通道数据
			cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); //Convert the captured frame from BGR to HSV
			split(imgHSV, hsvSplit);			//分类原图像的HSV三通道
			equalizeHist(hsvSplit[2], hsvSplit[2]);    //对HSV的亮度通道进行直方图均衡
			merge(hsvSplit, imgHSV);				   //合并三种通道
			cvtColor(imgHSV, imgBGR, COLOR_HSV2BGR);    //将HSV空间转回至RGB空间,为接下来的颜色识别做准备
		}
		else
		{
			imgBGR = imgOriginal.clone();
		}



		switch(ctrl)
		{
		case 0:
			{
				inRange(imgBGR, Scalar(128, 0, 0), Scalar(255, 127, 127), imgThresholded); //蓝色
				break;
			}
		case 1:
			{
				inRange(imgBGR, Scalar(128, 128, 128), Scalar(255, 255, 255), imgThresholded); //白色
				break;
			}
		case 2:
			{
				inRange(imgBGR, Scalar(128, 128, 0), Scalar(255, 255, 127), imgThresholded); //靛色
				break;
			}
		case 3:
			{
				inRange(imgBGR, Scalar(128, 0, 128), Scalar(255, 127, 255), imgThresholded); //紫色
				break;
			}
		case 4:
			{
				inRange(imgBGR, Scalar(0, 128, 128), Scalar(127, 255, 255), imgThresholded); //黄色
				break;
			}
		case 5:
			{
				inRange(imgBGR, Scalar(0, 128, 0), Scalar(127, 255, 127), imgThresholded); //绿色
				break;
			}
		case 6:
			{
				inRange(imgBGR, Scalar(0, 0, 128), Scalar(127, 127, 255), imgThresholded); //红色
				break;
			}
		case 7:
			{
				inRange(imgBGR, Scalar(0, 0, 0), Scalar(127, 127, 127), imgThresholded); //黑色
				break;
			}
		}
																		
		imshow("形态学去噪声前", 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); //show the thresholded image
		imshow("直方图均衡以后", imgBGR);
		imshow("Original", imgOriginal); //show the original image

		char key = (char)waitKey(300);
		if (key == 27)
			break;
	}

	return 0;

}

结果

  • 通过滑动条控制识别和种颜色
    在这里插入图片描述
  • 对该图像进行颜色识别
    在这里插入图片描述
  • 识别蓝色
    在这里插入图片描述
  • 识别红色
    在这里插入图片描述

参考

https://blog.csdn.net/zhenguo26/article/details/82803241

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv3颜色识别(C++) 的相关文章

  • opencv3颜色识别(C++)

    文章目录 opencv3颜色识别 C 43 43 目标思路1 读取图像2 对比度调整 xff08 直方图均衡 xff09 3 RGB颜色分类4 形态学去噪声 代码结果参考 opencv3颜色识别 C 43 43 目标 给定一幅图像 xff0
  • OpenCV3.2+VS2013+Tesseract3.02.02配置

    分享一下Tesseract3 02 02版本在Windows下的配置 我的环境VS2013 43 win8 64bit 43 OpenCV3 2 需要下载 xff1a tesseract orc setup 3 02 02 exe和tess
  • 树莓派3B+安装c++版本opencv3.4.1,配置开发环境以及注意事项

    树莓派3B 43 安装c 43 43 版本opencv3 4 1 xff0c 配置开发环境以及注意事项 树莓派3B 43 ubuntu mate系统的安装 树莓派 xff0c Raspberry Pi xff0c 是一个只有信用卡大小的微型
  • Jetson Xavier NX 配置opencv3.4.5

    主要参考Jetson Xavier NX安装opencv3 x以及踩过的坑 xff0c 纪录下自己的错误 下载opencv3 4 5 链接 xff1a https pan baidu com s 17mASm87RNbgfmM 31vlxb
  • ubuntu18.04依赖于OpenCV3.4.13版本的cv_bridge使用

    前言 ROS原装的cv bridge位于 opt ros melodic include cv bridge 它依赖于OpenCV 3 2 在当前ROS包中为了使用基于新的OpenCV 3 4 10的cv bridge xff0c 网上有博
  • opencv3.2安装opencv_contrib

    opencv3 2 增加opencv contrib组件 之前在ubuntu16 04下安装caffe和opencv3 2 xff0c 由于需要需要使用opencv contrib组件 xff0c 在安装中遇到一些问题 在已安装好openc
  • OpenCV颜色识别

    彩色模型 数字图像处理中常用的采用模型是RGB xff08 红 xff0c 绿 xff0c 蓝 xff09 模型和HSV xff08 色调 xff0c 饱和度 xff0c 亮度 xff09 xff0c RGB广泛应用于彩色监视器和彩色视频摄
  • 安卓java c++ opencv3.4 视频实时传输

    安卓java c 43 43 视频实时传输 要做一个视频实时传输并别图像追踪识别的项目 本项目先采用TCP建立链接 xff0c 然后在用UDP实时传输 xff0c 用压缩图像帧内为JPEG的方式 xff0c 加快传输速率 下图是转的 我采用
  • ubuntu 下的opencv3的下载与实现简单功能

    看自己用户的名字 whoami 例子1 xff1a include lt stdio h gt include lt opencv2 opencv hpp gt using namespace std using namespace cv
  • 配置opencv3.1+caffe

    为了配置caffe做reid这是官方的入口 caffe reid https github com zlmzju caffe tree reid caffe install http caffe berkeleyvision org ins
  • ubuntu18.04安装opencv3.2.0

    1 下载所需安装包 opencv 3 2 0下载地址 xff1a opencv 3 2 0 opencv contrib 3 2 0下载地址 xff1a opencv contrib 3 2 0 2 安装所需依赖 sudo apt get
  • 【OpenCV3.2】Detection of ArUco Markers

    姿态估计 xff08 Pose estimation xff09 在 计算机视觉 领域扮演着十分重要的角色 xff1a 机器人 导航 增强现实以及其它 这一过程的基础是找到现实世界和图像投影之间的对应点 这通常是很困难的一步 xff0c 因
  • Opencv3.4.1+contrib3.4.1+vs2017配置(主要解决了编译的时候找不到.lib文件的问题)

    一般出现找不到 lib库文件都是环境变量配置没弄好或者是依赖项或包含库没设置好 xff0c 下面是我的步骤 xff0c 大家可以参考以下 xff08 大家一定要注意环境变量哪里的bin别弄成lib xff0c 2天不断重装的血泪教训 xff
  • 基于OpenCV3.0的车牌识别系统设计(二)--车牌提取

    写在前面的话 上一篇开篇博文写好之后找女朋友看了一下 xff0c 希望她提一点建设性建议 结果她很委婉的告诉我 xff0c 写的还行就是太表面了 xff0c 告诉我要注意细节的描述与具体的实现过程与原理等等 其实我只是想骗她看一下增加一下点
  • 【VINS-Mono】RealsenseD435i运行VINS-Mono,在ubuntu18.04和opencv3和cv_bridge的报错记录

    VINS Mono xff08 A Robust and Versatile Monocular Visual Inertial State Estimator xff09 https github com HKUST Aerial Rob
  • ubuntu16.04安装opencv3.4

    参考blog https blog csdn net u013066730 article details 79411767 直接进行 完全没问题 sudo apt get install build essential libgtk2 0
  • opencv3颜色识别(C++)

    文章目录 opencv3颜色识别 C 43 43 目标思路1 读取图像2 对比度调整 xff08 直方图均衡 xff09 3 RGB颜色分类4 形态学去噪声 代码结果参考 opencv3颜色识别 C 43 43 目标 给定一幅图像 xff0
  • 基于opencv3的本质矩阵(essential matrix)估计算例

    至今opencv3面世快两年了 五一期间抽空看了下新增的几个关于双目视觉标定算法的使用 关于双目的标定有一类方法是基于本质矩阵 Essential matrix 的标定方法 本质方程与基础方程都是刻画双目视觉极几何关系的两个方程 只不过它们
  • ubuntu opencv3 安装

    安装完 ubuntu 系统之后立马安装此库 否则后面安装的时候会造成软件包冲突 apt get libopencv dev 在 usr include opencv2 目录下有所有的头文件 opencv2 modules hpp 文件夹里有
  • 分层聚类算法

    分层聚类算法 转载 看到很多地方都讲到分层聚类法 这到底是什么东东 今天来研究一下 分层聚类法是聚类算法的一种 聚类算法是数据挖掘的核心技术 把数据库中的对象分类是数据挖掘的基本操作 其准则是使属于同一类的个体间距离尽可能小 而不同类个体间

随机推荐