OpenCV2学习笔记(六):检测图像颜色小程序

设计一个界面,用来检测一幅图像的颜色分布,开发平台为Qt5.3.2+OpenCV2.4.9。

该程序的主要步骤如下: 1. 载入图像,选定一种颜色; 2. 设定阈值,,在该值范围内判定像素属于预设的颜色; 3. 在界面的Label中输出结果。

首先,新建一个Qt Widgets Application,其中基类选择为QWidget,在创建完项目后,添加一个检测图像颜色的类ColorDetector。并在在Qt项目的.pro文件中添加:

INCLUDEPATH+=C:\C:2\C:LIBS+=C:_calib3d249.dll.a\C:_contrib249.dll.a\C:_core249.dll.a\C:_features2d249.dll.a\C:_flann249.dll.a\C:_gpu249.dll.a\C:_highgui249.dll.a\C:_imgproc249.dll.a\C:_legacy249.dll.a\C:_ml249.dll.a\C:_nonfree249.dll.a\C:_objdetect249.dll.a\C:_ocl249.dll.a\C:_video249.dll.a\C:_photo249.dll.a\C:_stitching249.dll.a\C:_superres249.dll.a\C:_ts249.a\C:_videostab249.dll.a

进入图形界面文件widget.ui,在其中拖入三个按键,改名为”Open Image”,”Process”,”Color”,他们分别执行载入图像、颜色检测、颜色设定的操作。同时,拖入一个Vertical Slider,用于调整颜色的阈值。最后在下方设置一个Label,图像输出在该区域中。

设置各个按钮的objectName,分别为: “Open Image”设定为”openImage” “Process”设定为”dealImage” “Color”设定为”colorButton” “Vertical Slider”设定为”verticalSlider” 这是为了在程序中将信号与槽函数相对应:

Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui -> setupUi(this);connect(ui -> openImage, SIGNAL(clicked()), this, SLOT(openImage()));connect(ui -> dealImage, SIGNAL(clicked()), this, SLOT(ImageProcess()));connect(ui -> colorButton, SIGNAL(clicked()), this, SLOT(colorSelect()));connect(ui -> verticalSlider, SIGNAL(valueChanged(int)), this, SLOT(changeDis(int)));}

接着,定义处理图像所用的类,首先是colordetector.h:

{private:int minDist;cv::Vec3b target;cv::Mat result;cv::Mat image;ColorDetector();static ColorDetector *singleton;public:static ColorDetector * getInstance();static void destory();void setColorDistanceThreshold(int);int getColorDistanceThreshold() const;void setTargetColor(unsigned char, unsigned char, unsigned char);void setTargetColor(cv::Vec3b);cv::Vec3b getTargetColor() const;void process();int getDistance(const cv::Vec3b&) const;cv::Mat getResult() const;bool setInputImage(std::string);cv::Mat getInputImage() const;};#endif /* COLORDETECTOR_H_ */

接着在中添加colordetector.cpp:

#include “ColorDetector.h”ColorDetector* ColorDetector::singleton = 0;ColorDetector::ColorDetector():minDist(100){target[0] = target[1] = target[2] = 0;}ColorDetector* ColorDetector::getInstance(){if(singleton == 0){singleton = new ColorDetector;}return singleton;}void ColorDetector::destory(){if(singleton!=0){delete singleton;}singleton = 0;}void ColorDetector::setColorDistanceThreshold(int distance){if(distance < 0){distance = 0;}minDist = distance;}int ColorDetector::getColorDistanceThreshold() const{return minDist;}void ColorDetector::setTargetColor(unsigned char red,unsigned char green, unsigned char blue){target[2] = red;target[1] = green;target[0] = blue;}void ColorDetector::setTargetColor(cv::Vec3b color){target = color;}getTargetColor() const{return target;}int ColorDetector::getDistance(const cv::Vec3b& color) const{return abs(color[0]-target[0])+abs(color[1]-target[1])+abs(color[2]-target[2]);}void ColorDetector::process(){result.create(image.rows, image.cols, CV_8U);>();>();itout = result.begin<uchar>();for(; it!=itend; ++it, ++itout){if(getDistance(*it) < minDist){*itout = 255;}else{*itout = 0;}}}getResult() const{return result;}bool ColorDetector::setInputImage(std::string filename){image = cv::imread(filename);if(!image.data){return false;}return true;}getInputImage() const{return image;}伟人之所以伟大,是因为他与别人共处逆境时,

OpenCV2学习笔记(六):检测图像颜色小程序

相关文章:

你感兴趣的文章:

标签云: