【问题标题】:How to store point co-ordinates in vector data type in opencv?如何在opencv中以矢量数据类型存储点坐标?
【发布时间】:2016-08-01 20:03:22
【问题描述】:

我有一个 Mat 对象 (CV_8UC1),它是一个二进制映射,在某些位置为 1,否则为零。我想创建一个向量来存储 Mat 为 1 的点的坐标。关于如何去做吧。 我知道我可以使用以下代码循环图像并检查点

for( int p = 1; p <= img.rows; p++ )
    { for( int q = 1; q <= img.cols; q++ )
        {
            if(  img.at<uchar>(p,q) == 1 )
            {
                //what to do here ? 
            }
        }
    }

另外,我需要坐标是单精度浮点数。这是为了将其用作另一个需要向量的函数的输入。 请给个提示。我对向量数据类型和STL不熟悉。

【问题讨论】:

  • 你有没有尝试阅读几个 std::vector 的例子?这很简单:),您还可以查看 SO 文档:stackoverflow.com/documentation/c%2b%2b/511/…
  • 顺便说一句,如果您尝试启动您的程序,您的循环将因访问冲突异常而失败。尝试了解从零开始的索引在大多数现代编程语言中的工作原理。
  • 啊,这是一个愚蠢的错误。顺便说一句,我确实了解基于零的索引。

标签: c++ opencv


【解决方案1】:

如果您想使用 OpenCV 在二进制地图中查找所有非零坐标,最好使用findNonZero

这是一个如何使用它的示例(使用虚拟矩阵,但你明白了):

cv::Mat img(100, 100, CV_8U, cv::Scalar(0));
img.at<uchar>(50, 50) = 255;
img.at<uchar>(70, 50) = 255;
img.at<uchar>(58, 30) = 255;

cv::Mat nonZeroes;

cv::findNonZero(img, nonZeroes);

std::vector<cv::Point2f> coords(nonZeroes.total());

for (int i = 0; i < nonZeroes.total(); i++) {
    coords[i] = nonZeroes.at<cv::Point>(i);
}

【讨论】:

  • vector&lt;Point&gt; coords; findNonZero(img, coords); 要好得多.. ;D
  • @Miki 但是如果你想要浮点坐标,无论如何你都必须在第二步中转换它们。即使我无法想象你为什么要在这里使用浮点坐标......
  • 其实我想在 cv::calcOpticalFlowPyrLK(prev_gray, curr_gray, features_prev, features_next, status, err);作为 features_prev 并且如果我正确阅读了文档 features_prev 应该是 std::vector<:point2f>docs.opencv.org/2.4/modules/video/doc/… 虽然我自己不明白为什么它需要坐标是浮点数。
  • @Sunreef Bro 您的代码不起作用。它给出了以下错误。错误:重载的“Point_(cv::Point_&)”的调用在 coords[i] = cv::Point2f(nonZeroes.at<:point>(i)) 的行上不明确;有什么建议吗?
  • @HassanJaved 我在使用 OpenCV 3.1.0 时没有收到此错误。如果将此行替换为 cv::Point pt = nonZeroes.at&lt;cv::Point&gt;(i); coords[i] = cv::Point2f(pt.x, pt.y); 会发生什么?
猜你喜欢
  • 2013-03-30
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多