0

我有一个图像灰色部分的点向量,写成这样:

std::vector<Point> vectorg;
for(i = 0; i <= hei - 1; i++) {
   for(j = 0; j <= wid - 1; j++) {
      if(mask(i,j) == 128) {
          vectorg.push_back(Point(j,i));
      }
   }
}

可以通过以下方式了解存储在某个单元格中的坐标:

cout << vectorg[0].x;
cout << vectorg[0].y;

现在的问题是反过来,是否有可能知道哪个单元格拥有特定的坐标?非常感谢,我也是opencv编程的新手,我会照顾你的。

4

3 回答 3

0

只需执行以下操作:

#include <algorithm>
// ...

Point p(searchedX, searchedY);

std::vector<Point>::iterator element = std::find(vectorg.begin(), vectorg.end(), p);

if (element != vectorg.end()) {
    cout << (*element).x << endl;
    cout << (*element).y << endl;
} else {
    cout << "The point is not in the vector" << endl;
}
于 2013-04-17T14:55:11.450 回答
0

这可能是矫枉过正,但一种方法(不进行贪婪的穷举搜索)是建立一个FLANN 索引来存储您的点的位置。

特征矩阵由您的点的坐标组成。由于 OpenCV 知道如何将向量转换为矩阵,因此您应该能够按原样使用当前向量。然后,如果您只想要一个点,只需询问查询中的 1 个最近邻居(k 参数)。

好处是,如果您稍后决定还需要附近的最近点,只需提高 k 的值。

于 2013-04-17T15:11:51.167 回答
0

很抱歉回复晚了,感谢您的回答,他们间接地启发了我。

我找到了一个简单的方法来做到这一点。这是通过制作另一个 Mat 来保存保存坐标的数字。

std::vector<Point> vectorg;
cv::Mat_<int> Index =Mat_<int>::zeros(hei,wid);
for(i = 0; i <= hei - 1; i++) {
   for(j = 0; j <= wid - 1; j++) {
      if(mask(i,j) == 128) {
          vectorg.push_back(Point(j,i));
          Index(vector[count])=count;
          count++;
      }
   }
}

这样我就可以通过简单地知道哪个单元格拥有某些坐标:

cout<<Index(36,362); //as example

非常感谢,下次我会照顾你的。

于 2013-04-19T13:54:34.153 回答