图像自动测试框架

最近在做关于 Kinect 的项目,由于需要用到图像匹配相关的算法,从网上看到有大量的论文,一时之间也不知道哪些才是适合我的,于是乎我想到应该对这些方法进行试验,从而找到适合我的好方法。但是,问题来了,这么多的算法,一个一个的做实验,不现实啊。经过深思熟虑,我下定决心要写一个自动的框架,利用这个框架来加速我的试验速度。这个框架定义了三个基类:ImageGen、SkinDetect、Action。

ImageGen:自动的生成待检测的图像,接口如下:

class ImageGen{
public:
	virtual IplImage* operator()() = 0;
	virtual IplImage* getImage() = 0;
	virtual void	  reset() = 0;
};

operator() 函数与 getImage() 功能应该是一致的,主要就是获得图像,为了方便与其他的类进行交互,这里生成的图像格式应该是:BGR 的,然后其它的检测方法如果利用的是其它的图片格式,则可以做适当的转换,reset() 重置指针,重新获取图像。

这所以定义这个类是因为想到扩展的问题,这样无论图像来自何方,只要符合该接口标准就可以使用该框架了。

SkinDetect:图像检测类,这个类主要完成的功能是检测图像,由于我的试验是有关肤色检测的,所以这个类就跟肤色检测相关了,如果为了扩展,可以进一步抽象,成为更基本的类:ImageDetect...,接口如下:

class SkinDetect{
public:
	SkinDetect()
		: _skin_counts(0)
		, _goods_counts(0)
	{}

	// src 与 res 的 row 和 col 一致, src 的格式一律为 BGR
	// 结果存放在 res 中
	virtual bool detected( IplImage* src, IplImage* res ) = 0;
	// 参数字符串化,这样有助于判断当前的参数值。
	virtual std::string toString() = 0;
	virtual ~SkinDetect() {}

	size_t getSkinCounts() { return _skin_counts;  }
	size_t getGoodsCounts(){ return _goods_counts; }

	// 结果图像中的灰度值含义:
	static const int BG_VALUE    = 0;		// 背景灰度值
	static const int SKIN_VALUE  = 255;		// 皮肤灰度值
	static const int GOODS_VALUE = 100;		// 商品灰度值

protected:
	size_t _skin_counts;
	size_t _goods_counts;
};///@~

之所以定义了 goods_counts 主要是因为这次实验跟商品也有关系,因此就把它放进基类了。值得注意的是,还定义了静态常量:BG_VALUE、SKIN_VALUE、GOODS_VALUE,这是因为我把图像分成了三部分:皮肤、商品、背景。不同的部分对应不同的颜色。

Action:动作类,这个类的功能主要是当检测返回 true 的时候执行相应的动作,接口如下:

/***********************************************
* 当判断符合条件的时候调用该类的方法进行处理
***********************************************/
class Action{
public:
	virtual void operator()(IplImage* src, IplImage* res) = 0;
	virtual ~Action(){};
};

只有一个公共接口:operator(),第一个参数为原图像,第二个参数为检测结果。

最后一个类是:JudgerFrameWork,该类引用上面的类进行自动化的检测,如下:

class JudgerFrameWork{
public:
	JudgerFrameWork( ImageGen& img_gen, SkinDetect& skin_detect, Action& action )
		: _img_gen(img_gen)
		, _skin_detect(skin_detect)
		, _action(action)
	{}
	void start()
	{
		for( IplImage* image = _img_gen.getImage(); image != NULL; image = _img_gen.getImage() )
		{
			IplImage* res = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1 );
			if( _skin_detect.detected( image, res ) )
			{
				_action( image, res );
				std::cout << "goods count:" << _skin_detect.getGoodsCounts() << std::endl;
				std::cout << "skins count:" << _skin_detect.getSkinCounts()  << std::endl;
			}
		}
	}
private:
	ImageGen& _img_gen;
	SkinDetect& _skin_detect;
	Action& _action;
};

所需要做的事情主要是创建相应的对象,然后构造 JudgerFrameWork 对象,当构造完对象后,只需调用函数:start() 即可完成所有的动作了。

设置这套框架前前后后修改了 N 次,主要是因为接口那里难以控制,有时候很难协调功能的分配。此外,如果设置的太过抽象,则又增加了开发的复杂度,如果抽象度不够,则又不利于扩展。

不禁感叹:开发大有学问在,接口设计功夫深!

时间: 2024-10-29 05:09:06

图像自动测试框架的相关文章

推荐几款最好的PHP自动测试框架

PHP语言有着飞速的发展,它可能已经不像你记忆中的那样,不再有复杂的程序式代码和庞大的系统,重生的PHP有着齐备的功能.支持面向对象.命名空间.以及逐步增多的可复用代码库.所以,你现在赶上了PHP最好的时光,可以更好地学习PHP,增强你的能力.下面推荐给大家在2015年值得使用的几款优秀的PHP自动测试框架. 1.Selenium Selenium自动化测试,它是用于web自动化测试的,但它的功能当然不限于这一点.目前已经有很多浏览器厂商将逐步支持Selenium.它即将成为一种核心技术. 2.

UiAutomator Android 的自动测试框架(基础)

</pre>很久没更新博客了,今天至后期的一段时间将带给大家的是<span style="font-family: 微软雅黑; font-size: 14px; line-height: 21px; widows: auto;">UiAutomator android的自动测试框架,一系列的介绍,希望大家喜欢.</span><p></p><p><span style="font-family: 微软

PHP自动测试框架Top 10

对于很多PHP开发新手来说,测试自己编写的代码是一个非常棘手的问题.如果出现问题,他们将不知道下一步该怎么做.花费很长的时间调试PHP代码是一个非常不明智的选择,最好的方法就是在编写应用程序代码之前就写好测试代码:www.itxdl.cn.自动化测试可以极大的缓解并改善PHP开发的工作流程,它能帮助开发人员管理大部分任务,使其更专注于开发逻辑的测试代码.本文将为大家介绍PHP自动测试框架Top 10,欢迎品鉴! PHPUnit PHP Unit是一个轻量级的PHP测试框架.它是在PHP 5下面对

WF+WCF+WPF第三天-WF实现一个软件自动测试框架

WF是一组顺序活动组成的流程,那么我们可以通过WF流程去实现自动化测试了:比如让WF自动去点击页面,对对应的控件输入值,自动的做些人为的操作. 模拟测试,而我们只要定制测试流程即可. 参考来源:http://www.cnblogs.com/zhuqil/archive/2010/04/20/TestflowFramework.html (来自麒麟大神的博客) 框架实现: StartFlow类用于流程的启动 Extensions类是框架中比较核心的一个扩展类:有两个方法GetForm 和GetCo

Appium自动测试框架常用API

1.元素定位 find_element()#可以进行二次封装 find_elements() find_element_by_id() find_elements_by_id() find_element_by_class_name() find_elements_by_class_name()...... 2.屏幕操作 scroll() #滚动 swipe() #滑动 drag_and_drop() #长按拖动 tap() #点击 get_screenshot_as_png() #截屏   3

Python自动单元测试框架(摘要笔记)

规范Python单元测试 原文:https://www.ibm.com/developerworks/cn/linux/l-pyunit/ 测试是一个贯穿于整个开发过程的连续过程,从某个意义上说,软件开发的过程实际上就是测试过程.正如Martin Fowler所说的"在你不知道如何测试代码之前,就不该编写程序.而一旦你完成了程序,测试代码也应该完成.除非测试成功,你不能认为你编写出了可以工作的程序." 测试最基本的原理就是比较预期结果是否与实际执行结果相同,如果相同则测试成功,否则测试

自动测试工具介绍

今天在网上寻找移动端自动化测试工具时,发现了一家提供免费的软件自动化测试工具的公司.这家公司提供了一系列的自动化软件测试工具.感觉还是不错的,这里介绍一下这些自动化测试软件 1.TestCenter TestCenter是面向测试流程和测试用例库的测试管理工具,它可以帮助您:测试用例的过程管理,对测试需求过程.测试用例设计过程.业务组件设计实现过程等 整个测试过程进行管理. 测试管理平台是构建测试流程.测试用例库的基础:● 标准化测试用例库构建支持手工测试用例和自动化测试用例,支持测试用例树型结

开源移动安全测试框架MobSF安装过程踩过的那些坑(一)

项目简介 移动安全框架 (MobSF) 是一个智能化.一体化的开源移动应用(Android / iOS)自动测试框架,能够对以上两种移动应用进行静态和动态分析(动态分析目前暂时只支持Android). 它可以有效.快速地对应用APK 和IPA文件 及压缩的源代码进行审计分析.同时,MobSF 也能够通过其API Fuzzer功能模块,对 Web API 的安全性进行检测,如收集信息,分析安全头部信息,识别移动API 的具体漏洞,如XXE.SSRF.路径遍历,IDOR以及其他的与会话和API调用速

[转] Python自动单元测试框架

一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件测试则是保证质量的关键措施.正像软件熵(software entropy)所描述的那样:一个程序从设计很好的状态开始,随着新的功能不断地加入,程序逐渐地失去了原有的结构,最终变成了一团乱麻(其实最初的"很好的状态"得加个问号).测试的目的说起来其实很简单也极具吸引力,那就是写出高质量的软件并解决软件熵这一问题. 可惜的是,软件开发人员很少能在编码