【问题标题】:cv2.fillPoly strange resultscv2.fillPoly 奇怪的结果
【发布时间】:2018-09-24 17:30:35
【问题描述】:

尝试使用cv2.fillPoly 栅格化简单多边形我得到奇怪的结果 - 没有零像素的总和是 10201,但它应该是 100*100。

pts = np.array([[0, 0], [100, 0], [100, 100], [0, 100], [0, 0]])
img = np.zeros((256, 256))
vertices = np.array([pts], dtype=np.int32)
mask = cv2.fillPoly(img, vertices, color=255)
print('np.count_nonzero(mask)', np.count_nonzero(mask))

怎么了?

【问题讨论】:

  • 关闭一个错误 - 它应该是 101 * 101(它是),因为你在第 100 列和第 100 行有一个边缘。想象一下小规模 ([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]) 那是 4线条,覆盖 4 个像素(并且没有要填充的内容)。
  • @DanMašek 哦,是的。
  • 我做了一些像素艺术来为其他人说明,但我完全理解你是否也删除了这个问题;)(它发生了)

标签: python opencv


【解决方案1】:

您犯了一个简单的错误——它应该是 101 * 101(即 10201)。

为了说明原因,让我们缩小问题的规模,并运行以下一组点的算法:

[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]

并在下面的网格上说明进度:

使用这些顶点调用cv2.fillPoly(在概念上)做了以下 5 件事:

  • (0,0)(2,0)画线

  • (2,0)画线到(2,2)

  • (2,2)画线到(0,2)

  • (0,2)画线到(0,0)

  • 填充多边形

结果是

如您所见,填充了 9 个像素:

  • 使用了 3 列(0 到 2,包括 0 到 2,表示 (2 - 0) + 1 == 3)。
  • 使用了 3 行(0 到 2,包括 0 到 2,表示 (2 - 0) + 1 == 3)。

同样,在您的情况下:(100 - 0 + 1) * (100 - 0 + 1) = 101 * 101 = 10201

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2012-12-16
    • 2012-12-06
    • 2016-08-24
    • 2018-01-24
    • 2021-03-01
    • 2014-08-17
    相关资源
    最近更新 更多