123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- // This file is part of the OpenCV project.
- // It is subject to the license terms in the LICENSE file found in the top-level directory
- // of this distribution and at http://opencv.org/license.html.
- #ifndef __mace_h_onboard__
- #define __mace_h_onboard__
- #include "opencv2/core.hpp"
- namespace cv {
- namespace face {
- //! @addtogroup face
- //! @{
- /**
- @brief Minimum Average Correlation Energy Filter
- useful for authentication with (cancellable) biometrical features.
- (does not need many positives to train (10-50), and no negatives at all, also robust to noise/salting)
- see also: @cite Savvides04
- this implementation is largely based on: https://code.google.com/archive/p/pam-face-authentication (GSOC 2009)
- use it like:
- @code
- Ptr<face::MACE> mace = face::MACE::create(64);
- vector<Mat> pos_images = ...
- mace->train(pos_images);
- Mat query = ...
- bool same = mace->same(query);
- @endcode
- you can also use two-factor authentication, with an additional passphrase:
- @code
- String owners_passphrase = "ilikehotdogs";
- Ptr<face::MACE> mace = face::MACE::create(64);
- mace->salt(owners_passphrase);
- vector<Mat> pos_images = ...
- mace->train(pos_images);
- // now, users have to give a valid passphrase, along with the image:
- Mat query = ...
- cout << "enter passphrase: ";
- string pass;
- getline(cin, pass);
- mace->salt(pass);
- bool same = mace->same(query);
- @endcode
- save/load your model:
- @code
- Ptr<face::MACE> mace = face::MACE::create(64);
- mace->train(pos_images);
- mace->save("my_mace.xml");
- // later:
- Ptr<MACE> reloaded = MACE::load("my_mace.xml");
- reloaded->same(some_image);
- @endcode
- */
- class CV_EXPORTS_W MACE : public cv::Algorithm
- {
- public:
- /**
- @brief optionally encrypt images with random convolution
- @param passphrase a crc64 random seed will get generated from this
- */
- CV_WRAP virtual void salt(const cv::String &passphrase) = 0;
- /**
- @brief train it on positive features
- compute the mace filter: `h = D(-1) * X * (X(+) * D(-1) * X)(-1) * C`
- also calculate a minimal threshold for this class, the smallest self-similarity from the train images
- @param images a vector<Mat> with the train images
- */
- CV_WRAP virtual void train(cv::InputArrayOfArrays images) = 0;
- /**
- @brief correlate query img and threshold to min class value
- @param query a Mat with query image
- */
- CV_WRAP virtual bool same(cv::InputArray query) const = 0;
- /**
- @brief constructor
- @param filename build a new MACE instance from a pre-serialized FileStorage
- @param objname (optional) top-level node in the FileStorage
- */
- CV_WRAP static cv::Ptr<MACE> load(const String &filename, const String &objname=String());
- /**
- @brief constructor
- @param IMGSIZE images will get resized to this (should be an even number)
- */
- CV_WRAP static cv::Ptr<MACE> create(int IMGSIZE=64);
- };
- //! @}
- }/* namespace face */
- }/* namespace cv */
- #endif // __mace_h_onboard__
|