opencv类简单分析: CascadeClassifier
Posted arvik
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv类简单分析: CascadeClassifier相关的知识,希望对你有一定的参考价值。
理解级联分类器
分类器: 判别某个事物是否属于某种分类的器件,两种结果:是
、否
级联分类器: 可以理解为将N个单类的分类器串联起来。如果一个事物能属于这一系列串联起来的的所有分类器,则最终结果就是 是
,若有一项不符,则判定为否
比如人脸,它有很多属性,我们将每个属性做一成个分类器,如果一个模型符合了我们定义的人脸的所有属性,则我们人为这个模型就是一个人脸。那么这些属性是指什么呢? 比如人脸需要有两条眉毛,两只眼睛,一个鼻子,一张嘴,一个大概U形状的下巴或者是轮廓等等
定义
定义以及函数解释都在源码中注明了
class CV_EXPORTS_W CascadeClassifier
public:
CV_WRAP CascadeClassifier();
//从文件中加载级联分类器
CV_WRAP CascadeClassifier(const String& filename);
~CascadeClassifier();
//检测级联分类器是否被加载
CV_WRAP bool empty() const;
//从文件中加载级联分类器
CV_WRAP bool load( const String& filename );
//从FileStorage节点读取分类器
CV_WRAP bool read( const FileNode& node );
/** 检测输入图像中不同大小的对象。检测到的对象以矩形列表的形式返回。
参数:
image: 包含检测对象的图像的CV_8U类型矩阵
objects: 矩形的向量,其中每个矩形包含被检测的对象,矩形可以部分位于原始图像之外
scaleFactor: 指定在每个图像缩放时的缩放比例
minNeighbors:指定每个候选矩形需要保留多少个相邻矩形
flags:含义与函数cvHaarDetectObjects中的旧级联相同。它不用于新的级联
minSize:对象最小大小,小于该值的对象被忽略。
maxSize:最大可能的对象大小,大于这个值的对象被忽略
该函数与TBB库并行
*/
CV_WRAP void detectMultiScale( InputArray image,
CV_OUT std::vector<Rect>& objects,
double scaleFactor = 1.1,
int minNeighbors = 3, int flags = 0,
Size minSize = Size(),
Size maxSize = Size() );
/**
detectMultiScale重载函数
参数:
image:包含检测对象的图像的CV_8U类型矩阵
objects: 矩形的向量,其中每个矩形包含被检测的对象,矩形可以部分位于原始图像之外
numDetections: 对应对象的检测编号向量。一个物体被探测到的次数是相邻的被积极分类的矩形的数量,这些矩形被连接在一起形成物体
scaleFactor: 指定在每个图像缩放时的缩放比例
minNeighbors:指定每个候选矩形需要保留多少个相邻矩形
flags:含义与函数cvHaarDetectObjects中的旧级联相同。它不用于新的级联
minSize:对象最小大小,小于该值的对象被忽略。
maxSize:最大可能的对象大小,大于这个值的对象被忽略
*/
CV_WRAP_AS(detectMultiScale2) void detectMultiScale( InputArray image,
CV_OUT std::vector<Rect>& objects,
CV_OUT std::vector<int>& numDetections,
double scaleFactor=1.1,
int minNeighbors=3, int flags=0,
Size minSize=Size(),
Size maxSize=Size() );
/**
detectMultiScale重载函数,此函数允许您检索分类的最终阶段决策确定性
为此,需要将' outputRejectLevels '设置为true,并提供' rejectLevels '和' levelWeights '参数。
对于每一个结果检测,‘levelWeights’将在最后阶段包含分类的确定性。
这个值可以用来区分强分类和弱分类。
具体使用示例代码
Mat img;
vector<double> weights;
vector<int> levels;
vector<Rect> detections;
CascadeClassifier model("/path/to/your/model.xml");
model.detectMultiScale(img, detections, levels, weights, 1.1, 3, 0, Size(), Size(), true);
cerr << "Detection " << detections[0] << " with weight " << weights[0] << endl;
*/
CV_WRAP_AS(detectMultiScale3) void detectMultiScale( InputArray image,
CV_OUT std::vector<Rect>& objects,
CV_OUT std::vector<int>& rejectLevels,
CV_OUT std::vector<double>& levelWeights,
double scaleFactor = 1.1,
int minNeighbors = 3, int flags = 0,
Size minSize = Size(),
Size maxSize = Size(),
bool outputRejectLevels = false );
CV_WRAP bool isOldFormatCascade() const;
CV_WRAP Size getOriginalWindowSize() const;
CV_WRAP int getFeatureType() const;
void* getOldCascade();
CV_WRAP static bool convert(const String& oldcascade, const String& newcascade);
void setMaskGenerator(const Ptr<BaseCascadeClassifier::MaskGenerator>& maskGenerator);
Ptr<BaseCascadeClassifier::MaskGenerator> getMaskGenerator();
Ptr<BaseCascadeClassifier> cc;
;
在opencv_source_code/samples/python/facedetect.py
中可以找到一个使用级联分类器的人脸检测示例
例子
以下代码是opencv的一个简单的基于Haar特征的一个人脸级联分类器检测人脸的极简例子
#include <opencv2/opencv.hpp>
#define CV_COLOR_RED cv::Scalar(0, 0, 255)
int main(int argc, char** argv)
cv::CascadeClassifier faceDetector("haarcascade_frontalface_alt2.xml");
cv::Mat image = cv::imread("Your image path.");
std::vector<cv::Rect> objects;
faceDetector.detectMultiScale(image, objects);
for (int i = 0; i < objects.size(); i++)
cv::rectangle(image, objects[i], CV_COLOR_RED);
cv::imshow("result", image);
cv::waitKey(0);
return 0;
效果:
以上是关于opencv类简单分析: CascadeClassifier的主要内容,如果未能解决你的问题,请参考以下文章
opencv类简单分析:RectCvRectFrameRectangleSizeRotatedRect
opencv类简单分析: CascadeClassifier