策略模式是将算法封装在类中,在面向对象的编程中的特殊结构类中,可以通过替换或者组合算法来实现复杂的逻辑。
本文中的算法四路是:任意给定一幅彩色图像,根据给定的目标颜色,目标颜色可以是红色(Red),绿色(Green),蓝色(Blue)三基色中的一种,也可以是三基色的混合颜色。
//设置需要检测的颜色
void setTargetColor(unsigned char red, unsigned char green, unsigned char blue){
target[2] = red;
target[1] = green;
target[0] = blue;
};
如果需要设置为红色,可以设置为setTargetColor(255,0,0);设置为蓝色setTargetColor(0,0,255),依次类推。
查找特定的目标颜色区域,其实就是计算目彩色图片像素点与目标颜色比较的差值,当差值(也就是颜色的距离值小于某个阈值T)小于一个阈值就标记这个像素点为白色,否则为黑色。经过遍历整幅图像像素点以后就标记处想要的特定颜色的区域。计算颜色距离的函数为:
//计算两个目标的颜色距离
int cal_distance(const cv::Vec3b&color)
{
return abs(color[0] - target[0]) + abs(color[1] - target[1]) + abs(color[2] - target[2]);
};
step1:声明算法类;
ColorDetector cdtector;//①声明cdtector,类型为colorDetector
step2:加载图像;
Mat image = imread("101.jpg");//②读入图像
resize(image, imagenew, Size(600, 400), 0, 0, INTER_LINEAR);//缩小图片尺寸
step3:初始化输入参数,包括目标颜色;
cdtector.setTargetColor(200,0, 0);//③设置输入参数
step4:算法执行;
imshow("蓝天白云图", cdtector.process(image));//④处理并显示结果
step5:显示结果;
附上源码:
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdio.h>
#include <string.h>
/*******************************************
*@description: 在算法设计中使用策略模式
*@parameter:
*@retval:
******************************************/
using namespace cv;
using namespace std;
//创建一个算法类
class ColorDetector{
public:
ColorDetector() : minDist(50)//构造空函数
{
target[0] = target[1] = target[2] = 0;//初始化目标变量
};
//设置彩色距离阈值(距离必须为正,否则距离取0)
void SetColorDistanceThreshold(int distance){
if (distance < 0)
distance = 0;
minDist = distance;
};
//获取彩色距离阈值
int GetColorDistanceThreshold(int distance){
return minDist;
};
//设置需要检测的颜色
void setTargetColor(unsigned char red, unsigned char green, unsigned char blue){
target[2] = red;
target[1] = green;
target[0] = blue;
};
//获取需要检测的颜色
Vec3b getTargetColor(){
return target;
};
/*********************************
* 计算两个目标的颜色距离
* @par:
* @retval:
*********************************/
int cal_distance(const cv::Vec3b&color)
{
return abs(color[0] - target[0]) + abs(color[1] - target[1]) + abs(color[2] - target[2]);
};
Mat process(cv::Mat &image);//构造函数
private:
int minDist;//颜色与目标色最小距离
Vec3b target;//目标颜色
Mat result;//结果图像
};
cv::Mat ColorDetector::process(cv::Mat &image){
result.create(image.cols,image.rows,CV_8U);
Mat_<cv::Vec3b>::const_iterator it = image.begin<cv::Vec3b>();//初始位置迭代器
Mat_<cv::Vec3b>::const_iterator itend = image.end<cv::Vec3b>();//终止位置迭代器
Mat_<uchar>::iterator itout = result.begin<uchar>();//终止位置迭代器
//遍历每一个像素
for (; it != itend; ++it, ++itout)
{
//计算每一个像素与目标颜色的距离
if (cal_distance(*it) < minDist)
*itout = 255;
else *itout = 0;
}
return result;
}
int main()
{
Mat imagenew;
ColorDetector cdtector;//①声明cdtector,类型为colorDetector
Mat image = imread("101.jpg");//②读入图像
resize(image, imagenew, Size(600, 400), 0, 0, INTER_LINEAR);//缩小图片尺寸
cdtector.setTargetColor(0,0,200);//③设置输入参数
imshow("原图", imagenew);//显示原图
imshow("处理图", cdtector.process(imagenew));//④处理并显示结果
waitKey(0);
return 0;
}
本文暂时没有评论,来添加一个吧(●'◡'●)