#pragma once #include "image_io.hpp" #include #include #include #include #include #include namespace boost { namespace serialization { template void serialize(Archive & ar, std::array & a, const unsigned int /*version*/) { ar & make_array(a.data(), a.size()); } } // namespace serialization } // namespace boost // Default implementation template struct fingerprint_traits { static Fingerprint calculate(raw_rgb_image const & image) { return Fingerprint::calculate(image); } static auto distance(Fingerprint const & x, Fingerprint const & y) { return x.distance_to(y); } }; struct rgb_wavelet_coefficients { // a double for (x, y) location represented in a single int using coefficient = std::pair; std::array reds; std::array greens; std::array blues; static rgb_wavelet_coefficients calculate(raw_rgb_image const & image); double distance_to(rgb_wavelet_coefficients const & y) const; private: friend class boost::serialization::access; template void serialize(Archive & ar, const unsigned int /*version*/){ ar & reds; ar & greens; ar & blues; } }; std::ostream& operator<<(std::ostream& out, rgb_wavelet_coefficients const & x);