Commit 48903ef9 authored by Maksim Shabunin's avatar Maksim Shabunin

Added python aliases for face predict overloaded functions

parent 46dd2631
...@@ -256,7 +256,7 @@ public: ...@@ -256,7 +256,7 @@ public:
CV_WRAP virtual void update(InputArrayOfArrays src, InputArray labels); CV_WRAP virtual void update(InputArrayOfArrays src, InputArray labels);
/** @overload */ /** @overload */
CV_WRAP int predict(InputArray src) const; CV_WRAP_AS(predict_label) int predict(InputArray src) const;
/** @brief Predicts a label and associated confidence (e.g. distance) for a given input image. /** @brief Predicts a label and associated confidence (e.g. distance) for a given input image.
...@@ -300,12 +300,11 @@ public: ...@@ -300,12 +300,11 @@ public:
/** @brief - if implemented - send all result of prediction to collector that can be used for somehow custom result handling /** @brief - if implemented - send all result of prediction to collector that can be used for somehow custom result handling
@param src Sample image to get a prediction from. @param src Sample image to get a prediction from.
@param collector User-defined collector object that accepts all results @param collector User-defined collector object that accepts all results
@param state - optional user-defined state token that should be passed back from FaceRecognizer implementation
To implement this method u just have to do same internal cycle as in predict(InputArray src, CV_OUT int &label, CV_OUT double &confidence) but To implement this method u just have to do same internal cycle as in predict(InputArray src, CV_OUT int &label, CV_OUT double &confidence) but
not try to get "best@ result, just resend it to caller side with given collector not try to get "best@ result, just resend it to caller side with given collector
*/ */
CV_WRAP virtual void predict(InputArray src, Ptr<PredictCollector> collector, const int state = 0) const = 0; CV_WRAP_AS(predict_collect) virtual void predict(InputArray src, Ptr<PredictCollector> collector) const = 0;
/** @brief Saves a FaceRecognizer and its model state. /** @brief Saves a FaceRecognizer and its model state.
......
...@@ -42,7 +42,7 @@ public: ...@@ -42,7 +42,7 @@ public:
void train(InputArrayOfArrays src, InputArray labels); void train(InputArrayOfArrays src, InputArray labels);
// Send all predict results to caller side for custom result handling // Send all predict results to caller side for custom result handling
void predict(InputArray src, Ptr<PredictCollector> collector, const int state) const; void predict(InputArray src, Ptr<PredictCollector> collector) const;
}; };
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -99,7 +99,7 @@ void Eigenfaces::train(InputArrayOfArrays _src, InputArray _local_labels) { ...@@ -99,7 +99,7 @@ void Eigenfaces::train(InputArrayOfArrays _src, InputArray _local_labels) {
} }
} }
void Eigenfaces::predict(InputArray _src, Ptr<PredictCollector> collector, const int state) const { void Eigenfaces::predict(InputArray _src, Ptr<PredictCollector> collector) const {
// get data // get data
Mat src = _src.getMat(); Mat src = _src.getMat();
// make sure the user is passing correct data // make sure the user is passing correct data
...@@ -114,11 +114,11 @@ void Eigenfaces::predict(InputArray _src, Ptr<PredictCollector> collector, const ...@@ -114,11 +114,11 @@ void Eigenfaces::predict(InputArray _src, Ptr<PredictCollector> collector, const
} }
// project into PCA subspace // project into PCA subspace
Mat q = LDA::subspaceProject(_eigenvectors, _mean, src.reshape(1, 1)); Mat q = LDA::subspaceProject(_eigenvectors, _mean, src.reshape(1, 1));
collector->init((int)_projections.size(), state); collector->init(_projections.size());
for (size_t sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) { for (size_t sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) {
double dist = norm(_projections[sampleIdx], q, NORM_L2); double dist = norm(_projections[sampleIdx], q, NORM_L2);
int label = _labels.at<int>((int)sampleIdx); int label = _labels.at<int>((int)sampleIdx);
if (!collector->collect(label, dist, state))return; if (!collector->collect(label, dist))return;
} }
} }
......
...@@ -80,10 +80,10 @@ int FaceRecognizer::predict(InputArray src) const { ...@@ -80,10 +80,10 @@ int FaceRecognizer::predict(InputArray src) const {
} }
void FaceRecognizer::predict(InputArray src, CV_OUT int &label, CV_OUT double &confidence) const { void FaceRecognizer::predict(InputArray src, CV_OUT int &label, CV_OUT double &confidence) const {
Ptr<MinDistancePredictCollector> collector = MinDistancePredictCollector::create(getThreshold()); Ptr<StandardCollector> collector = StandardCollector::create(getThreshold());
predict(src, collector, 0); predict(src, collector);
label = collector->getLabel(); label = collector->getMinLabel();
confidence = collector->getDist(); confidence = collector->getMinDist();
} }
} }
......
...@@ -37,7 +37,7 @@ public: ...@@ -37,7 +37,7 @@ public:
void train(InputArrayOfArrays src, InputArray labels); void train(InputArrayOfArrays src, InputArray labels);
// Send all predict results to caller side for custom result handling // Send all predict results to caller side for custom result handling
void predict(InputArray src, Ptr<PredictCollector> collector, const int state) const; void predict(InputArray src, Ptr<PredictCollector> collector) const;
}; };
// Removes duplicate elements in a given vector. // Removes duplicate elements in a given vector.
...@@ -120,7 +120,7 @@ void Fisherfaces::train(InputArrayOfArrays src, InputArray _lbls) { ...@@ -120,7 +120,7 @@ void Fisherfaces::train(InputArrayOfArrays src, InputArray _lbls) {
} }
} }
void Fisherfaces::predict(InputArray _src, Ptr<PredictCollector> collector, const int state) const { void Fisherfaces::predict(InputArray _src, Ptr<PredictCollector> collector) const {
Mat src = _src.getMat(); Mat src = _src.getMat();
// check data alignment just for clearer exception messages // check data alignment just for clearer exception messages
if(_projections.empty()) { if(_projections.empty()) {
...@@ -134,11 +134,11 @@ void Fisherfaces::predict(InputArray _src, Ptr<PredictCollector> collector, cons ...@@ -134,11 +134,11 @@ void Fisherfaces::predict(InputArray _src, Ptr<PredictCollector> collector, cons
// project into LDA subspace // project into LDA subspace
Mat q = LDA::subspaceProject(_eigenvectors, _mean, src.reshape(1,1)); Mat q = LDA::subspaceProject(_eigenvectors, _mean, src.reshape(1,1));
// find 1-nearest neighbor // find 1-nearest neighbor
collector->init((int)_projections.size(), state); collector->init((int)_projections.size());
for (size_t sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) { for (size_t sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) {
double dist = norm(_projections[sampleIdx], q, NORM_L2); double dist = norm(_projections[sampleIdx], q, NORM_L2);
int label = _labels.at<int>((int)sampleIdx); int label = _labels.at<int>((int)sampleIdx);
if (!collector->collect(label, dist, state))return; if (!collector->collect(label, dist))return;
} }
} }
......
...@@ -92,7 +92,7 @@ public: ...@@ -92,7 +92,7 @@ public:
void update(InputArrayOfArrays src, InputArray labels); void update(InputArrayOfArrays src, InputArray labels);
// Send all predict results to caller side for custom result handling // Send all predict results to caller side for custom result handling
void predict(InputArray src, Ptr<PredictCollector> collector, const int state = 0) const; void predict(InputArray src, Ptr<PredictCollector> collector) const;
// See FaceRecognizer::load. // See FaceRecognizer::load.
void load(const FileStorage& fs); void load(const FileStorage& fs);
...@@ -383,7 +383,7 @@ void LBPH::train(InputArrayOfArrays _in_src, InputArray _in_labels, bool preserv ...@@ -383,7 +383,7 @@ void LBPH::train(InputArrayOfArrays _in_src, InputArray _in_labels, bool preserv
} }
} }
void LBPH::predict(InputArray _src, Ptr<PredictCollector> collector, const int state) const { void LBPH::predict(InputArray _src, Ptr<PredictCollector> collector) const {
if(_histograms.empty()) { if(_histograms.empty()) {
// throw error if no data (or simply return -1?) // throw error if no data (or simply return -1?)
String error_message = "This LBPH model is not computed yet. Did you call the train method?"; String error_message = "This LBPH model is not computed yet. Did you call the train method?";
...@@ -399,11 +399,11 @@ void LBPH::predict(InputArray _src, Ptr<PredictCollector> collector, const int s ...@@ -399,11 +399,11 @@ void LBPH::predict(InputArray _src, Ptr<PredictCollector> collector, const int s
_grid_y, /* grid size y */ _grid_y, /* grid size y */
true /* normed histograms */); true /* normed histograms */);
// find 1-nearest neighbor // find 1-nearest neighbor
collector->init((int)_histograms.size(), state); collector->init((int)_histograms.size());
for (size_t sampleIdx = 0; sampleIdx < _histograms.size(); sampleIdx++) { for (size_t sampleIdx = 0; sampleIdx < _histograms.size(); sampleIdx++) {
double dist = compareHist(_histograms[sampleIdx], query, HISTCMP_CHISQR_ALT); double dist = compareHist(_histograms[sampleIdx], query, HISTCMP_CHISQR_ALT);
int label = _labels.at<int>((int)sampleIdx); int label = _labels.at<int>((int)sampleIdx);
if (!collector->collect(label, dist, state))return; if (!collector->collect(label, dist))return;
} }
} }
......
/*
By downloading, copying, installing or using the software you agree to this license.
If you do not agree to this license, do not download, install,
copy or use the software.
License Agreement
For Open Source Computer Vision Library
(3-clause BSD License)
Copyright (C) 2000-2015, Intel Corporation, all rights reserved.
Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
Copyright (C) 2009-2015, NVIDIA Corporation, all rights reserved.
Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
Copyright (C) 2015, OpenCV Foundation, all rights reserved.
Copyright (C) 2015, Itseez Inc., all rights reserved.
Third party copyrights are property of their respective owners.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the names of the copyright holders nor the names of the contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
This software is provided by the copyright holders and contributors "as is" and
any express or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular purpose are disclaimed.
In no event shall copyright holders or contributors be liable for any direct,
indirect, incidental, special, exemplary, or consequential damages
(including, but not limited to, procurement of substitute goods or services;
loss of use, data, or profits; or business interruption) however caused
and on any theory of liability, whether in contract, strict liability,
or tort (including negligence or otherwise) arising in any way out of
the use of this software, even if advised of the possibility of such damage.
*/
#include "opencv2/face/predict_collector.hpp"
#include "opencv2/core/cvstd.hpp"
#include <iterator>
namespace cv {
namespace face {
CV_WRAP bool MapPredictCollector::emit(const int label, const double dist, const int state)
{
((void)state);
//if already in index check which is closer
if (_idx->find(label) != _idx->end()) {
double current = (*_idx)[label];
if (dist < current) {
(*_idx)[label] = dist;
}
}
else {
(*_idx)[label] = dist;
}
return true;
}
Ptr<std::map<int, double> > MapPredictCollector::getResult()
{
return _idx;
}
CV_WRAP std::vector<std::pair<int, double> > MapPredictCollector::getResultVector()
{
std::vector<std::pair<int, double> > result;
std::copy(_idx->begin(), _idx->end(), std::back_inserter(result));
return result;
}
CV_WRAP Ptr<MapPredictCollector> MapPredictCollector::create(double threshold)
{
return Ptr<MapPredictCollector>(new MapPredictCollector(threshold));
}
}
}
\ No newline at end of file
/*
By downloading, copying, installing or using the software you agree to this license.
If you do not agree to this license, do not download, install,
copy or use the software.
License Agreement
For Open Source Computer Vision Library
(3-clause BSD License)
Copyright (C) 2000-2015, Intel Corporation, all rights reserved.
Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
Copyright (C) 2009-2015, NVIDIA Corporation, all rights reserved.
Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
Copyright (C) 2015, OpenCV Foundation, all rights reserved.
Copyright (C) 2015, Itseez Inc., all rights reserved.
Third party copyrights are property of their respective owners.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the names of the copyright holders nor the names of the contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
This software is provided by the copyright holders and contributors "as is" and
any express or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular purpose are disclaimed.
In no event shall copyright holders or contributors be liable for any direct,
indirect, incidental, special, exemplary, or consequential damages
(including, but not limited to, procurement of substitute goods or services;
loss of use, data, or profits; or business interruption) however caused
and on any theory of liability, whether in contract, strict liability,
or tort (including negligence or otherwise) arising in any way out of
the use of this software, even if advised of the possibility of such damage.
*/
#include "opencv2/face/predict_collector.hpp"
#include "opencv2/core/cvstd.hpp"
namespace cv {
namespace face {
bool MinDistancePredictCollector::emit(const int label, const double dist, const int state) {
((void)state);
_label = label;
_dist = dist;
return true;
}
CV_WRAP bool MinDistancePredictCollector::filter(int* label, double* dist, const int state)
{
((void)label);
((void)state);
return *dist < _dist;
}
int MinDistancePredictCollector::getLabel() const {
return _label;
}
double MinDistancePredictCollector::getDist() const {
return _dist;
}
Ptr<MinDistancePredictCollector> MinDistancePredictCollector::create(double threshold) {
return Ptr<MinDistancePredictCollector>(new MinDistancePredictCollector(threshold));
}
}
}
\ No newline at end of file
...@@ -42,117 +42,73 @@ or tort (including negligence or otherwise) arising in any way out of ...@@ -42,117 +42,73 @@ or tort (including negligence or otherwise) arising in any way out of
the use of this software, even if advised of the possibility of such damage. the use of this software, even if advised of the possibility of such damage.
*/ */
#include "opencv2/face/predict_collector.hpp" #include "opencv2/face/predict_collector.hpp"
#include "opencv2/core/cvstd.hpp"
namespace cv {
namespace face {
namespace cv {namespace face {
void PredictCollector::init(const int size, const int state) { static std::pair<int, double> toPair(const StandardCollector::PredictResult & val) {
//reserve for some-how usage in descendants return std::make_pair(val.label, val.distance);
_size = size;
_state = state;
} }
CV_WRAP bool PredictCollector::defaultFilter(int * label, double * dist, const int state) static bool pairLess(const std::pair<int, double> & lhs, const std::pair<int, double> & rhs) {
{ return lhs.second < rhs.second;
// if state provided we should compare it with current state
if (_state != 0 && _state != state) {
return false;
}
// if exclude label provided we can test it first
if (_excludeLabel != 0 && _excludeLabel == *label) {
return false;
}
// initially we must recalculate distance by koef iv given
if (_distanceKoef != 1) {
*dist = *dist * _distanceKoef;
}
// check upper threshold
if (*dist > _threshold) {
return false;
}
//check inner threshold
if (*dist < _minthreshold) {
return false;
}
return true;
} }
CV_WRAP bool PredictCollector::filter(int* label, double* dist, const int state) //===================================
{
((void)label); StandardCollector::StandardCollector(double threshold_) : threshold(threshold_) {
((void)dist); init(0);
((void)state);
return true; //no custom logic at base level
} }
bool PredictCollector::emit(const int label, const double dist, const int state) { void StandardCollector::init(size_t size) {
((void)label); minRes = PredictResult();
((void)dist); data.clear();
((void)state); data.reserve(size);
return false; // terminate prediction - no any behavior in base PredictCollector
} }
CV_WRAP bool PredictCollector::collect(int label, double dist, const int state) bool StandardCollector::collect(int label, double dist) {
{ if (dist < threshold)
if (defaultFilter(&label, &dist, state) && filter(&label,&dist,state)) { {
return emit(label, dist, state); PredictResult res(label, dist);
if (res.distance < minRes.distance)
minRes = res;
data.push_back(res);
} }
return true; return true;
} }
CV_WRAP int PredictCollector::getSize() int StandardCollector::getMinLabel() const {
{ return minRes.label;
return _size;
} }
CV_WRAP void PredictCollector::setSize(int size) double StandardCollector::getMinDist() const {
{ return minRes.distance;
_size = size;
} }
CV_WRAP int PredictCollector::getState() std::vector< std::pair<int, double> > StandardCollector::getResults(bool sorted) const {
{ std::vector< std::pair<int, double> > res(data.size());
return _state; std::transform(data.begin(), data.end(), res.begin(), &toPair);
} if (sorted)
{
CV_WRAP void PredictCollector::setState(int state) std::sort(res.begin(), res.end(), &pairLess);
{ }
_state = state; return res;
} }
CV_WRAP int PredictCollector::getExcludeLabel() std::map<int, double> StandardCollector::getResultsMap() const {
{ std::map<int, double> res;
return _excludeLabel; for (std::vector<PredictResult>::const_iterator i = data.begin(); i != data.end(); ++i) {
} std::map<int, double>::iterator j = res.find(i->label);
if (j == res.end()) {
CV_WRAP void PredictCollector::setExcludeLabel(int excludeLabel) res.insert(toPair(*i));
{ } else if (i->distance < j->second) {
_excludeLabel = excludeLabel; j->second = i->distance;
} }
}
CV_WRAP double PredictCollector::getDistanceKoef() return res;
{
return _distanceKoef;
}
CV_WRAP void PredictCollector::setDistanceKoef(double distanceKoef)
{
_distanceKoef = distanceKoef;
}
CV_WRAP double PredictCollector::getMinThreshold()
{
return _minthreshold;
} }
CV_WRAP void PredictCollector::setMinThreshold(double minthreshold) Ptr<StandardCollector> StandardCollector::create(double threshold) {
{ return makePtr<StandardCollector>(threshold);
_minthreshold = minthreshold;
} }
} }} // cv::face::
}
\ No newline at end of file
/*
By downloading, copying, installing or using the software you agree to this license.
If you do not agree to this license, do not download, install,
copy or use the software.
License Agreement
For Open Source Computer Vision Library
(3-clause BSD License)
Copyright (C) 2000-2015, Intel Corporation, all rights reserved.
Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
Copyright (C) 2009-2015, NVIDIA Corporation, all rights reserved.
Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
Copyright (C) 2015, OpenCV Foundation, all rights reserved.
Copyright (C) 2015, Itseez Inc., all rights reserved.
Third party copyrights are property of their respective owners.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the names of the copyright holders nor the names of the contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
This software is provided by the copyright holders and contributors "as is" and
any express or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular purpose are disclaimed.
In no event shall copyright holders or contributors be liable for any direct,
indirect, incidental, special, exemplary, or consequential damages
(including, but not limited to, procurement of substitute goods or services;
loss of use, data, or profits; or business interruption) however caused
and on any theory of liability, whether in contract, strict liability,
or tort (including negligence or otherwise) arising in any way out of
the use of this software, even if advised of the possibility of such damage.
*/
#include "opencv2/face/predict_collector.hpp"
#include "opencv2/core/cvstd.hpp"
namespace cv {
namespace face {
CV_WRAP bool StatPredictCollector::emit(const int label, const double dist, const int state) {
((void)state);
((void)label);
_count++;
_sum += dist;
if (_min > dist) {
_min = dist;
}
if (_max < dist) {
_max = dist;
}
return true;
}
CV_WRAP double StatPredictCollector::getMin()
{
return _min;
}
CV_WRAP double StatPredictCollector::getMax()
{
return _max;
}
CV_WRAP double StatPredictCollector::getSum()
{
return _sum;
}
CV_WRAP int StatPredictCollector::getCount()
{
return _count;
}
CV_WRAP Ptr<StatPredictCollector> StatPredictCollector::create(double threshold) {
return Ptr<StatPredictCollector>(new StatPredictCollector(threshold));
}
}
}
\ No newline at end of file
/*
By downloading, copying, installing or using the software you agree to this license.
If you do not agree to this license, do not download, install,
copy or use the software.
License Agreement
For Open Source Computer Vision Library
(3-clause BSD License)
Copyright (C) 2000-2015, Intel Corporation, all rights reserved.
Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
Copyright (C) 2009-2015, NVIDIA Corporation, all rights reserved.
Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
Copyright (C) 2015, OpenCV Foundation, all rights reserved.
Copyright (C) 2015, Itseez Inc., all rights reserved.
Third party copyrights are property of their respective owners.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the names of the copyright holders nor the names of the contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
This software is provided by the copyright holders and contributors "as is" and
any express or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular purpose are disclaimed.
In no event shall copyright holders or contributors be liable for any direct,
indirect, incidental, special, exemplary, or consequential damages
(including, but not limited to, procurement of substitute goods or services;
loss of use, data, or profits; or business interruption) however caused
and on any theory of liability, whether in contract, strict liability,
or tort (including negligence or otherwise) arising in any way out of
the use of this software, even if advised of the possibility of such damage.
*/
#include "opencv2/face/predict_collector.hpp"
#include "opencv2/core/cvstd.hpp"
namespace cv {
namespace face {
CV_WRAP bool StdPredictCollector::emit(const int label, const double dist, const int state) {
((void)state);
((void)label);
_s += pow(dist - _avg, 2);
_n++;
return true;
}
CV_WRAP double StdPredictCollector::getResult() {
return sqrt(_s / (_n - 1));
}
CV_WRAP Ptr<StdPredictCollector> StdPredictCollector::create(double threshold, double avg) {
return Ptr<StdPredictCollector>(new StdPredictCollector(threshold, avg));
}
}
}
\ No newline at end of file
/*
By downloading, copying, installing or using the software you agree to this license.
If you do not agree to this license, do not download, install,
copy or use the software.
License Agreement
For Open Source Computer Vision Library
(3-clause BSD License)
Copyright (C) 2000-2015, Intel Corporation, all rights reserved.
Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
Copyright (C) 2009-2015, NVIDIA Corporation, all rights reserved.
Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
Copyright (C) 2015, OpenCV Foundation, all rights reserved.
Copyright (C) 2015, Itseez Inc., all rights reserved.
Third party copyrights are property of their respective owners.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the names of the copyright holders nor the names of the contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
This software is provided by the copyright holders and contributors "as is" and
any express or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular purpose are disclaimed.
In no event shall copyright holders or contributors be liable for any direct,
indirect, incidental, special, exemplary, or consequential damages
(including, but not limited to, procurement of substitute goods or services;
loss of use, data, or profits; or business interruption) however caused
and on any theory of liability, whether in contract, strict liability,
or tort (including negligence or otherwise) arising in any way out of
the use of this software, even if advised of the possibility of such damage.
*/
#include "opencv2/face/predict_collector.hpp"
#include "opencv2/core/cvstd.hpp"
#include <iterator> // std::back_inserter
namespace cv {
namespace face {
CV_WRAP bool TopNPredictCollector::emit(const int label, const double dist, const int state)
{
((void)state);
std::pair<int, double> p = std::make_pair(label, dist);
if (_idx->size() == 0 || p.second <= _idx->front().second) {
_idx->push_front(p);
} else if (p.second >= _idx->back().second) {
_idx->push_back(p);
}
else {
typedef std::list<std::pair<int,double> >::iterator it_type;
for (it_type i = _idx->begin(); i != _idx->end(); i++) {
if (p.second <= i->second) {
_idx->insert(i, p);
break;
}
}
}
return true;
}
CV_WRAP bool TopNPredictCollector::filter(int * label, double * dist, const int state)
{
((void)state);
if (_idx->size() < _size)return true; //not full - can insert;
if (*dist >= _idx->back().second)return false; //too far distance
for (std::list<std::pair<int, double> >::iterator it = _idx->begin(); it != _idx->end(); ++it) {
if (it->first == *label) {
if (it->second <= *dist) {
return false; //has more close
}
else {
_idx->erase(it);
return true; //no more require pop_back
}
}
}
_idx->pop_back();
return true;
}
CV_WRAP Ptr<std::list<std::pair<int, double> > > TopNPredictCollector::getResult()
{
return _idx;
}
CV_WRAP std::vector<std::pair<int, double> > TopNPredictCollector::getResultVector()
{
std::vector<std::pair<int, double> > result;
std::copy(_idx->begin(), _idx->end(), std::back_inserter(result));
return result;
}
CV_WRAP Ptr<TopNPredictCollector> TopNPredictCollector::create(size_t size, double threshold)
{
return Ptr<TopNPredictCollector>(new TopNPredictCollector(size, threshold));
}
}
}
\ No newline at end of file
/*
By downloading, copying, installing or using the software you agree to this license.
If you do not agree to this license, do not download, install,
copy or use the software.
License Agreement
For Open Source Computer Vision Library
(3-clause BSD License)
Copyright (C) 2000-2015, Intel Corporation, all rights reserved.
Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
Copyright (C) 2009-2015, NVIDIA Corporation, all rights reserved.
Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
Copyright (C) 2015, OpenCV Foundation, all rights reserved.
Copyright (C) 2015, Itseez Inc., all rights reserved.
Third party copyrights are property of their respective owners.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the names of the copyright holders nor the names of the contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
This software is provided by the copyright holders and contributors "as is" and
any express or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular purpose are disclaimed.
In no event shall copyright holders or contributors be liable for any direct,
indirect, incidental, special, exemplary, or consequential damages
(including, but not limited to, procurement of substitute goods or services;
loss of use, data, or profits; or business interruption) however caused
and on any theory of liability, whether in contract, strict liability,
or tort (including negligence or otherwise) arising in any way out of
the use of this software, even if advised of the possibility of such damage.
*/
#include "opencv2/face/predict_collector.hpp"
#include "opencv2/core/cvstd.hpp"
namespace cv {
namespace face {
CV_WRAP bool VectorPredictCollector::emit(const int label, const double dist, const int state)
{
((void)state);
_idx->push_back(std::pair<int, double>(label, dist));
return true;
}
Ptr<std::vector<std::pair<int, double> > > VectorPredictCollector::getResult()
{
return _idx;
}
CV_WRAP std::vector<std::pair<int, double> > VectorPredictCollector::getResultVector()
{
return (*_idx);
}
CV_WRAP Ptr<VectorPredictCollector> VectorPredictCollector::create(double threshold)
{
return Ptr<VectorPredictCollector>(new VectorPredictCollector(threshold));
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment