假设我们正在处理具有黑色前景和白色背景的二进制图像。是否有任何有效的方法可以在由顶点坐标列表指定的多边形中找到黑色像素?
从多边形计算边界框并不理想,因为可能有许多位置很近的多边形,其边界框可能重叠。
当然,蛮力法会先从整幅图像中找到黑色像素,然后对每个黑色像素进行多边形测试,这对于这项任务来说太耗时了。
欢迎任何建议!
谢谢!
假设我们正在处理具有黑色前景和白色背景的二进制图像。是否有任何有效的方法可以在由顶点坐标列表指定的多边形中找到黑色像素?
从多边形计算边界框并不理想,因为可能有许多位置很近的多边形,其边界框可能重叠。
当然,蛮力法会先从整幅图像中找到黑色像素,然后对每个黑色像素进行多边形测试,这对于这项任务来说太耗时了。
欢迎任何建议!
谢谢!
根据您的工作流程或最终目标,以下内容可能对您有用。
用于cvFillPoly
创建多边形的二进制蒙版,然后使用cvCopy
创建到白化数组的蒙版来制作图像的副本,因此唯一的黑色像素是多边形中的像素。
pointPolygonTest
或者您可以使用光线投射算法代替使用,并且仅在您有奇数个交叉点时检查像素是否为黑色。
自己执行光线投射算法可以节省大量调用 pointPolygonTest 的时间。
您可能会遇到这样一种情况,即一个点所在的扫描线具有一个占据整条线的多边形。
光线投射算法从一侧计算多边形线交叉点,直到它到达被测试的点。如果有 m 个线段,我们执行 m 个线段射线相交,对它们进行排序,并计算发生了多少。
如果您使用 pointPolygonTest 您必须对每个点都执行此操作,但是您为这条线上的 n 个点测试的所有光线都与这条线相交,并且它们与线段的交点都发生在同一个地方,所以你可以通过自己编写算法并在交叉次数为奇数时对其进行扩充以检查黑色像素来节省所有这些重新计算。
findContours
功能呢?似乎它会帮助你。