简体   繁体   中英

How to get vertex index from Subdiv2D Delaunay triangulation

I am using OpenCV 3.1 and want to know how to get the vertex index of an edge in Subdiv2D Delaunay triangulation, not only the vertex coordinates ? I want to use this index to keep the vertex value for further interpolation.

For example:

cv::Subdiv2D subdiv(rect);
// Insert some points to subdiv....
cv::Point2f org, dst;
subdiv.edgeOrg(edge, &org); // starting point of edge

This gives me only the coordinates of the vertex in org .

I've seen that in OpenCV 2.4, we could use the CvSubdiv2DPoint type, which held the id in addition to the standard Point32f . In OpenCV 3.1, I can't find this struct and it looks like it had been removed for some reason.

If any one else look at that question. You can create a class that herits from subdiv2D and implement your own function that returns index this way:

.h

#ifndef __Subdiv2DIndex__
#define __Subdiv2DIndex__

#include <vector>
#include <opencv2\opencv.hpp>
using namespace cv;

class Subdiv2DIndex : public Subdiv2D
{
public :
  Subdiv2DIndex(Rect rectangle);

  //Source code of Subdiv2D: https://github.com/opencv/opencv/blob/master/modules/imgproc/src/subdivision2d.cpp#L762
  //The implementation tweaks getTrianglesList() so that only the indice of the triangle inside the image are returned
  void getTrianglesIndices(std::vector<int> &ind) const;
};

#endif

.cpp #include "Subdiv2DIndex.h"

Subdiv2DIndex::Subdiv2DIndex(Rect rectangle) : Subdiv2D{rectangle}
{
}

void Subdiv2DIndex::getTrianglesIndices(std::vector<int> &triangleList) const
{
  triangleList.clear();
  int i, total = (int)(qedges.size() * 4);
  std::vector<bool> edgemask(total, false);
  const bool filterPoints = true;
  Rect2f rect(topLeft.x, topLeft.y, bottomRight.x - topLeft.x, bottomRight.y - topLeft.y);

  for (i = 4; i < total; i += 2)
  {
    if (edgemask[i])
      continue;
    Point2f a, b, c;
    int edge_a = i;
    int indexA = edgeOrg(edge_a, &a) -4;
    if (filterPoints && !rect.contains(a))
      continue;
    int edge_b = getEdge(edge_a, NEXT_AROUND_LEFT);
    int indexB = edgeOrg(edge_b, &b) - 4;
    if (filterPoints && !rect.contains(b))
      continue;
    int edge_c = getEdge(edge_b, NEXT_AROUND_LEFT);
    int indexC = edgeOrg(edge_c, &c) - 4;
    if (filterPoints && !rect.contains(c))
      continue;
    edgemask[edge_a] = true;
    edgemask[edge_b] = true;
    edgemask[edge_c] = true;

    triangleList.push_back(indexA);
    triangleList.push_back(indexB);
    triangleList.push_back(indexC);
  }
}

So turned out that in OpenCV 3 some of the functions in cv::Subdiv2D which were void now returns an integer. In my case I found out that subdiv.edgeOrg(...) and subdiv.edgeDst(...) returns the vertex id as integer.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM