OpenCV:如何在多边形中找到像素?

时间:2012-07-03 03:08:48

标签: opencv

假设我们正在处理前景为黑色且背景为白色的二进制图像。 是否有任何有效的方法可以在多边形中找到黑色像素,这是由顶点坐标列表指定的?

从多边形计算边界框并不理想,因为可能存在许多紧密位移的多边形,其边界框可能会重叠。

当然,蛮力方式首先是从整个图像中找到黑色像素,然后对每个黑色像素运行多边形测试,这对于任务来说太耗时了。

欢迎任何建议!

谢谢!

2 个答案:

答案 0 :(得分:6)

根据您的工作流程或最终目标,以下内容可能对您有用。

使用cvFillPoly创建多边形的二进制掩码,然后使用cvCopy使用为白色数组创建的掩码制作图像的副本,因此唯一的黑色像素是在多边形中。

或者,不是使用pointPolygonTest,而是使用raycasting algorithm而只检查如果您的交叉数为奇数,则像素是否为黑色。

自己进行光线投射算法可以比调用pointPolygonTest节省大量时间。

您可能会遇到一个点所在的扫描线具有占据整个线的多边形的情况。

光线投射算法从一侧计算多边形线交叉,直到它到达被测点。如果有m个线段,我们执行m个线段光线交叉,对它们进行排序,并计算发生的数量。

如果使用pointPolygonTest,则必须为每个点执行此操作,但是您为此线上的n个点测试的所有光线都与该线相交,并且它们与线段的交点全部出现在同一位置,所以你可以通过自己编写算法来保存所有这些重新计算,并在交叉数为奇数时对其进行扩充以检查黑色像素。

答案 1 :(得分:3)

findContours功能怎么样?它似乎对你有帮助。