【OpenCV】OpenCV创建颜色识别类-class ColorDetector

将其构造函数声明为private,提供静态的接口来获得ColorDetector对象

void setColorDistanceThreshold(int) 用于设置阈值
void setTargetColor(unsigned char, unsigned char, unsigned char)
void setTargetColor(cv::Vec3b) 用于设置颜色
bool setInputImage(std::string) 用于载入待处理图像
cv::Mat getResult() const 用于返回处理结果,结果用一副图像表示


#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_ */

#include "ColorDetector.h"

ColorDetector* ColorDetector::singleton = 0;

ColorDetector::ColorDetector():minDist(100){
        target[0] = target[1] = target[2] = 0;
}

ColorDetector* ColorDetector::getInstance(){
        if(singleton == 0){
                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;
}





  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值