【问题标题】:Outlying pixels in OpenCV warpPerspective()OpenCV warpPerspective() 中的离群像素
【发布时间】:2012-09-27 21:05:53
【问题描述】:

我的应用程序需要将一个四边形映射到另一个四边形。这些都不是矩形。

但是,我从 warpPerspective() 得到的结果始终是一个矩形。我尝试将“异常值”标志设置为不同的值,以防止扭曲四边形之外的像素出现在目标图像中,但似乎没有任何效果。我想要的是一个扭曲的四边形,扭曲四边形之外的像素设置为透明度。

我如何做到这一点?

或者,是否有一种简单的方法可以在 OpenCV 中屏蔽四边形之外的区域,以便我可以将四边形复制到另一个图像中?

如果相关,我使用 Python 绑定到 OpenCV。

这是我当前的代码:

def warpImage(image, corners, target, width, height):
    mat = cv2.getPerspectiveTransform(corners, target)
    out = numpy.zeros(shape=(width, height), dtype="uint8")
    out = cv2.warpPerspective(image, mat, (width,height), out, cv2.INTER_CUBIC)
    return out

corners 和 target 都是非矩形四边形。然而,输出是一个全宽x高的矩形。没有一个像素是黑色或透明的。相反,它们是角四边形内部和外部图像的像素。我只想要里面的。

【问题讨论】:

  • 您能否提供您当前扭曲的四边形的图像以更好地说明您的问题?
  • 我有点不清楚这会有什么帮助。结果是一个所有像素都可见的矩形。我想要一个外部透明的位的非矩形四边形。我提供了非矩形四边形作为输入。
  • 好的,所以也许您应该提供一个代码示例来说明您正在做什么。因为 warpPerspective 确实应该输出一个四边形,其中四边形之外的像素涂成黑色。
  • 好的,我已经这样做了。您描述的行为将与透明一样好。但我没看到。

标签: opencv


【解决方案1】:

我发现的最佳选择是循环遍历像素并使用 matplotlib pnpoly() 函数将扭曲四边形中的像素复制到重映射数组中,如下所示:

import matplotlib.nxutils as nx 

def warpImage(image, corners, target, width, height, x0, y0, remap):
    mat = cv2.getPerspectiveTransform(corners, target)
    out = cv2.warpPerspective(image, mat, (width,height), flags=cv2.INTER_CUBIC)
    for x in range(0,width):
        for y in range(0,height):
            if nx.pnpoly(x,y,target) == 1:
                for i in range(0,3):
                    remap[y+y0,x+x0,i] = out[y,x,i]

    return remap

我遍历图像中的所有四边形并在重映射中累积转换后的版本。

必须访问每个像素不是很有效,但幸运的是这是一次转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 2013-01-19
    • 2017-06-28
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    相关资源
    最近更新 更多