Intelligent scissors |
Здравствуйте, гость ( Вход | Регистрация )
Intelligent scissors |
wiz29 |
20.8.2010, 16:06
Сообщение
#1
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
Реализовывал ли кто нибудь данный алгоритм?(нужна консультация по производительности, моя реализация считает несколько секунд на картинке 1500+ х 1500+, тогда как продвинутые реализации справляются "мгновенно" с точки зрения пользователя, не беру в расчет время на вычисление весов ребер)
|
|
|
wiz29 |
27.8.2010, 14:29
Сообщение
#2
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
Здесь именно вычисляется маршрут от SeedNode до всех осталных вершин
CODE namespace liveware
{ class ImageGraph { public: typedef std::vector<GraphNode*>::iterator iterator; typedef std::vector<GraphNode*>::const_iterator const_iterator; public: ImageGraph(void); ~ImageGraph(void); public: //set size for image graph void SetSize(int w, int h); //return begin iterator for ImageGraph iterator Begin(); //return begin iterator for ImageGraph const_iterator Begin() const; //return end iterator for ImageGraph iterator End(); //return end iterator for ImageGraph const_iterator End() const; //return elemet count of ImageGraph size_t GetSize() const; //return width of ImageGraph int GetWidth() const; //return height of ImageGraph int GetHeight() const; //return element at cell GraphNode* ElementAt(int x, int y); GraphNode* ElementAt(int index); //make image graph from QImage bool LoadImage(const QImage& img); private: //release resources void release(); private: int m_w;//width of image graph int m_h;//height of image graph std::vector<GraphNode*> m_nodes;//image graph nodes };//class ImageGraph }//namespace liveware namespace liveware { class less; class ImageGraph; class GraphNode { public: friend class liveware::less; friend class liveware::ImageGraph; //first param of pair is dst node //second param of pair is transition cost to dst node typedef std::vector<std::pair<GraphNode*, double> > NeighboorhoodContainer; typedef NeighboorhoodContainer::iterator iterator; typedef NeighboorhoodContainer::const_iterator const_iterator; public: GraphNode(double weight = 0.0); ~GraphNode(); public: //return x coord of node int GetX() const; //return y coord of node int GetY() const; //set x coord of node void SetX(int); //set y coord of node void SetY(int); //set x, y coord of node void SetXY(int x, int y); //set state of node (used for live ware) void SetState(int); //return state of node int state() const; //set weight of node void SetWeight(double); //return const reference for node weight double Weight() const; //return itertor for first neighborhood node iterator NeighborhoodBegin(); //return const itertor for first neighborhood node const_iterator NeighborhoodBegin() const; //return iterator for end neighborhood node iterator NeighborhoodEnd(); //return const iterator for end neighborhood node const_iterator NeighborhoodEnd() const; //return prev Node (for solve) GraphNode* PrevNode(); //set prev Node void SetPrevNode(GraphNode*); private: int m_x;//x coord of node int m_y;//y coord of node int m_state;// node state (for live ware algo) double m_weight;//node weight (total cost of path to this node) GraphNode* m_pPrevNode;//pointer to prev graph node (for liveware algo) NeighboorhoodContainer m_neighborhood;//list of neighborhood (for liveware algo), //second parametr is cost of transition from this node to };//class GraphNode //--------------------------------------------------------------------------------------------------------- //predicate class less : public std::binary_function<GraphNode*, GraphNode*, bool> { public: bool operator()(const GraphNode* pNode1, const GraphNode* pNode2); };//class less }//namespace liveware |
|
|
Текстовая версия | Сейчас: 30.12.2024, 17:41 |