【问题标题】:OpenCV most efficient way to find a point in a polygonOpenCV在多边形中查找点的最有效方法
【发布时间】:2016-06-29 21:06:30
【问题描述】:

我有一个 500 cv::Point 的数据集。

对于每个点,我需要确定该点是否包含在由凹多边形建模的 ROI 中。 这个多边形可以很大(大多数时候,它可以包含在 100x400 的边界框中,但也可以更大)

对于这么多点和这么大的多边形,确定一个点是否在多边形中最有效的方法是什么?

  • 使用 pointPolygonTest openCV 函数?
  • 使用 drawContours 构建蒙版并查找蒙版中的点是白色还是黑色?
  • 其他解决方案? (我真的很想准确,所以不包括凸多边形和边界框)。

【问题讨论】:

  • 很难说哪个更快.. 你已经在目标环境中测试过它们(有没有 CUDA、SSE、Neon ......?)不要依赖于理论比较。在确切的目标环境中对它们进行基准测试

标签: c++ opencv optimization


【解决方案1】:

一般来说,为了既准确又高效,我会采用两步流程。

  • 首先,多边形上的边界框。查看框内不是的点是一件快速而简单的事情。这样一来,您就可以立即丢掉几分。
  • 其次,pointPolygonTest。这是一项成本相对较高的操作,但第一步可确保您只对需要更高准确性的点执行此操作。

这样,您既可以保持准确性,又可以加快流程。唯一的例外是大多数点将落在边界框内。在这种情况下,第一步几乎总是会失败,因此不会优化算法,实际上会稍微慢一些。

【讨论】:

  • 很好的解决方案。您可能还会发现 MinAreaRect 会更准确。
【解决方案2】:

很久以前,我遇到了完全相同的问题并使用了掩蔽方法(您陈述的第二点)。我用这种方式测试了包含数百万个点的数据集,发现这个解决方案非常有效。

【讨论】:

    【解决方案3】:

    这比带和不带边界框的 pointPolygonTest 快!

    Scalar color(0,255,0);
    drawContours(image, contours, k, color, CV_FILLED, 1); //k is the index of the contour in the array of arrays 'contours'
    for(int y = 0; y < image.rows, y++){
        const uchar *ptr = image.ptr(y);
        for(int x = 0; x < image.cols, x++){
            const uchar * pixel = ptr;
            if((int) pixel[1] = 255){
                //point is inside contour
            }
            ptr += 3;
        }
    }
    

    它使用颜色来检查点是否在轮廓内。 为了比 Mat::at() 更快的矩阵访问,我们使用指针访问。 在我的例子中,这比 pointPolygonTest 快 20 倍。

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 2011-06-20
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      相关资源
      最近更新 更多