图像自动测试框架

来源:互联网 发布:现代汉语词典软件 编辑:程序博客网 时间:2024/04/30 08:21

最近在做关于 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 次,主要是因为接口那里难以控制,有时候很难协调功能的分配。此外,如果设置的太过抽象,则又增加了开发的复杂度,如果抽象度不够,则又不利于扩展。

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

0 0
原创粉丝点击