OpenCV最有效的方法是在多边形中找到一个点

时间:2015-10-26 10:18:04

标签: c++ opencv optimization

我的数据集为500 cv :: Point。

对于每个点,我需要确定此点是否包含在由凹多边形建模的ROI中。 这个多边形可能非常大(大多数情况下,它可以包含在100x400的边界框中,但它可以更大)

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

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

3 个答案:

答案 0 :(得分:3)

一般而言,为了准确有效,我将分两个步骤。

  • 首先,多边形上的边界框。在框内看到哪些点是一件快速而简单的事情。有了它,你可以立即丢弃几个点。
  • 其次,pointPolygonTest。这是一个相对昂贵的操作,但第一步保证您只为那些需要更高精度的点执行它。

这样,您保持准确性,但加快了过程。唯一的例外是当大多数点落入边界框内时。在这种情况下,第一步几乎总是失败,因此不会优化算法,实际上会使它稍慢。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这比带有和没有边界框的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倍。