热门标签 | 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  运行成功!


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
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社区 版权所有