Learning OpenCV Lecture 2 (Using the Strategy pattern in algorithm design)

ColorDetector.h:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

class ColorDetector
{
public:
      // empty constructor
     ColorDetector() : minDist(100) {
            // default parameter initialization here
            target[0] = target[1] = target[2] = 0;
     }

      // Sets the color distance threshold
      // Threshold must be positive
      // othrewise 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) {
                 // BGR order
                 target[2] = red;
                 target[1] = green;
                 target[0] = blue;
     }
      // Sets the color to be detected
      void setTargetColor(cv::Vec3b color) {
            target = color;
     }
      // Gets the color to be detected
     cv::Vec3b getTargetColor() const {
            return target;
     }

     cv::Mat process(const cv::Mat &image);
      int getDistance(const cv::Vec3b& color) const;

private:
      // minimum acceptable distance
      int minDist;
      // target color
     cv::Vec3b target;
      // image containing resulting binary map
     cv::Mat result;

};

  ColorDetector.cpp:

#include "ColorDetector.h"

cv::Mat ColorDetector::process(const cv::Mat &image) {
     
      // re-allocate binary map if necessary
      // same size as input image, but 1-chaanel
     result.create(image.rows, image.cols, CV_8U);

      // get the iterators
     cv::Mat_<cv::Vec3b>::const_iterator it = image.begin<cv::Vec3b>();
     cv::Mat_<cv::Vec3b>::const_iterator itend = image.end<cv::Vec3b>();
     cv::Mat_<uchar>::iterator itout = result.begin<uchar>();

      // for each pixel
      for ( ; it!= itend; ++it, ++itout) {
            // process each pixel ---------------------
            // compute distance from target color
            if (getDistance(*it) < minDist) {
                 *itout = 255;
            } else {
                 *itout = 0;
            }
            // end of pixel processing ----------------
     }

      return result;
}

int ColorDetector::getDistance(const cv::Vec3b& color) const {
      return abs(color[0] - target[0]) +
              abs(color[1] - target[1]) +
              abs(color[2] - target[2]);

      // Other methods to compute distance
//   return static_cast<int>(
//         cv::norm<int, 3>(cv::Vec3b(color[0] - target[0],
//                                            color[1] - target[1],
//                                            color[2] - target[2])));


}

main.cpp

#include "ColorDetector.h"

int main()
{
      // 1. Create image processor boject
     ColorDetector cdetect;

      // 2. Read input image
     cv::Mat image = cv::imread( "test.jpg");
      if (!image.data) {
            return 0;
     }

      // 3. Set input parameters
     cdetect.setTargetColor(130, 190, 230); // here blue sky

     cv::namedWindow( "result");
     
      // 4. Process the image and display the result
     cv::imshow( "result", cdetect.process(image));

     cv::waitKey();
      return 0;
}

 

posted @ 2014-07-22 20:44  starlitnext  阅读(339)  评论(0编辑  收藏  举报