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++) 的相关文章

  • OpenCV自学笔记1:Pycharm + OpenCV3 + Python3 配置记录

    Pycharm 43 OpenCV3 43 Python3 配置记录 引言 xff1a OpenCV 43 Python是开发计算机视觉的利器 xff0c 由于项目的需要 xff0c 最近在Windows系统上配置了OpenCV 43 Py
  • opencv3/C++ 使用Tracker进行简单目标跟踪

    简介 MIL TrackerMIL 以在线方式训练分类器将对象与背景分离 多实例学习避免鲁棒跟踪的漂移问题 OLB TrackerBoosting 基于AdaBoost算法的在线实时对象跟踪 分类器在更新步骤中使用周围背景作为反例以避免漂移
  • 【OpenCV3.2】Detection of ArUco Markers 翻译OpenCV文档:ArUco Marker的检测

    这个其实是翻译的opencv的官方文档的aruco部分 https docs opencv org 3 1 0 d5 dae tutorial aruco detection html 视觉降落的二维码检测用到这里面 摘自 xff1a ht
  • ubuntu16.04+cuda8.0+cudnn+opencv3.0+caffe

    一 ubuntu16 04安装 开机F12进入BIOS的设备启动菜单 xff0c 选择U盘启动 安装类型 xff0c 选择其他选项 xff0c 进行分区 Swap xff1a 逻辑分区 xff0c 20GB 空间起始位置 交换空间 boot
  • 树莓派3B+安装c++版本opencv3.4.1,配置开发环境以及注意事项

    树莓派3B 43 安装c 43 43 版本opencv3 4 1 xff0c 配置开发环境以及注意事项 树莓派3B 43 ubuntu mate系统的安装 树莓派 xff0c Raspberry Pi xff0c 是一个只有信用卡大小的微型
  • Ubuntu18:使用CMake-gui编译OpenCV3源码的详细过程

    目录 一 卸载原来的opencv 二 准备工作 三 编译过程 四 测试过程 由于之前安装的OpenCV4与我的代码有多处不兼容 xff0c 所以要重新装一个OpenCV3 xff0c 顺便记录一下过程吧 OpenCV版本 xff1a ope
  • Jetson Xavier NX 配置opencv3.4.5

    主要参考Jetson Xavier NX安装opencv3 x以及踩过的坑 xff0c 纪录下自己的错误 下载opencv3 4 5 链接 xff1a https pan baidu com s 17mASm87RNbgfmM 31vlxb
  • Ubuntu Anaconda 安装tensorflow及opencv3.2.0

    教程已更新 xff0c 请参照http blog csdn net yjy728 article details 78826447 一 安装Anaconda windows只支持python3 5 X xff0c ubuntu下直接下最新版
  • 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
  • 【OpenCV3.2】Detection of ArUco Markers

    姿态估计 xff08 Pose estimation xff09 在 计算机视觉 领域扮演着十分重要的角色 xff1a 机器人 导航 增强现实以及其它 这一过程的基础是找到现实世界和图像投影之间的对应点 这通常是很困难的一步 xff0c 因
  • 基于OpenCV3.0的车牌识别系统设计(二)--车牌提取

    写在前面的话 上一篇开篇博文写好之后找女朋友看了一下 xff0c 希望她提一点建设性建议 结果她很委婉的告诉我 xff0c 写的还行就是太表面了 xff0c 告诉我要注意细节的描述与具体的实现过程与原理等等 其实我只是想骗她看一下增加一下点
  • 【AI】Ubuntu14.04安装OpenCV3.2.0

    在ubuntu14 04系统上安装OpenCV3 2 0 环境要求 GCC 4 4 x or later CMake 2 8 7 or higher Git if failed you can replace it with git cor
  • ubuntu下安装OpenCV3.4.1及其contrib模块

    在github上找到两个文件下载并解压 xff0c 将contrib部分解压到OpenCV3 4 1文件夹中 然后执行安装 xff1a mkdir build amp amp cd build cmake D OPENCV EXTRA MO
  • opencv3颜色识别(C++)

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

    在open3 x的版本中 xff0c 图像特征提取的算法并未在源码中 xff0c 需要从OpenCV contrib 3 2编译安装 xff0c 下面就是记录一下编译安装的过程 下载 opencv contrib 3 2下载地址 编译 cm
  • 基于opencv3的本质矩阵(essential matrix)估计算例

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

    最近接了一个比较简单的图像处理的单子 花了一点时间随便写了一下 数据集客户没有是自己随便创建的 程序如下 Code creation time September 11 2021 Author PanBo Realize function
  • opencv3+python3.5成语填字游戏(一)印刷体汉字的分割

    首先这是一个成语填字游戏 大概就是一张成语填字游戏图片 通过opencv图像识别后转为矩阵 再通过解算法 解出答案 在显示到图片上 源代码 https github com mayue801 crossword puzzle idiom 本
  • opencv3+python3.5成语填字游戏(二)填字图片汉字提取和识别

    上一篇说的是汉字的分割 今天该实际填字图片的解析了 实际图片如下 这是一个10 10的方格 所以我们应该先提取100个小方格 然后在提取其中的汉字 用到的函数主要是python的opencv函数库里的findContours函数 用于找出图

随机推荐