C++/OpenCV:同颜色检测提取
看到这个老哥写了一个类,但是没有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:同颜色检测提取相关推荐
- python颜色识别原理_python+opencv实现颜色检测、轮廓检测、颜色追踪
准备工作 python配置numpy和openCv库 读取图像和视频图像cv2.imread(路径) cv2.imshow(窗口名称,输出对象) cv2.waitkey(等待时间)import cv2 ...
- 使用Opencv进行轮廓检测,字符提取,简单的直方图字符识别!
一.使用Opencv进行轮廓检测! 所需函数: 1. cvFindContours 函数功能:从二值图像中检索轮廓,并返回检测到的轮廓的个数 函数原型: int) cvFindContours( C ...
- 基于OpenCV的火焰检测(二)——RGB颜色判据
上文跟大家分享了在做火焰检测中常用到的图像预处理方法,从这一篇博文开始,我将向大家介绍如何一步一步地检测出火焰区域.火焰提取要用 到很多判据,今天我要向大家介绍的是最简单的但是很有效的判据--RGB判 ...
- OpenCV 颜色检测| color detection
OpenCV 颜色检测 1.导入必要的包并初始化相机 import cv2 import numpy as np# Reading the image img = cv2.imread('test.j ...
- 基于OpenCV的火焰检测(三)——HSI颜色判据
上文向大家介绍了如何用最简单的RGB判据来初步提取火焰区域,现在我要给大家分享的是一种更加直观的判据--HSI判据.为什么说HSI判据是更加直观的判据呢?老规矩,先介绍一下HSI色彩模型:HSI颜色模 ...
- OpenCV使用神经网络检测颜色检查器
OpenCV使用神经网络检测颜色检查器 使用神经网络检测颜色检查器 建造Building 示例的源代码 解释 设置标题和名称空间 创建检测器对象 加载模型 (可选)将dnn后端设置为CUDA 运行检测 ...
- python3 + opencv +pyzbar实时检测二维码 / 定位二维码,并绘制出二维码的框和提取二维码内容
python3 + opencv +pyzbar实时检测二维码 / 定位二维码,并绘制出二维码的框和提取二维码内容 1 pyzbar二维码检测模块 1.1. pyzbar模块介绍 1.2 pyzbar ...
- OpenCV - C++实战(05) — 颜色检测
目录 第5章 颜色检测 5.1 实现原理 5.2 Lab颜色模型 5.3 cv :: threshold() 阈值函数 5.4 计算图像之间的距离 5.4.1 公式计算 5.4.2 cv::absd ...
- 【Opencv图像处理】BGB转HSV与颜色检测
BGB转HSV与颜色检测 什么是HSV色彩空间? Opencv代码 静态图片颜色检测 结果展示 视频颜色检测 结果展示 什么是HSV色彩空间? HSV(色相.饱和度.值,也称为 HSB [色相.饱和度 ...
最新文章
- 性能测试之操作系统计数器分析方法
- CentOS 生成SSH-KEY
- Python正则表达式指南
- Centos 6.7 配置时间同步解决时间自动变化的问题
- 51nod-正整数分组问题(基础方程DP-01背包)
- java连接imserver_java后端IM消息推送服务开发——协议
- jgGrid扩展 显示查询用时
- 4月1日,正式对全球科学界开放!
- html5输入框增加语音,为任意输入框添加语音输入功能
- Java基础:Util包下常用的数据结构介绍
- ES6中Number中的扩展
- LA 4487 Exclusive-OR
- gitbub遇见的问题
- 嵌入式学习是什么?嵌入式开发入门教程带你了解
- rpcx服务框架浅析9-序列化
- php smtp服务器553,Qmail电子邮件服务器简单架设[一]
- 计算机软件掉下来了怎么办,电脑使用卡顿怎么办?轻松一招解决掉
- Linux下载文件命令wget的一些用法
- 友声电子秤设置软件_友声电子秤操作方法盘点
- 2016最新广告法禁用词汇大全
热门文章
- 吴孟达肝癌逝世:肝被透支的全过程曝光!
- 【版本发布】Jeecg-P3 1.0 发布,J2EE微服务框架(插件开发)
- 职场 | 工作五年之后,对技术和业务的思考
- SpringCloud微服务(06):Config组件,实现配置统一管理
- Django(四)数据库
- 【技术博客】基于JsPlumb和JQuery-UI的流程图的保存和再生成
- Cannot obtain the required interface (IID_IDBCreateCommand) from OLE DB provider OraOLEDB.Oracle...
- 你不懂js系列学习笔记-类型与文法- 02
- Generator 简介
- 无线电波的入侵第1部分——无线电频率基础与理论