[OPENCV] 第一个程序 识别颜色

它可以鉴别出图像中含有给定颜色的所有像素,该算法输入的是图像以及颜色,并返回表示含有指定颜色的像素的二值图像。该算法还需要指定另外一个参数,即对颜色偏差的容忍度。

实现效果

实现后

 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 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/6110892.html