回答问题

我在这里有 2 个测试图像。我的问题是,如何在不裁剪图像的情况下将第一张图像中的正方形映射到第二张图像中的四边形。

图一:图像 1

图2:图像 2

这是我当前使用 openCV warpPerspective 函数的代码。

import cv2
import numpy as np

img1_square_corners = np.float32([[253,211], [563,211], [563,519],[253,519]])
img2_quad_corners = np.float32([[234,197], [520,169], [715,483], [81,472]])

h, mask = cv2.findHomography(img1_square_corners, img2_quad_corners)
im = cv2.imread("image1.png")
out = cv2.warpPerspective(im, h, (800,800))
cv2.imwrite("result.png", out)

结果: 结果

如您所见,由于 warpPerspective 函数中的 dsizeu003d(800,800) 参数,我无法获得图像 1 的完整视图。如果我调整 dsize,正方形将无法正确映射。有没有办法调整输出图像的大小,以便我可以获得图像 1 的全图?

Answers

是的,但您应该意识到输出图像可能非常大。我很快编写了以下 Python 代码,但即使是 3000 x 3000 的图像也无法适应输出,由于转换,它太大了。虽然,这是我的代码,但我希望它对你有用。

import cv2
import numpy as np
import cv           #the old cv interface

img1_square_corners = np.float32([[253,211], [563,211], [563,519],[253,519]])
img2_quad_corners = np.float32([[234,197], [520,169], [715,483], [81,472]])

h, mask = cv2.findHomography(img1_square_corners, img2_quad_corners)
im = cv2.imread("image1.png")

这里创建一个输出图像,我以 (3000, 3000) 为例。

out_2 = cv.fromarray(np.zeros((3000,3000,3),np.uint8))

通过使用旧的cv接口,我直接写入输出,因此它不会被裁剪。我尝试使用cv2界面进行此操作,但由于某种原因它不起作用......也许有人可以对此有所了解?

cv.WarpPerspective(cv.fromarray(im), out_2, cv.fromarray(h))
cv.ShowImage("test", out_2)
cv.SaveImage("result.png", out_2)
cv2.waitKey()

无论如何,这给出了一个非常大的图像,其中包含您的原始图像 1,扭曲。如果您指定输出图像足够大,整个图像将可见。 (这可能确实非常大!)

我希望这段代码可以帮助你。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐