OpenCV策略设计模式比较颜色,假设我们要构建一个简单的算法,用来识别图像中具有某种颜色的所有像素。这个算法必须输入一幅图像和一个颜色,并且返回一个二值图像,显示具有指定颜色的像素。在运行算法前,还要指定一个参数,即能接受的颜色的公差。
本文将采用策略设计模式来实现这一目标,它是一种面向对象的设计模式,用很巧妙的方法将算法封装进类。采用这种模式后,可以很轻松地替换算法,或者组合多个算法以实现更复杂的功能。而且这种模式能够尽可能地将算法的复杂性隐藏在一个直观的编程接口后面,更有利于算法的部署。
如何实现
一旦用策略设计模式把算法封装进类,就可以通过创建类的实例来部署算法,实例通常是在程序初始化的时候创建的。在运行构造函数时,类的实例会用默认值初始化算法的各种参数,使其立即进入可用状态。我们还可以用适当的方法来读写算法的参数值。在GUI应用程序中,可以用多种部件(文本框、滑动条等)显示和修改参数,用户操作起来很容易。
写一个简单的主函数,调用颜色检测算法:
int main()
{
// 1.创建图像处理器对象
ColorDetector cdetect;
// 2.读取输入的图像
cv::Mat image= cv::imread("boldt.jpg");
if (image.empty()) return 0;
// 3.设置输入参数
cdetect.setTargetColor(230,190,130); // 这里表示蓝天
// 4.处理图像并显示结果
cv::namedWindow("result");
cv::Mat result = cdetect.process(image);
cv::imshow("result", result);
cv::waitKey();
return 0;
}
运行这个程序,输出结果如下所示:
这里的白色像素表示检测到指定的颜色,黑色表示没有检测到。
很明显,封装进这个类的算法相对简单(下面会看到它只是组合了一个扫描循环和一个公差参数)。当算法的实现过程变得更加复杂、步骤繁多并且包含多个参数时,策略设计模式才会真正展现出强大的威力。
酷客网相关文章:
评论前必须登录!
注册