Using the Strategy pattern in algorithm design
2012-05-05 17:39
549 查看
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> class ColorDetector { private: // minimum acceptable distance int minDist; // target color cv::Vec3b target; // image containing resulting binary map cv::Mat result; 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, // otherwise distance threshold is set to 0. void setColorDistanceThreshold(int distance) { if (distance<0) distance=0; minDist= distance; } // Get 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; } int getDistance(const cv::Vec3b& color) const { return abs(color[0]-target[0])+ abs(color[1]-target[1])+ abs(color[2]-target[2]); } cv::Mat ColorDetector::process(const cv::Mat &image) { // re-allocate binary map if necessary // same size as input image, but 1-channel 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 processiong ----------------- } return result; } }; int main() { // 1. Create image processor object ColorDetector cdetect; // 2. Read input image cv::Mat image=cv::imread("G:\\opencv\\images\\boldt.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; }
相关文章推荐
- Learning OpenCV Lecture 2 (Using the Strategy pattern in algorithm design)
- Strategy pattern in algorithm design
- 状态模式在领域驱动设计中的使用(Using the State pattern in a Domain Driven Design)
- algorithm@ find the shortest path in a graph using BFS
- CRUD Operations Using the Generic Repository Pattern and Dependency Injection in MVC
- Discover the Design Patterns You're Already Using in the .NET Framework
- 策略模式 in Java (Strategy Design Pattern)
- 8.2.1 策略设计模式(The strategy design pattern)
- CRUD Operations Using the Generic Repository Pattern and Dependency Injection in MVC
- the difference between state and strategy design pattern
- Using the Singleton design pattern
- 设计模式1--策略模式(the strategy design pattern)
- MVC design pattern in our project, the Order system
- Discover the Design Patterns You're Already Using in the .NET Framework(MSDN)
- View Controller Programming Guide for iOS---(八)---Using View Controllers in the Responder Chain
- [转]Using the Repository Pattern with ASP.NET MVC and Entity Framework
- HyperLogLog in Practice: Algorithmic Engineering of a State of The Art Cardinality Estimation Algorithm
- Implementing the Singleton Pattern in C#
- MongoDB Index using when use sorting in the stress testing.
- mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication解决办法