gpt4 book ai didi

python - 使用 OpenCV warpPerspective 时如何显示整个图像

转载 作者:IT老高 更新时间:2023-10-28 21:07:23 24 4
gpt4 key购买 nike

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

图 1: image 1

图 2: image 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)

结果: result

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

最佳答案

我的解决方案是计算结果图片大小,然后进行平移。

def warpTwoImages(img1, img2, H):
'''warp img2 to img1 with homograph H'''
h1,w1 = img1.shape[:2]
h2,w2 = img2.shape[:2]
pts1 = float32([[0,0],[0,h1],[w1,h1],[w1,0]]).reshape(-1,1,2)
pts2 = float32([[0,0],[0,h2],[w2,h2],[w2,0]]).reshape(-1,1,2)
pts2_ = cv2.perspectiveTransform(pts2, H)
pts = concatenate((pts1, pts2_), axis=0)
[xmin, ymin] = int32(pts.min(axis=0).ravel() - 0.5)
[xmax, ymax] = int32(pts.max(axis=0).ravel() + 0.5)
t = [-xmin,-ymin]
Ht = array([[1,0,t[0]],[0,1,t[1]],[0,0,1]]) # translate

result = cv2.warpPerspective(img2, Ht.dot(H), (xmax-xmin, ymax-ymin))
result[t[1]:h1+t[1],t[0]:w1+t[0]] = img1
return result

dst_pts = float32([kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2)
src_pts = float32([kp2[m.trainIdx].pt for m in good]).reshape(-1,1,2)
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)

result = warpTwoImages(img1_color, img2_color, M)

enter image description here

关于python - 使用 OpenCV warpPerspective 时如何显示整个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13063201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com