CascadeClassifier中MaskGenerator的含义与用法

使用HOGDescirptor可以实现ROI区域的检测,但是使用CascadeClassifier不能使用ROI检测,查看CascadeClassifier的类定义可以看到这样一个子类

public:

class CV_EXPORTS MaskGenerator

{

public:

virtual ~MaskGenerator() {}

virtual cv::Mat generateMask(const cv::Mat& src)=0;

virtual void initializeMask(const cv::Mat& /*src*/) {};

};

void setMaskGenerator(Ptr<MaskGenerator> maskGenerator);

Ptr<MaskGenerator> getMaskGenerator();

void setFaceDetectionMaskGenerator();

protected:

Ptr<MaskGenerator> maskGenerator;

这应该是设置检测图像的MASK吧,而且比ROI好用哦,因为使用SetROI只可以设置一个区域,而不可以设置多个区域。知道了这个类的作用赶快来大展身手一下吧。因为这个类定义的是子类,而且不能传入MASK区域进行设置,这样就需要我们定义自己的MASKGenerator类产生mask

class MaskGenerator : public CascadeClassifier::MaskGenerator

// 注意必须声明为public,否则不会调用该类的中的成员函数,编译和运行的时候也不会报错,因为类默认为私有继承,参考《C/C++->类的继承与多态》

{

public:

MaskGenerator(){

width = 0;

height = 0;

mask = NULL;

}

~MaskGenerator() {

if (mask != NULL)

cvReleaseImage(&mask);

}

// 根据当前图像产生mask区域

cv::Mat generateMask(const cv::Mat& src)

{

width = src.cols;

height = src.rows;

// 关于智能指针是否需要手动释放内存有待考究,可以参考《C/C++->智能指针的使用方法》

// 必须手动释放

if (mask != NULL)

cvReleaseImage(&mask);

mask = cvCreateImage(cvSize(width, height), 8, 1);

cvZero(mask);

// 可以按照自己的需求设置ROI区域

cvSetImageROI(mask, cvRect(0, 0, width/2, height/2));

cvSet(mask, cvScalarAll(255));

cvResetImageROI(mask);

//cvShowImage("mask", mask);

//cvWaitKey(0);

return (Mat)mask;

}

// 对当前图像进行操作

void initializeMask(const cv::Mat& /*src*/) {};

private:

int width;

int height;

IplImage *mask;

};

在使用该MaskGenerator之前需要调用setMaskGenerator设置mask,其实就是相当于设置一个回调函数或者说回调类

CascadeClassifier *cascade = new CascadeClassifier;

cascade->load("hogcascade_pedestrians.xml");

vector<Rect> object;

Ptr<MaskGenerator> mask = new MaskGenerator;

cascade->setMaskGenerator(mask);

cascade->detectMultiScale(srcGrayImg, object);

特别提示:该方法只适合设置traincascade产生的新分类器,不适合haartrainning产生旧分类器。

下面我们来看一下该mask在目标检测的过程中是如何使用的吧

1) 在detectMultiScale函数中,进行金字塔检测之前调用initializeMask函数进行对图像的其他初始化操作

if (!maskGenerator.empty()) {

maskGenerator->initializeMask(image);

}

需要注意的是在这里最好不要做缩放image的操作,因为image是需要自己外部释放的,缩放后就改变了图像的内存,释放时会出现内存泄露的情况;在initializeMask函数可以获取图像的尺寸等操作以便按照缩放比例在generateMask函数中设置mask区域

2) 金字塔检测也就是调用detectSingleScale函数中调用generateMask产生mask区域

Mat currentMask;

if (!maskGenerator.empty()) {

currentMask=maskGenerator->generateMask(image);

}

因为这里是每缩放一次图像调用一次,所以每次调用的时候image的尺寸都是发生变化的,那么我们就可以在generateMask中根据图像的尺寸产生mask区域

3) 在检测时候,滑动图像的过程中首先检测起始坐标点是否为mask区域中的点,如果该点为mask区域中的点就跳过该检测窗口,这一过程可以在CascadeClassifierInvoker的operator()函数中看到

if ( (!mask.empty()) && (mask.at<uchar>(Point(x,y))==0)) {    continue;  }

时间: 2024-10-07 10:30:33

CascadeClassifier中MaskGenerator的含义与用法的相关文章

php学习日记1(关于Thinkphp框架中D的含义和用法)

D方法 D方法应该是用的比较多的方法了,用于实例化自定义模型类,是ThinkPHP框架对Model类实例化的一种封装,并实现了单例模式,支持跨项目和分组调用,调用格式如下:D('[项目://][分组/]模型','模型层名称')方法的返回值是实例化的模型对象. D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化Model基类,同时对于已实例化过的模型,不会重复去实例化.D方法最常用的用法就是实例化当前项目的某个自定义模型,例如: // 实例化User模型

关于判断语句中如:while not xx: 或者:if not xx: 的含义及用法解析

关于判断语句中如:while not xx: 或者:if not xx: 的含义及用法解析 name='' while not name: name=raw_input(u'请输入姓名:') print name python中的not具体表示是什么: 在python中not是逻辑判断词,用于布尔型True和False,not True为False,not False为True,以下是几个常用的not的用法: (1) not与逻辑判断句if连用,代表not后面的表达式为False的时候,执行冒号

C++ main函数中参数argc和argv含义及用法

argc 是 argument count的缩写,表示传入main函数的参数个数: argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0]一定是程序的名称,并且包含了程序所在的完整路径,所以确切的说需要我们输入的main函数的参数个数应该是argc-1个: 第一个参数argc用来存放命令行参数的个数第二个参数argv是指针数组,它是用来存放命令行中各个参数和命令字的字符串的 具体可看:C++ main函数中参数argc和argv含义

C/C++中的const真正的用法

const基础知识(用法.含义.好处) intmain() { constint a; intconst b; constint *c; int* const d; constint * const e ; return0; } Intfunc1(const ) 初级理解:const是定义常量==>const意味着只读 含义: //第一个第二个意思一样代表一个常整形数 //第三个c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改) //第四个d常指针(指针变量不能被修改,但

linux-man命令中的编号含义(包括系统调用和库函数讲解)

博文说明[前言]: 本文将通过个人口吻介绍linux的man命令中的编号含义(包括系统调用和库函数解释),在目前时间点[2017年6月13号]下,所掌握的技术水平有限,可能会存在不少知识理解不够深入或全面,望大家指出问题共同交流,在后续工作及学习中如发现本文内容与实际情况有所偏差,将会完善该博文内容. 本文参考文献引用链接: 1.http://www.cnblogs.com/chao1118/p/3715523.html2.http://blog.csdn.net/high_high/artic

instanceof的含义和用法

首先,先解释一下instanceof是什么,instanceof是Java.php的一个二元操作符(运算符),和==,>,<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据.可以用来判断继承中的子类的实例是否为父类的实现.相当于c#中的is操作符.java中的instanceof运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者

(转)C++中extern “C”含义深层探索

(转)C++中extern "C"含义深层探索  1.引言 C++语言的创建初衷是"a better C",但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为"不彻底地面向对象"),因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同.

Apache中的Order Allow,Deny用法详解

本文讲述了Apache中的Order Allow,Deny用法.分享给大家供大家参考,具体如下: Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directory, Location, Files等),用来控制目录和文件的访问授权. 所以,最常用的是: Order Deny,Allow Allow from All 注意"Deny,Allow"中间只有一个逗号,也只能有一个逗号,有空格都会出错:单词的大小写不限.上面设定的含义是先设定"

php中get_cfg_var()和ini_get()的用法及区别

php里get_cfg_var()和ini_get()都是取得配置值的函数,当你需要获取php.ini里的某个选项的配置值时,这两个函数都都可以使用,得到的结果是一样的. 不过,get_cfg_var()和ini_get()也有一些区别,这便是本文要谈的内容. 在说这两个函数区别之前,我们先来了解一下它们的含义及用法. 有关ini_get()的用法,前面有一篇<php用ini_get获取php.ini里变量值的方法>,这里不再累赘. 下面主要说说get_cfg_var()函数. get_cfg