如何确定透视变换后点在新图像平面中的位置?
how do I determine the locations of the points after perspective transform, in the new image plane?
我正在使用 OpenCV+Python+Numpy,图像中有三个点,我知道这些点的确切位置。
(P1, P2);
N1
我要将图像转换为另一个视图,(例如我正在将透视图转换为侧视图)。如果我这样做,我将无法获得这三个点在图像平面中的确切位置。
我应该以一种可以获得这些点的新坐标的方式编写代码。
pts1=np.float32([[867,652],[1020,580],[1206,666],[1057,757]])
pts2=np.float32([[700,732],[869,754],[906,916],[712,906]])
matrix=cv2.getPerspectiveTransform(pts1,pts2)
result=cv2.warpPerspective(Image1,matrix,(1920,1080))
cv2.imshow('Image',Image1) cv2.imshow('Tran',result)
我的问题是:如何确定这 3 个点的新位置?
看看documentation,但总的来说:
cv2.perspectiveTransform(points, matrix)
例如:
# note you need to add a new axis, to match the supposed format
cv2.perspectiveTransform(pts1[np.newaxis, ...], matrix)
# returns array equal to pts2
很简单,您可以查看文档 warpPerspective
的工作原理。要转换点的位置,您可以使用以下转换:
其中[x, y]
是原点,M
是你的透视矩阵
在 python 中实现,您可以使用以下代码:
p = (50,100) # your original point
px = (matrix[0][0]*p[0] + matrix[0][1]*p[1] + matrix[0][2]) / ((matrix[2][0]*p[0] + matrix[2][1]*p[1] + matrix[2][2]))
py = (matrix[1][0]*p[0] + matrix[1][1]*p[1] + matrix[1][2]) / ((matrix[2][0]*p[0] + matrix[2][1]*p[1] + matrix[2][2]))
p_after = (int(px), int(py)) # after transformation
您可以在下面的代码中看到结果。红点是您的原始点。第二张图显示了透视变换后的去向。蓝色圆圈是您在上面的公式中计算出的点。
你可以看看我的 Jupyter Notebook here or here。
代码:
import numpy as np
import cv2
import matplotlib.pyplot as plt
# load the image, clone it for output, and then convert it to grayscale
image = cv2.imread('sample.png')
pts1=np.float32([[867,652],[1020,580],[1206,666],[1057,757]])
pts2=np.float32([[700,732],[869,754],[906,916],[712,906]])
matrix=cv2.getPerspectiveTransform(pts1,pts2)
# Draw the point
p = (50,100)
cv2.circle(image,p, 20, (255,0,0), -1)
# Put in perspective
result=cv2.warpPerspective(image,matrix,(1500,800))
# Show images
plt.imshow(image)
plt.title('Original')
plt.show()
plt.imshow(result)
plt.title('Distorced')
plt.show()
# Here you can transform your point
p = (50,100)
px = (matrix[0][0]*p[0] + matrix[0][1]*p[1] + matrix[0][2]) / ((matrix[2][0]*p[0] + matrix[2][1]*p[1] + matrix[2][2]))
py = (matrix[1][0]*p[0] + matrix[1][1]*p[1] + matrix[1][2]) / ((matrix[2][0]*p[0] + matrix[2][1]*p[1] + matrix[2][2]))
p_after = (int(px), int(py))
# Draw the new point
cv2.circle(result,p_after, 20, (0,0,255), 12)
# Show the result
plt.imshow(result)
plt.title('Predicted position of your point in blue')
plt.show()
我正在使用 OpenCV+Python+Numpy,图像中有三个点,我知道这些点的确切位置。
(P1, P2);
N1
我要将图像转换为另一个视图,(例如我正在将透视图转换为侧视图)。如果我这样做,我将无法获得这三个点在图像平面中的确切位置。 我应该以一种可以获得这些点的新坐标的方式编写代码。
pts1=np.float32([[867,652],[1020,580],[1206,666],[1057,757]])
pts2=np.float32([[700,732],[869,754],[906,916],[712,906]])
matrix=cv2.getPerspectiveTransform(pts1,pts2)
result=cv2.warpPerspective(Image1,matrix,(1920,1080))
cv2.imshow('Image',Image1) cv2.imshow('Tran',result)
我的问题是:如何确定这 3 个点的新位置?
看看documentation,但总的来说:
cv2.perspectiveTransform(points, matrix)
例如:
# note you need to add a new axis, to match the supposed format
cv2.perspectiveTransform(pts1[np.newaxis, ...], matrix)
# returns array equal to pts2
很简单,您可以查看文档 warpPerspective
的工作原理。要转换点的位置,您可以使用以下转换:
其中[x, y]
是原点,M
是你的透视矩阵
在 python 中实现,您可以使用以下代码:
p = (50,100) # your original point
px = (matrix[0][0]*p[0] + matrix[0][1]*p[1] + matrix[0][2]) / ((matrix[2][0]*p[0] + matrix[2][1]*p[1] + matrix[2][2]))
py = (matrix[1][0]*p[0] + matrix[1][1]*p[1] + matrix[1][2]) / ((matrix[2][0]*p[0] + matrix[2][1]*p[1] + matrix[2][2]))
p_after = (int(px), int(py)) # after transformation
您可以在下面的代码中看到结果。红点是您的原始点。第二张图显示了透视变换后的去向。蓝色圆圈是您在上面的公式中计算出的点。
你可以看看我的 Jupyter Notebook here or here。
代码:
import numpy as np
import cv2
import matplotlib.pyplot as plt
# load the image, clone it for output, and then convert it to grayscale
image = cv2.imread('sample.png')
pts1=np.float32([[867,652],[1020,580],[1206,666],[1057,757]])
pts2=np.float32([[700,732],[869,754],[906,916],[712,906]])
matrix=cv2.getPerspectiveTransform(pts1,pts2)
# Draw the point
p = (50,100)
cv2.circle(image,p, 20, (255,0,0), -1)
# Put in perspective
result=cv2.warpPerspective(image,matrix,(1500,800))
# Show images
plt.imshow(image)
plt.title('Original')
plt.show()
plt.imshow(result)
plt.title('Distorced')
plt.show()
# Here you can transform your point
p = (50,100)
px = (matrix[0][0]*p[0] + matrix[0][1]*p[1] + matrix[0][2]) / ((matrix[2][0]*p[0] + matrix[2][1]*p[1] + matrix[2][2]))
py = (matrix[1][0]*p[0] + matrix[1][1]*p[1] + matrix[1][2]) / ((matrix[2][0]*p[0] + matrix[2][1]*p[1] + matrix[2][2]))
p_after = (int(px), int(py))
# Draw the new point
cv2.circle(result,p_after, 20, (0,0,255), 12)
# Show the result
plt.imshow(result)
plt.title('Predicted position of your point in blue')
plt.show()