opencv - OpenCV warpPerspective() 中的离群像素

标签 opencv

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

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

我如何实现这一目标?

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

如果相关,我正在使用 Python 绑定(bind)到 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 高的矩形。没有像素是黑色或透明的。相反,它们是四角内部和外部图像的像素。我只想要里面的。

最佳答案

我发现的最佳选择是循环遍历像素并使用 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

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

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

关于opencv - OpenCV warpPerspective() 中的离群像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12767754/

相关文章:

java - 从哪里获得 openCV 的 jar?

python - 如何在不使用 cv2.warpAffine() 的情况下翻译图像? [Python 3 和 OpenCV 4.1]

video - 如何获取视频文件的 I/P/B 帧数?

c# - 如何锁定自动对焦

opencv - Cmake:错误的 OpenCV 路径生成

python - 如何在GoCV中提取信心

c++ - 用数据点填充矩阵

qt - Qt OpenCV从捕获帧写入视频,不保存

opencv - HoughLines中rho和theta参数的解释

python - 遍历图像目录并将它们全部旋转 x 度并保存到目录