我很难解决面具创建问题。我的图像很大, 40959px X 24575px和我试图为它创建一个掩码。 我注意到对于一定大小的图像我没有问题(我测试了大约33000px X 22000px),但是对于大于该尺寸的尺寸,我的掩模内部出现错误(错误是它在多边形中间变黑并且白色区域自身延伸到左边缘。结果应该在多边形内没有黑色区域,并且没有白色区域延伸到图像的左边缘。)
所以我的代码看起来像这样:
pixel_points_list = latLonToPixel(dataSet, lat_lon_pairs)
print pixel_points_list
# This is the list im getting
#[[213, 6259], [22301, 23608], [25363, 22223], [27477, 23608], [35058, 18433], [12168, 282], [213, 6259]]
image = cv2.imread(in_tmpImgFilePath,-1)
print image.shape
#Value of image.shape: (24575, 40959, 4)
mask = np.zeros(image.shape, dtype=np.uint8)
roi_corners = np.array([pixel_points_list], dtype=np.int32)
print roi_corners
#contents of roi_corners_array:
"""
[[[ 213 6259]
[22301 23608]
[25363 22223]
[27477 23608]
[35058 18433]
[12168 282]
[ 213 6259]]]
"""
channel_count = image.shape[2]
ignore_mask_color = (255,)*channel_count
cv2.fillPoly(mask, roi_corners, ignore_mask_color)
cv2.imwrite("mask.tif",mask)
你会看到掩码中间的掩码是镜像的。我从pixel_points_list中取出这些点并在坐标系上绘制它们并获得有效的多边形,但是当使用fillPoly时我得到错误的结果。
这里有一个更简单的例子,我只有4(5)分:
roi_corners = array([[ 213 6259]
[22301 23608]
[35058 18433]
[12168 282]
[ 213 6259]])
有没有人知道为什么会这样? 谢谢!
答案 0 :(得分:5)
问题出在fillPoly
函数中,由drawContours
(以及fillConvexPoly
,int32
等调用...)。
在内部,假设点坐标(整数类型32768
)仅在16个最低位中具有有意义的值。实际上,只有当您的点的坐标最多为x
(这正是您可以在图像中绘制的最大32768
坐标时,才能正确绘制。)
这不能被视为错误,因为您的图片非常大。
作为一种解决方法,您可以尝试按给定因子缩放蒙版和点,在较小蒙版上填充多边形,然后将蒙版重新缩放回原始大小
正如CollectPolyEdges在评论中指出的那样,这实际上是@DanMašek,尚未修复。
在错误讨论中,提到了另一种解决方法。它包括使用大小小于offset
的多个ROI进行绘制,使用fillPoly
中的{{1}}参数更正每个ROI的坐标。