首页 > 代码库 > Learning OpenCV Lecture 2 (Using the Strategy pattern in algorithm design)

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;}