You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
4.5 KiB
124 lines
4.5 KiB
/*
|
|
* Copyright (c) 2011. Philipp Wagner <bytefish[at]gmx[dot]de>.
|
|
* Released under terms of the BSD Simplified license.
|
|
*
|
|
* 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 name of the organization nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* See <http://www.opensource.org/licenses/bsd-license>
|
|
*/
|
|
|
|
|
|
#ifndef __HELPER_HPP__
|
|
#define __HELPER_HPP__
|
|
|
|
#include "opencv2/core/core.hpp"
|
|
|
|
#include <vector>
|
|
#include <set>
|
|
|
|
using namespace cv;
|
|
using namespace std;
|
|
|
|
// Removes duplicate elements in a given vector.
|
|
template<typename _Tp>
|
|
inline vector<_Tp> remove_dups(const vector<_Tp>& src) {
|
|
typedef typename set<_Tp>::const_iterator constSetIterator;
|
|
typedef typename vector<_Tp>::const_iterator constVecIterator;
|
|
set<_Tp> set_elems;
|
|
for (constVecIterator it = src.begin(); it != src.end(); ++it)
|
|
set_elems.insert(*it);
|
|
vector<_Tp> elems;
|
|
for (constSetIterator it = set_elems.begin(); it != set_elems.end(); ++it)
|
|
elems.push_back(*it);
|
|
return elems;
|
|
}
|
|
|
|
// The namespace cv provides opencv related helper functions.
|
|
namespace libfacerec {
|
|
|
|
// Checks if a given matrix is symmetric, with an epsilon for floating point
|
|
// matrices (1E-16 by default).
|
|
//
|
|
// Mat mSymmetric = (Mat_<double>(2,2) << 1, 2, 2, 1);
|
|
// Mat mNonSymmetric = (Mat_<double>(2,2) << 1, 2, 3, 4);
|
|
// bool symmetric = isSymmetric(mSymmetric); // true
|
|
// bool not_symmetric = isSymmetric(mNonSymmetric); // false
|
|
//
|
|
bool isSymmetric(InputArray src, double eps = 1E-16);
|
|
|
|
// Sorts a 1D Matrix by given sort order and returns the sorted indices.
|
|
// This is just a wrapper to simplify cv::sortIdx:
|
|
//
|
|
// Mat mNotSorted = (Mat_<double>(1,4) << 1.0, 0.0, 3.0, -1.0);
|
|
// // to sort the vector use
|
|
// Mat sorted_indices = cv::argsort(mNotSorted, true);
|
|
// // make a conversion to vector<int>
|
|
// vector<int> sorted_indices = cv::argsort(mNotSorted, true);
|
|
//
|
|
Mat argsort(InputArray src, bool ascending = true);
|
|
|
|
// Calculates a histogram for a given integral matrix. The minimum inclusive
|
|
// value (minVal) and maximum inclusive value can be specified (optionally normed).
|
|
Mat histc(InputArray src, int minVal = 0, int maxVal = 255, bool normed = false);
|
|
|
|
// Reads a sequence from a FileNode::SEQ with type _Tp into a result vector.
|
|
template<typename _Tp>
|
|
inline void readFileNodeList(const FileNode& fn, vector<_Tp>& result) {
|
|
if (fn.type() == FileNode::SEQ) {
|
|
for (FileNodeIterator it = fn.begin(); it != fn.end();) {
|
|
_Tp item;
|
|
it >> item;
|
|
result.push_back(item);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Writes the a list of given items to a cv::FileStorage.
|
|
template<typename _Tp>
|
|
inline void writeFileNodeList(FileStorage& fs, const string& name,
|
|
const vector<_Tp>& items) {
|
|
// typedefs
|
|
typedef typename vector<_Tp>::const_iterator constVecIterator;
|
|
// write the elements in item to fs
|
|
fs << name << "[";
|
|
for (constVecIterator it = items.begin(); it != items.end(); ++it) {
|
|
fs << *it;
|
|
}
|
|
fs << "]";
|
|
}
|
|
|
|
|
|
// Sorts a given matrix src by column for given indices.
|
|
//
|
|
// Note: create is called on dst.
|
|
void sortMatrixColumnsByIndices(InputArray src, InputArray indices, OutputArray dst);
|
|
|
|
// Sorts a given matrix src by row for given indices.
|
|
Mat sortMatrixColumnsByIndices(InputArray src, InputArray indices);
|
|
|
|
// Sorts a given matrix src by row for given indices.
|
|
//
|
|
// Note: create is called on dst.
|
|
void sortMatrixRowsByIndices(InputArray src, InputArray indices, OutputArray dst);
|
|
|
|
// Sorts a given matrix src by row for given indices.
|
|
Mat sortMatrixRowsByIndices(InputArray src, InputArray indices);
|
|
|
|
// Turns a vector of matrices into a row matrix.
|
|
Mat asRowMatrix(InputArrayOfArrays src, int rtype, double alpha = 1, double beta = 0);
|
|
|
|
// Turns a vector of matrices into a column matrix.
|
|
Mat asColumnMatrix(InputArrayOfArrays src, int rtype, double alpha = 1, double beta = 0);
|
|
|
|
} // //namespace cv
|
|
|
|
#endif |