写一手好的C++代码 ,利用Strategy模式写的

来源:互联网 发布:有源码怎么做网站 编辑:程序博客网 时间:2024/05/17 02:19
<span style="font-size:32px;">策略设计模式就是将算法封装在类中,比如我们见到的进行一个二值化算法;</span>
#include <opencv2/core/core.hpp>#include<opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui/highgui.hpp>using namespace cv;using namespace std;class ColorDetector{    private:        int minDist;        Vec3b target;        Mat result;    public:    ColorDetector():minDist(100){        target[0] = target[1] = target[2] = 0;    }    //设置色彩距离阈值    void setColorDistanceThreshold(int distance){        if (distance < 0)            distance = 0;        minDist = distance;    }    //get set方法设置Private里面的变量    int getColorDistanceThreshold()const{        return minDist;    }    //设置需检测的颜色    void setTargetColor(unsigned char red, unsigned char green, unsigned char blue){        target[2] = red;        target[1] = green;        target[0] = blue;    }    void setTargetColor(Vec3b color){        target = color;    }    Vec3b getTargetColor()const{        return target;    }    //计算与目标颜色的距离,采用的是街区距离    int getDistance(const Vec3b& color) const{        return abs(color[0] - target[0]) +            abs(color[1] - target[1]) +            abs(color[2] - target[2]);    }    Mat ColorDetector::process(const Mat &image){        result.create(image.rows,image.cols, CV_8U);        Mat_<Vec3b>::const_iterator it = image.begin<Vec3b>();        Mat_<Vec3b>::const_iterator itend = image.end<Vec3b>();        Mat_<uchar>::iterator itout = result.begin<uchar>();        for (; it != itend; ++it, ++itout){            if (getDistance(*it) < minDist){                *itout = 255;            }            else{                *itout = 0;            }        }        return result;    }};int main(){    //创建对象    ColorDetector cdector;    Mat image = imread("boldt.jpg");    if (!image.data){ return 0; }    cdector.setTargetColor(130, 190, 230);    namedWindow("result");    imshow("result", cdector.process(image));    waitKey(0);    return 0;}

0 0
原创粉丝点击