#ifndef __OPENCV_STITCHING_UTIL_HPP__ #define __OPENCV_STITCHING_UTIL_HPP__ #include #include #include #define ENABLE_LOG 1 #if ENABLE_LOG #include #define LOG(msg) std::cout << msg; #else #define LOG(msg) #endif #define LOGLN(msg) LOG(msg << std::endl) class DjSets { public: DjSets(int n = 0) { create(n); } void create(int n); int find(int elem); int merge(int set1, int set2); std::vector parent; std::vector size; private: std::vector rank_; }; struct GraphEdge { GraphEdge(int from, int to, float weight) : from(from), to(to), weight(weight) {} bool operator <(const GraphEdge& other) const { return weight < other.weight; } bool operator >(const GraphEdge& other) const { return weight > other.weight; } int from, to; float weight; }; class Graph { public: Graph(int num_vertices = 0) { create(num_vertices); } void create(int num_vertices) { edges_.assign(num_vertices, std::list()); } int numVertices() const { return static_cast(edges_.size()); } void addEdge(int from, int to, float weight); template B forEach(B body) const; template B walkBreadthFirst(int from, B body) const; private: std::vector< std::list > edges_; }; #include "util_inl.hpp" #endif // __OPENCV_STITCHING_UTIL_HPP__