看到这个老哥写了一个类,但是没有demo,就使用这个类写了个例子

【OpenCV】OpenCV创建颜色识别类-class ColorDetector_Taily老段的专栏-CSDN博客

头文件 ColorDetector.h

#pragma once
#ifndef COLORDETECTOR_H_
#define COLORDETECTOR_H_#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <string>class ColorDetector {
private:int minDist;cv::Vec3b target;cv::Mat result;cv::Mat image;ColorDetector();static ColorDetector* singleton;public:static ColorDetector* getInstance();static void destory();void setColorDistanceThreshold(int);int getColorDistanceThreshold() const;void setTargetColor(unsigned char, unsigned char, unsigned char);void setTargetColor(cv::Vec3b);cv::Vec3b getTargetColor() const;void process();int getDistance(const cv::Vec3b&) const;cv::Mat getResult() const;bool setInputImage(std::string);cv::Mat getInputImage() const;
};#endif /* COLORDETECTOR_H_ */

ColorDetector.cpp

#include "ColorDetector.h"ColorDetector* ColorDetector::singleton = NULL;ColorDetector::ColorDetector() :minDist(500) {target[0] = target[1] = target[2] = 0;
}ColorDetector* ColorDetector::getInstance() {if (singleton == NULL) {singleton = new ColorDetector;}return singleton;
}void ColorDetector::destory() {if (singleton != 0) {delete singleton;}singleton = 0;
}void ColorDetector::setColorDistanceThreshold(int distance) {if (distance < 0) {distance = 0;}minDist = distance;
}int ColorDetector::getColorDistanceThreshold() const {return minDist;
}void ColorDetector::setTargetColor(unsigned char red,unsigned char green, unsigned char blue) {target[2] = red;target[1] = green;target[0] = blue;
}void ColorDetector::setTargetColor(cv::Vec3b color) {target = color;
}cv::Vec3b ColorDetector::getTargetColor() const {return target;
}int ColorDetector::getDistance(const cv::Vec3b& color) const {return abs(color[0] - target[0]) + abs(color[1] - target[1]) + abs(color[2] - target[2]);
}void ColorDetector::process() {result.create(image.rows, image.cols, CV_8U);cv::Mat_<cv::Vec3b>::const_iterator it = image.begin<cv::Vec3b>();cv::Mat_<cv::Vec3b>::const_iterator itend = image.end<cv::Vec3b>();cv::Mat_<uchar>::iterator itout = result.begin<uchar>();for (; it != itend; ++it, ++itout) {if (getDistance(*it) < minDist) {*itout = 255;}else {*itout = 0;}}
}cv::Mat ColorDetector::getResult() const {return result;
}bool ColorDetector::setInputImage(std::string filename) {image = cv::imread(filename);if (!image.data) {return false;}return true;
}cv::Mat ColorDetector::getInputImage() const {return image;
}

就是给定一个颜色,然后判断图像中的颜色与给定颜色的误差:三个通道差值的和,然后二值化

下面是我使用这个类的例子:(类把构造函数私有化了)

#include <windows.h>
#include<iostream>
#include <opencv2/opencv.hpp>
#include"ColorDetector.h"
using namespace cv;
using namespace std;void onchange(int pos, void* data);
void onchange_r(int pos, void* data);
void onchange_g(int pos, void* data);
void onchange_b(int pos, void* data);
int main()
{ColorDetector* CD = ColorDetector::getInstance();CD->setInputImage("103.jpeg");//Mat img = CD->getInputImage();CD->setTargetColor(0, 0, 255);CD->setColorDistanceThreshold(10);CD->process();Mat out = CD->getResult();namedWindow("窗口", CV_WINDOW_NORMAL);resizeWindow("窗口", 600, 600);imshow("窗口", out);int tb_value = CD->getColorDistanceThreshold();Vec3b RGB_value = CD->getTargetColor();int R_value = (int)RGB_value[0];int G_value = (int)RGB_value[1];int B_value = (int)RGB_value[2];namedWindow("窗口1");resizeWindow("窗口1", 600, 300);createTrackbar("阈值", "窗口1", &tb_value, 1000, onchange,CD);createTrackbar("R", "窗口1", &R_value, 255, onchange_r, CD);createTrackbar("G", "窗口1", &G_value, 255, onchange_g, CD);createTrackbar("B", "窗口1", &B_value, 255, onchange_b, CD);waitKey();return 0;
}
void onchange(int pos, void* data)
{ColorDetector* CD = (ColorDetector*)data;CD->setColorDistanceThreshold(pos);CD->process();imshow("窗口", CD->getResult());
}
void onchange_r(int pos, void* data)
{ColorDetector* CD = (ColorDetector*)data;Vec3b RGB_value = CD->getTargetColor();RGB_value[2] = (uchar)pos;CD->setTargetColor(RGB_value);CD->process();imshow("窗口", CD->getResult());
}
void onchange_g(int pos, void* data)
{ColorDetector* CD = (ColorDetector*)data;Vec3b RGB_value = CD->getTargetColor();RGB_value[1] = (uchar)pos;CD->setTargetColor(RGB_value);CD->process();imshow("窗口", CD->getResult());
}
void onchange_b(int pos, void* data)
{ColorDetector* CD = (ColorDetector*)data;Vec3b RGB_value = CD->getTargetColor();RGB_value[0] = (uchar)pos;CD->setTargetColor(RGB_value);CD->process();imshow("窗口", CD->getResult());
}

测试图像如下:

调节窗口如下:

当指定为红色时,会把图像中偏红的部分突出,如下:

效果还不错。

C++/OpenCV:同颜色检测提取相关推荐

  1. python颜色识别原理_python+opencv实现颜色检测、轮廓检测、颜色追踪

    准备工作 python配置numpy和openCv库 读取图像和视频图像cv2.imread(路径) cv2.imshow(窗口名称,输出对象) cv2.waitkey(等待时间)import cv2 ...

  2. 使用Opencv进行轮廓检测,字符提取,简单的直方图字符识别!

    一.使用Opencv进行轮廓检测! 所需函数: 1. cvFindContours 函数功能:从二值图像中检索轮廓,并返回检测到的轮廓的个数 函数原型: int)  cvFindContours( C ...

  3. 基于OpenCV的火焰检测(二)——RGB颜色判据

    上文跟大家分享了在做火焰检测中常用到的图像预处理方法,从这一篇博文开始,我将向大家介绍如何一步一步地检测出火焰区域.火焰提取要用 到很多判据,今天我要向大家介绍的是最简单的但是很有效的判据--RGB判 ...

  4. OpenCV 颜色检测| color detection

    OpenCV 颜色检测 1.导入必要的包并初始化相机 import cv2 import numpy as np# Reading the image img = cv2.imread('test.j ...

  5. 基于OpenCV的火焰检测(三)——HSI颜色判据

    上文向大家介绍了如何用最简单的RGB判据来初步提取火焰区域,现在我要给大家分享的是一种更加直观的判据--HSI判据.为什么说HSI判据是更加直观的判据呢?老规矩,先介绍一下HSI色彩模型:HSI颜色模 ...

  6. OpenCV使用神经网络检测颜色检查器

    OpenCV使用神经网络检测颜色检查器 使用神经网络检测颜色检查器 建造Building 示例的源代码 解释 设置标题和名称空间 创建检测器对象 加载模型 (可选)将dnn后端设置为CUDA 运行检测 ...

  7. python3 + opencv +pyzbar实时检测二维码 / 定位二维码,并绘制出二维码的框和提取二维码内容

    python3 + opencv +pyzbar实时检测二维码 / 定位二维码,并绘制出二维码的框和提取二维码内容 1 pyzbar二维码检测模块 1.1. pyzbar模块介绍 1.2 pyzbar ...

  8. OpenCV - C++实战(05) — 颜色检测

    目录 第5章  颜色检测 5.1 实现原理 5.2 Lab颜色模型 5.3 cv :: threshold() 阈值函数 5.4 计算图像之间的距离 5.4.1 公式计算 5.4.2 cv::absd ...

  9. 【Opencv图像处理】BGB转HSV与颜色检测

    BGB转HSV与颜色检测 什么是HSV色彩空间? Opencv代码 静态图片颜色检测 结果展示 视频颜色检测 结果展示 什么是HSV色彩空间? HSV(色相.饱和度.值,也称为 HSB [色相.饱和度 ...

最新文章

  1. 性能测试之操作系统计数器分析方法
  2. CentOS 生成SSH-KEY
  3. Python正则表达式指南
  4. Centos 6.7 配置时间同步解决时间自动变化的问题
  5. 51nod-正整数分组问题(基础方程DP-01背包)
  6. java连接imserver_java后端IM消息推送服务开发——协议
  7. jgGrid扩展 显示查询用时
  8. 4月1日,正式对全球科学界开放!
  9. html5输入框增加语音,为任意输入框添加语音输入功能
  10. Java基础:Util包下常用的数据结构介绍
  11. ES6中Number中的扩展
  12. LA 4487 Exclusive-OR
  13. gitbub遇见的问题
  14. 嵌入式学习是什么?嵌入式开发入门教程带你了解
  15. rpcx服务框架浅析9-序列化
  16. php smtp服务器553,Qmail电子邮件服务器简单架设[一]
  17. 计算机软件掉下来了怎么办,电脑使用卡顿怎么办?轻松一招解决掉
  18. Linux下载文件命令wget的一些用法
  19. 友声电子秤设置软件_友声电子秤操作方法盘点
  20. 2016最新广告法禁用词汇大全

热门文章

  1. 吴孟达肝癌逝世:肝被透支的全过程曝光!
  2. 【版本发布】Jeecg-P3 1.0 发布,J2EE微服务框架(插件开发)
  3. 职场 | 工作五年之后,对技术和业务的思考
  4. SpringCloud微服务(06):Config组件,实现配置统一管理
  5. Django(四)数据库
  6. 【技术博客】基于JsPlumb和JQuery-UI的流程图的保存和再生成
  7. Cannot obtain the required interface (IID_IDBCreateCommand) from OLE DB provider OraOLEDB.Oracle...
  8. 你不懂js系列学习笔记-类型与文法- 02
  9. Generator 简介
  10. 无线电波的入侵第1部分——无线电频率基础与理论