cv2.warpPerspective 就差一点?

cv2.warpPerspective just a little bit off?

总的来说,我对 OpenCV 和图像处理还比较陌生。有很多关于使用点扭曲图像以使其“自上而下”的教程。对于我的项目,我有一些计算机显示器的图像,我试图让它看起来像我 select 的图像实际上显示在其中一个显示器上。它 几乎 有效,但转换似乎有点偏离。

我仔细检查了这些点以确保它们是正确的,所以我认为它必须与我的矩阵有关。这是我的 Python 代码:

def normalizeImage(image, monitorID, monitorPts, monitors):
    # This function will resize any image to the correct 
    # height and width to prepare it for being reshaped
    rows, cols, _ = image.shape
    pts1 = np.array([[0,0],[0,cols],[rows,cols],[rows,0]], dtype=np.float32)
    pts2 = monitorPts[monitorID]
    matrix = cv2.getPerspectiveTransform(pts1, pts2) # I think my issue is here!!<<<<<<<<<<
    # matrix equals:
    # | .497 .072  27|
    # |-.045 .271 204|
    # |    0    0   1|
    dst = cv2.warpPerspective(image, matrix, (monitors.shape[1],monitors.shape[0]))
    cv2.imshow("dst", dst)
    return dst

    
def combineImages(monitors, image): # display shape of all three images for comparison
    dst = cv2.add(image, monitors)
    return dst


def main():
    monitors = cv2.imread("images/monitors.jpg")
    image0 = cv2.imread("images/goldglasses.png")
    monitorID = 0 # Which monitor are we adding an image to?
    # monitors.shape should be (694, 1431, 3)
    print("Monitors:")
    print(monitors.shape)
    # Point locations for all three monitors. We're only worried about number 0 for now.
    monitorPts = (np.array([[27,204],[84,411],[418,301],[393,129]], dtype=np.float32),
                 np.array([[436,96],[453,325],[847,319],[850,93]], dtype=np.float32),
                 np.array([[911,93],[878,318],[1259,426],[1327,150]], dtype=np.float32))
    image0 = normalizeImage(image0, monitorID, monitorPts, monitors)
    monitors = combineImages(monitors, image0)
    cv2.imshow("monitors", monitors)
    cv2.waitKey(0)

if __name__ == "__main__":
    # execute only if run as a script
    main()

我想这可能与矩阵变换完成的顺序有关,但我不确定。至少,我 99% 确定问题出在“normalizeImage”函数中。

这是两个源图像:

goldglasses.png:

monitors.jpg:

此外,这是我目前得到的结果:

newMonitors.png:

请注意,这家伙完全不适合显示器。任何帮助表示赞赏。如果您有任何需要澄清的问题,请随时提出。我的方法的任何替代方法可能更容易,也非常感谢。我真的很难理解其中一些函数的很多文档,所以如果有更好的方法来完成所有这些,我不会感到惊讶。

您似乎在之间切换,坐标为pts1

  • cols 适用于 x 轴。
  • rows 适用于 y 轴。

替换:

pts1 = np.array([[0,0],[0,cols],[rows,cols],[rows,0]], dtype=np.float32)

有:

pts1 = np.array([[0,0],[0,rows],[cols,rows],[cols,0]], dtype=np.float32)

为了更准确减去 1:

pts1 = np.array([[0,0],[0,rows-1],[cols-1,rows-1],[cols-1,0]], dtype=np.float32)

结果: