【问题标题】:OpenCV: how to find pixels within a polygon?OpenCV:如何在多边形内找到像素?
【发布时间】:2012-07-03 03:08:48
【问题描述】:

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

从多边形计算边界框并不理想,因为可能有许多位置很近的多边形,它们的边界框可能重叠。

当然,蛮力法会先从整幅图像中找出黑色像素,然后对每个黑色像素进行多边形测试,这对于这项任务来说太耗时了。

欢迎提出任何建议!

谢谢!

【问题讨论】:

    标签: opencv


    【解决方案1】:

    根据您的工作流程或最终目标,以下可能适合您。

    使用cvFillPoly 创建多边形的二进制蒙版,然后使用cvCopy 使用创建到白化数组的蒙版复制图像,因此唯一的黑色像素是多边形中的像素.

    或者不使用pointPolygonTest,您可以使用raycasting algorithm,并且仅在您有奇数个交叉点时检查像素是否为黑色。

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

    您可能会遇到这样一种情况,即某个点所在的扫描线上有一个多边形占据了整条线。

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

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

    【讨论】:

    • 谢谢菲利普!您的第一个建议本质上是遮罩和复制,但是想象整个图像很大并且那里有大约 100 个小多边形,我想这种方式会花费太多时间。我有成千上万这样的图像要处理。其次,我不能假设有奇数的交叉点,但感谢指针!
    • 我刚才误解了第二个,但我认为它和Polygontest()是一样的。
    【解决方案2】:

    findContours 函数呢?看来对你有帮助。

    【讨论】:

    • 感谢 Astor,这个想法在于在 OpenCV 中为 Polygontest 遍历黑色像素的方向。
    猜你喜欢
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多