| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 
 |  
#if !defined COLORDETECT
#define COLORDETECT
 
#include <opencv2/opencv.hpp>
 
class ColorDetector {
 
  private:
 
	  // minimum acceptable distance
	  int minDist; 
 
	  // target color
	  cv::Vec3b target; 
 
	  // image containing resulting binary map
	  cv::Mat result;
 
	  // image containing color converted image
	  cv::Mat converted;
 
	  // inline private member function
	  // Computes the distance from target color.
	  int getDistance(const cv::Vec3b& color) const {
		 // return static_cast<int>(cv::norm<int,3>(cv::Vec3i(color[0]-target[0],color[1]-target[1],color[2]-target[2])));
		  return abs(color[0]-target[0])+
					abs(color[1]-target[1])+
					abs(color[2]-target[2]);
	  }
 
  public:
 
	  // empty constructor
	  ColorDetector() : minDist(100) { 
 
		  // default parameter initialization here
		  target[0]= target[1]= target[2]= 0;
	  }
 
	  // Getters and setters
 
	  // Sets the color distance threshold.
	  // Threshold must be positive, otherwise distance threshold
	  // is set to 0.
	  void setColorDistanceThreshold(int distance) {
 
		  if (distance<0)
			  distance=0;
		  minDist= distance;
	  }
 
	  // Gets the color distance threshold
	  int getColorDistanceThreshold() const {
 
		  return minDist;
	  }
 
	  // Sets the color to be detected
	  void setTargetColor(unsigned char red, unsigned char green, unsigned char blue) {
 
		  cv::Mat tmp(1,1,CV_8UC3);
          tmp.at<cv::Vec3b>(0,0)[0]= blue;
          tmp.at<cv::Vec3b>(0,0)[1]= green;
          tmp.at<cv::Vec3b>(0,0)[2]= red;
 
  	      // Converting the target to Lab color space 
	      cv::cvtColor(tmp, tmp, CV_BGR2Lab);
 
          target= tmp.at<cv::Vec3b>(0,0);
	  }
 
	  // Sets the color to be detected
	  void setTargetColor(cv::Vec3b color) {
 
		  cv::Mat tmp(1,1,CV_8UC3);
          tmp.at<cv::Vec3b>(0,0)= color;
 
  	      // Converting the target to Lab color space 
	      cv::cvtColor(tmp, tmp, CV_BGR2Lab);
 
          target= tmp.at<cv::Vec3b>(0,0);
	  }
 
	  // Gets the color to be detected
	  cv::Vec3b getTargetColor() const {
 
		  return target;
	  }
 
      // Processes the image. Returns a 1-channel binary image.
      cv::Mat process(const cv::Mat &image);
};
 
 
#endif | 
Partager