首页 > 代码库 > 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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。