热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

实现图像处理算法中采用策略“Strategy”模式+Qt中相对路径

最近刚刚开始看《设计模式》,刚好最近也在从头开始OpenCV2,里面有讲到在图像算法设计中采用策略模式,照着例子实现了这个小demo,一下子明白所谓的策略模式倒底是个什么东东,这里mark一下。

最近刚刚开始看《设计模式》,刚好最近也在从头开始OpenCV2,里面有讲到在图像算法设计中采用策略模式,照着例子实现了这个小demo,一下子明白所谓的策略模式倒底是个什么东东,这里mark一下。

策略模式(Strategy),用原书中的定义是:定义一系列的算法,把他们一个个的封装起来,并且是他们可以相互替换(相互替换这点还没有完全体会到)。这样算法的变换便可以独立于使用它的对象。用我直白的话说就是,把对一个对象(Context)进行处理的各种算法,封装到另外一个对象(Strategy)里面,这样我们便可以专注于Strategy,而不用担心修改算法的同时会对Context造成影响,只要这个Strategy还没有对Context起作用,我们对Strategy的改动都不会影响到Context,在实现的过程中省了好多心。

下面是一个小demo:

具体到这个demo中Strategy的实现是将对Mat(图片)处理的函数统统封装到一个类中,这里讲类中成员函数的声明和实现写在了一起。

/////////////////////////////////////////////////////////
//由strategy思想构造一个类
//类名:ColorDetector
//主要目的:检测一幅图像中是否存在目标颜色
/////////////////////////////////////////////////////////
#ifndef STRATEGY
#define STRATEGY

#endif // STRATEGY

#include
//#include
//#include
using namespace std;
using namespace cv;

class ColorDetector
{
public:
//空构造函数
ColorDetector():minDist(100){
//初始化默认参数
target[0]=target[1]=target[2]=0;
}
public:
//设置色彩阈值,阈值必须大于等于0
void setColorDistanceThreshold(int distance){
if(distance<0)
distance=0;
minDist=distance;
}
//获取色彩阈值
int getColorDistanceThreshold() const{
return minDist;
}

//设置需要检测的颜色
void setTargetColor(unsigned char red,unsigned char green,unsigned blue)
{
//BGR的顺序
target[2]=red;
target[1]=green;
target[0]=blue;
}
//设置需要检测的颜色
void setTargetColor(Vec3b color){
target=color;
}

//获取要检测的色彩值
Vec3b getTargetColor() const{
return target;
}

//计算目标与颜色的距离
int getDistance(const Vec3b &color)const{
return abs(color[0]-target[0])+abs(color[1]-target[1])+abs(color[2]-target[2]);
}
//检测目标颜色,并输出检测生成的图像
Mat process(const Mat &image){
//按需从新分配二值图像与输入图像尺寸相同,
result.create(image.size(),CV_8U);

//得到迭代器
Mat_::const_iterator it=image.begin();
Mat_::const_iterator itend=image.end();
Mat_::iterator itout=result.begin();

//检测每个像素
for(;it!=itend;++it,++itout)
{
if(getDistance(*it) *itout=255;
else
*itout=0;
}
return result;

}


private:
//最小可接受距离
int minDist;
//目标色
Vec3b target;
//结果图像
Mat result;
};

封装好之后我们便能对调用它了,下面是调用Strategy类的实现:

#include 
#include "strategy.h"
#include
#include
#include
#include
using namespace cv;
using namespace std;

int main()
{
//创建图像处理对象
ColorDetector cdetector;
//Qt中当前路径显示
QDir dir;
QString pathname;
pathname = dir.currentPath();
qDebug()<
//读入图像
Mat image=imread("./resource/images/lena.jpg");
//Mat image=imread(path.toStdString().data());
if(!image.data)
return -1;
//设置输入参数
cdetector.setTargetColor(130,190,230);
namedWindow("result");
//处理并显示结果
imshow("result",cdetector.process(image));
waitKey();
return 0;

}
最后说一下Qt中相对路径的问题,相对路径是相对工程根目录而言的,表达的格式是:“./resource/images/lena.jpg”,即在工程的根目录下有一个resource文件夹,resource内部有一个images文件夹,images内部有这幅图像lena.jpg。一开始我是将这幅图像放在了最开始建立工程时的文件夹下,发现找不到图片,其实Qt在build的过程中会根据是否勾选shadow build这一选项创建一个新的执行文件的目录。


Shadow build是否勾选,构建目录是不一样的,将resource文件夹复制到构建目录下面。OK  运行成功!


推荐阅读
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
author-avatar
全球时_尚热门焦点吧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有