python - cv2.fillPoly 奇怪的结果

标签 python opencv

尝试使用 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(即 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,包括在内,意思是 (2 - 0) + 1 == 3)。
  • 使用了 3 行(0 到 2,包括在内,意思是 (2 - 0) + 1 == 3)。

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

关于python - cv2.fillPoly 奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52484507/

相关文章:

javascript - 通过 Python SPARQLWrapper 将数据插入到 Fuseki

python - 使用OpenCV,Python,Raspberry Pi 3的Ball Tracker

python - 多进程视频处理

android - ClassNotFoundException : android. hardware.camera2.CameraAccessException 与 OpenCV 3.1.0

python - 无循环处理数据帧

python - 如何在声明类之前为类中使用的类型添加别名?

Python opencv ffmpeg 线程退出函数

python - 在 opencv 中检测嵌套形状

python - 我应该将参数作为继承对象吗?

python - 获取 NumPy 数组中多个索引处的元素