我有正面的照片。我想把它变成鸟瞰图。现在我想计算矩形 (x,y) 中的每个点将在梯形中转换 x,y 的内容。
对于给定的 x 和 y 以及梯形 (a) 的角度,这种变换必须有一个公式。
我正在用 C 编程并使用 opencv。
提前非常感谢。
我有正面的照片。我想把它变成鸟瞰图。现在我想计算矩形 (x,y) 中的每个点将在梯形中转换 x,y 的内容。
对于给定的 x 和 y 以及梯形 (a) 的角度,这种变换必须有一个公式。
我正在用 C 编程并使用 opencv。
提前非常感谢。
您是否考虑过单应性变换。您使用它来创建或纠正图像中的透视,我认为这正是您想要的。
使用 OpenCV,您可以使用方法cv::findHomography()。参数是 4 个初始点(矩形的顶点)和 4 个最终点(梯形的顶点)。您将获得一个转换矩阵,然后您可以将其与cv::warpPerspective()或cv::perspectiveTransform()一起使用。
我能够找到解决您问题的方法。
这是我用于相同的代码:
导入所需的包:import cv2
import numpy as np
读取要使用的图像:
filename = '1.jpg'
img = cv2.imread(filename)
cv2.imwrite('img.jpg',img)
将图像的高度和宽度存储在单独的变量中:
ih, iw, _ = img.shape
创建一个大小大于图像大小的黑色窗口,并将其高度和宽度存储在单独的变量中:
black = np.zeros((ih + 300, iw + 300, 3), np.uint8)
cv2.imwrite('black.jpg',black)
bh, bw, _ = black.shape
将图像的 4 个角点存储在数组中:
pts_src = np.array([[0.0, 0.0],[float(iw), 0.0],[float(iw), float(ih)],[0.0,float(ih)]])
存储要获得的梯形的4个角点:
pts_dst = np.array([[bw * 0.25, 0],[bw * 0.75, 0.0],[float(bw), float(bh)],[0.0,float(bh)]])
pts_src
使用和
计算单应矩阵pts_dst
:
h, status = cv2.findHomography(pts_src, pts_dst)
将给定的矩形图像变形为梯形:
im_out = cv2.warpPerspective(img, h, (black.shape[1],black.shape[0]))
cv2.imwrite("im_outImage.jpg", im_out)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果您更改数组中的值,pts_dst
您将能够获得不同类型的四边形。