3_opencv2计算机视觉学习_基于类的图像处理

来源:互联网 发布:哪个软件看泰剧最多 编辑:程序博客网 时间:2024/05/18 20:53

1、算法中使用策略

       策略设计模式的目标就是将算法封装在类中,该模式将算法复杂度隐藏在易用的编程接口背后,降低算法部署难度。

       例子:设计一个算法,他可以鉴别出图像中含有给定颜色的所有像素。算法输入的是图像以及颜色,并返回表示含有指定颜色的像素的二值图像,并且还要指定对颜色的容忍度。

      算法核心部分包含一个遍历每个像素的简单循环,将像素和目标像素进行比较,如果距离小于容忍度则设置为白色,否则设置为黑色。最后返回处理后的图像,实现如下:

//类外定义函数

cv::MatColorDetector::process(constcv::Mat&image){      result.create(image.rows,image.cols,CV_8U);      //得到迭代器      cv::Mat_<cv::Vec3b>::const_iteratorit=image.begin<cv::Vec3b>();      cv::Mat_<cv::Vec3b>::const_iteratoritend=image.end<cv::Vec3b>();      cv::Mat_<uchar>::iteratoritout=result.begin<uchar>();      //对每个像素      for(;it!=itend;++it,++itout){        //处理每个像素---------------------          //计算离目标颜色距离          if(getDistance(*it)<minDist){              *itout=255;          }else{              *itout=0;          }      }      return result;}

getDistance()函数计算距离:

//内置私有函数//计算与目标颜色的距离      intgetDistance(constcv::Vec3b&color)const{         //returnstatic_cast<int>(cv::norm<int,3>(cv::Vec3i(color[0]-target[0],color[1]-target[1],color[2]-target[2])));//街区距离          returnabs(color[0]-target[0])+                    abs(color[1]-target[1])+                    abs(color[2]-target[2]);      }

之后定义类,类成员三个,以及相关函数,具体详见程序。我们设置了图片中墙的颜色得到以下结果

 

#include<iostream>#include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>usingnamespacecv;usingnamespacestd; classColorDetector{   private:       //最小可接受距离      intminDist;      //目标色      cv::Vec3btarget;      //结果图像      cv::Matresult;       //内置私有函数      //计算与目标颜色的距离      intgetDistance(constcv::Vec3b&color)const{         //returnstatic_cast<int>(cv::norm<int,3>(cv::Vec3i(color[0]-target[0],color[1]-target[1],color[2]-target[2])));          returnabs(color[0]-target[0])+                    abs(color[1]-target[1])+                    abs(color[2]-target[2]);      }   public:       //空构造函数      ColorDetector():minDist(100){           //初始化默认表          target[0]=target[1]=target[2]=0;      }       //设置色彩距离阈值。阈值必须为正,否则为0       voidsetColorDistanceThreshold(intdistance){          if(distance<0)              distance=0;          minDist=distance;      }       //获取色彩距离阈值      intgetColorDistanceThreshold()const{          returnminDist;      }       //设置需要检测的颜色      voidsetTargetColor(unsignedcharred,unsignedchargreen,unsignedcharblue){      //BGR顺序          target[2]=red;          target[1]=green;          target[0]=blue;      }       //设置需检测颜色      voidsetTargetColor(cv::Vec3bcolor){           target=color;      }       //获取需检测的颜色      cv::Vec3bgetTargetColor()const{           returntarget;      }       cv::Matprocess(constcv::Mat&image);}; //类外定义函数cv::MatColorDetector::process(constcv::Mat&image){       result.create(image.rows,image.cols,CV_8U);      //得到迭代器      cv::Mat_<cv::Vec3b>::const_iteratorit=image.begin<cv::Vec3b>();      cv::Mat_<cv::Vec3b>::const_iteratoritend=image.end<cv::Vec3b>();      cv::Mat_<uchar>::iteratoritout=result.begin<uchar>();      //对每个像素      for(;it!=itend;++it,++itout){        //处理每个像素---------------------          //计算离目标颜色距离          if(getDistance(*it)<minDist){              *itout=255;          }else{             *itout=0;          }      }      returnresult;} intmain(){    ColorDetectorcdectect;    Matimage=imread("bridge.jpg");    cdectect.setTargetColor(97,59,40);//墙的颜色    namedWindow("result");    imshow("result",cdectect.process(image));    waitKey(0);    return0;} 



0 0
原创粉丝点击