使用opencv中的函数fillPoly获取非常大的图像的错误结果

时间:2016-05-23 13:19:31

标签: opencv opencv3.0

我很难解决面具创建问题。我的图像很大, 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)

这是我用这些坐标(缩小的面具)得到的面具: Part of mask is mirrored

你会看到掩码中间的掩码是镜像的。我从pixel_points_list中取出这些点并在坐标系上绘制它们并获得有效的多边形,但是当使用fillPoly时我得到错误的结果。

这里有一个更简单的例子,我只有4(5)分:

 roi_corners = array([[  213  6259]
                      [22301 23608]
                      [35058 18433]
                      [12168   282]
                      [  213  6259]])

我明白了 enter image description here

有没有人知道为什么会这样? 谢谢!

1 个答案:

答案 0 :(得分:5)

问题出在fillPoly函数中,由drawContours(以及fillConvexPolyint32等调用...)。

在内部,假设点坐标(整数类型32768)仅在16个最低位中具有有意义的值。实际上,只有当您的点的坐标最多为x(这正是您可以在图像中绘制的最大32768坐标时,才能正确绘制。)

这不能被视为错误,因为您的图片非常大。

作为一种解决方法,您可以尝试按给定因子缩放蒙版和点,在较小蒙版上填充多边形,然后将蒙版重新缩放回原始大小

正如CollectPolyEdges在评论中指出的那样,这实际上是@DanMašek,尚未修复。

在错误讨论中,提到了另一种解决方法。它包括使用大小小于offset的多个ROI进行绘制,使用fillPoly中的{{1}}参数更正每个ROI的坐标。