当我再次使用变换矩阵的逆运算warpPerspective()时,我得到了第一个图像:
M = cv2.getPerspectiveTransform(pts1,pts2)
warped = cv2.warpPerspective(img, M, (cols,rows))
# ... some operations, obtain a rectangle
ret, IM = cv2.invert(M)
restored = cv2.warpPerspective(warped, IM, (cols,rows))
但是,我对warped
应用了一些操作,并在图像上得到了一些位置(如矩形)。我如何在restored
图像上找到矩形的相应坐标?
感谢python和C ++中的答案。
答案 0 :(得分:0)
您应该能够简单地将矩形的坐标作为输入数组传递给Request
函数,以获得相应的变换点。例如(带有std :: vector的C ++中的示例代码):
warpPerspective
请注意,如果您需要在//r1,r2,r3,r4 are the four points of your rectangle in the source image
std::vector<Point2f> rectangle_vertexes;
rectangle_vertexes.push_back(r1);
rectangle_vertexes.push_back(r2);
rectangle_vertexes.push_back(r3);
rectangle_vertexes.push_back(r4);
Mat transformed_vertexes;
warpPerspective(Mat(rectangle_vertexes),transformed_vertexes,IM,Size(1,4),WARP_INVERSE_MAP);
图片上应用转换M
以获取src
图片,则需要设置标记dst
。
希望这可以帮到你
答案 1 :(得分:0)
M = cv2.getPerspectiveTransform(pts1,pts2)
通过这个矩阵,您可以获得 3x3 变换矩阵,其中包括旋转、缩放、平移、投影向量。
通过应用 warpPerspective
,您将从源坐标系(坐标系 {A})移动到目标坐标系(坐标系 {B})。
要从{B}帧移回{A}帧,您需要将矩阵M的逆矩阵与{B}帧中的点P相乘。由于矩阵是 3x3 矩阵,您需要将 z = 1 添加到您的点 P 以使其成为 3x1 矩阵。
_, IM = cv2.invert(M)
x1 = 159
y1 = 99
coord = [x1, y1] + [1]
P = np.float32(coord)
x, y, z = np.dot(IM, P)
#Divide x and y by z to get 2D in frame {A}
new_x = x/z
new_y = y/z