一起学opencv (五) 图片的数据计较,类的应用

来源:互联网 发布:linux grub命令进win 编辑:程序博客网 时间:2024/06/07 06:45

简单的比较彩色图数据RGB值分别于设定的三个色度值比较,大则输出白色,小则输出黑色值。


colordetector.h

#if !defined COLORDETECT#define COLORDETECT#include <opencv2/core/core.hpp>class ColorDetector {private:// minimum acceptable distanceint minDist;// target colorcv::Vec3b target;// image containing resulting binary mapcv::Mat result;// 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 constructorColorDetector() : minDist(100) {// default parameter initialization heretarget[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 thresholdint getColorDistanceThreshold() const {return minDist;}// Sets the color to be detectedvoid setTargetColor(unsigned char red, unsigned char green, unsigned char blue) {target[2] = red;target[1] = green;target[0] = blue;}// Sets the color to be detectedvoid setTargetColor(cv::Vec3b color) {target = color;}// Gets the color to be detectedcv::Vec3b getTargetColor() const {return target;}// Processes the image. Returns a 1-channel binary image.cv::Mat process(const cv::Mat &image);};#endif
 

类函数cv::Mat process(const cv::Mat &image)在头文件

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-channelresult.create(image.rows, image.cols, CV_8U);// get the iteratorscv::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 pixelfor (; it != itend; ++it, ++itout) {// process each pixel ---------------------// compute distance from target colorif (getDistance(*it)<minDist) {*itout = 255;}else {*itout = 0;}// end of pixel processing ----------------}return result;}

主程序

#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include "colordetector.h"int main(){// Create image processor objectColorDetector cdetect;// Read input imagecv::Mat image = cv::imread("bfg.jpg");if (!image.data)return 0;// set input parameterscdetect.setTargetColor(130, 130, 90); // here blue sky// Read image, process it and display the resultcv::Mat image2 = cdetect.process(image);cv::namedWindow("result");cv::imshow("result",image2);cv::imwrite("saved.jpg", image2);cv::waitKey();return 0;}
结果




1 0