1
/** ===========================================================
4
* This file is a part of libface project
5
* <a href="http://libface.sourceforge.net">http://libface.sourceforge.net</a>
8
* @brief Haar cascades parser
11
* @author Copyright (C) 2010 by Aditya Bhatt
12
* <a href="adityabhatt at gmail dot com">adityabhatt at gmail dot com</a>
13
* @author Copyright (C) 2010 by Gilles Caulier
14
* <a href="mailto:caulier dot gilles at gmail dot com">caulier dot gilles at gmail dot com</a>
18
* This program is free software; you can redistribute it
19
* and/or modify it under the terms of the GNU General
20
* Public License as published by the Free Software Foundation;
21
* either version 2, or (at your option)
24
* This program is distributed in the hope that it will be useful,
25
* but WITHOUT ANY WARRANTY; without even the implied warranty of
26
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27
* GNU General Public License for more details.
29
* ============================================================ */
41
#if defined (__APPLE__)
45
#include <opencv/cv.h>
46
#include <opencv/highgui.h>
49
#include "Haarcascades.h"
51
// TODO: Free memory before erasing cascades from vector, LOTS of exception handling
58
class Haarcascades::HaarcascadesPriv
68
std::string cascadePath;
69
std::vector<Cascade> cascades;
70
std::vector<int> weights;
74
Haarcascades::Haarcascades(const string& path)
75
: d(new HaarcascadesPriv)
77
this->d->cascadePath = path;
80
Haarcascades::~Haarcascades()
87
void Haarcascades::addCascade(const Cascade& newCascade, int newWeight)
89
if (this->hasCascade(newCascade.name))
92
d->cascades.push_back(newCascade);
93
d->weights.push_back(newWeight);
97
void Haarcascades::addCascade(const string& name, int newWeight)
99
if (this->hasCascade(name))
103
newCascade.name = name;
104
newCascade.haarcasc = (CvHaarClassifierCascade*) cvLoad((d->cascadePath + string("/") + name).data(), 0, 0, 0);
105
this->addCascade(newCascade, newWeight);
108
bool Haarcascades::hasCascade(const string& name) const
110
for (int i = 0; i < d->size-1; ++i)
112
if (name == d->cascades[i].name)
118
void Haarcascades::removeCascade(const string& name)
121
for (i = 0; i < d->size-1; ++i)
123
if (name == d->cascades[i].name)
127
d->cascades.erase(d->cascades.begin() + i);
128
d->weights.erase(d->weights.begin() + i);
132
void Haarcascades::removeCascade(int index)
134
d->cascades.erase(d->cascades.begin() + index);
135
d->weights.erase(d->weights.begin() + index);
139
int Haarcascades::getWeight(const string& name) const
141
for (int i = 0; i < d->size-1; ++i)
143
if (name == d->cascades[i].name)
144
return d->weights[i];
146
return -1; // No such name found, return -1
149
int Haarcascades::getWeight(int index) const
151
return d->weights[index];
154
void Haarcascades::setWeight(const string& name, int weight)
157
for (i = 0; i < d->size-1; ++i)
159
if (name == d->cascades[i].name)
163
d->weights[i] = weight;
166
void Haarcascades::setWeight(int index, int weight)
168
d->weights[index] = weight;
171
const Cascade& Haarcascades::getCascade(const string& name) const
174
for (i = 0; i < d->size-1; ++i)
176
if (name == d->cascades[i].name)
179
return d->cascades[i];
182
const Cascade& Haarcascades::getCascade(int index) const
184
return d->cascades[index];
187
int Haarcascades::getSize() const
192
void Haarcascades::clear()
194
for(unsigned int i = 0; i < d->cascades.size(); ++i)
196
cvReleaseHaarClassifierCascade(&d->cascades[i].haarcasc);
203
} // namespace libface