它可以鉴别出图像中含有给定颜色的所有像素,该算法输入的是图像以及颜色,并返回表示含有指定颜色的像素的二值图像。该算法还需要指定另外一个参数,即对颜色偏差的容忍度。
实现效果
实现后
1 #include <QCoreApplication> 2 #include <opencv2/core/core.hpp> 3 #include <opencv2/highgui/highgui.hpp> 4 #include<cstdio> 5 #include<iostream> 6 7 class ColorDector{ 8 private: 9 int minDist; 10 cv::Vec3b target; 11 cv::Mat result; 12 public: 13 ColorDector(){ 14 minDist=100; 15 target[0]=target[1]=target[2]=0; 16 } 17 cv::Mat process(const cv::Mat &image){ 18 //分配新的阵列数据 19 result.create(image.rows,image.cols,CV_8U); 20 cv::Mat_<cv::Vec3b>::const_iterator it=image.begin<cv::Vec3b>(); 21 cv::Mat_<cv::Vec3b>::const_iterator itend=image.end<cv::Vec3b>(); 22 cv::Mat_<uchar>::iterator itout=result.begin<uchar>(); 23 for(;it!=itend;++it,++itout){ 24 if(getDistance(*it)<minDist){ 25 *itout=255; 26 } 27 else{ 28 *itout=0; 29 } 30 } 31 return result; 32 } 33 34 int getDistance(const cv::Vec3b& color)const{ 35 return abs(color[0]-target[0])+abs(color[1]-target[1])+abs(color[2]-target[2]); 36 } 37 void setColorDistanceThreadhold(int distance){ 38 if(distance<0) distance=0; 39 minDist=distance; 40 } 41 42 int getColorDIstanceThreshold()const{ 43 return minDist; 44 } 45 void setTargetColor(unsigned char red,unsigned char green,unsigned char blue){ 46 target[2]=red; 47 target[1]=green; 48 target[0]=blue; 49 } 50 }; 51 int main() 52 { 53 54 ColorDector cdetect; 55 cv::Mat image=cv::imread("C:/Users/Administrator/Desktop/1.jpg"); 56 if(!image.data) return 0; 57 cv::Mat climage=image.clone(); 58 cdetect.setTargetColor(220,220,200); 59 cv::namedWindow("result"); 60 cv::imshow("result",cdetect.process(climage)); 61 //cv::imshow("result",climage); 62 cv::waitKey(); 63 64 65 return 0; 66 }