我的数据集为500 cv :: Point。
对于每个点,我需要确定此点是否包含在由凹多边形建模的ROI中。 这个多边形可能非常大(大多数情况下,它可以包含在100x400的边界框中,但它可以更大)
对于那个点数和多边形的大小,确定一个点是否在多边形中的最有效方法是什么?
答案 0 :(得分:3)
一般而言,为了准确有效,我将分两个步骤。
这样,您保持准确性,但加快了过程。唯一的例外是当大多数点落入边界框内时。在这种情况下,第一步几乎总是失败,因此不会优化算法,实际上会使它稍慢。
答案 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倍。