gpt4 book ai didi

c++ - 在带有 OpenCV 的 C++ 中使用 estimateRigidTransform() 时,旋转正确但平移不正确

转载 作者:太空宇宙 更新时间:2023-11-03 22:43:20 24 4
gpt4 key购买 nike

我尝试在图像中转换两组点。为此,我使用了 OpenCV 的函数 estimateRigidTransform()。使用生成的单应矩阵(包含旋转矩阵和平移 vector ),我使用 OpenCV 的函数 warpAffine() 来转换图像。然后我在新窗口中显示这个转换后的图像。我的代码如下:

cv::namedWindow("Transformed Blue A", CV_WINDOW_AUTOSIZE);
cv::Mat mask_image, warp_matrix;
bool fullAffine = false;

homography_matrix = estimateRigidTransform(black_A_points, blue_A_points, fullAffine);
warpAffine(image, mask_image, homography_matrix, image.size());
cv::imshow("Transformed Blue A", mask_image);

black_A_pointsblue_A_points 是包含四个 Point2f 值的 vector (这些是在它们之间转换的坐标)。使用 warpAffine() 转换后,我在新窗口中显示转换后的图像。

结果如下:要转换的图像

转换图像

我使用“A”的角作为特征点在它们之间进行转换(因此为什么在它们上面绘制红线和绿点以视觉确认我已正确找到这些点)。我手动将图像移到窗口中,这样我可以看得更清楚并且旋转在视觉上是正确的。但是,我希望看到蓝色的“A”,其中黑色“A”在显示原始图像(转换到该位置)的窗口中。

The homography matrix is: [-0.7138494567933336, 0.7193648090910907, 40.48675760211488; -0.7193648090910907, -0.7138494567933336, 849.4044159834291]

Therefore the rotation matrix is: [-0.7138494567933336, 0.7193648090910907; -0.7193648090910907, -0.7138494567933336]

and the translation vector is: [40.48675760211488; 849.4044159834291]

我是否正确使用了单应矩阵?在我可以在窗口坐标中使用它之前,我是否需要对单应矩阵执行数学运算(因为当前坐标系是错误的)?还是我使用的 OpenCV 函数有误?

我还尝试了 OpenCV 函数 findHomography() 和 getAffineTransform(),但这两个函数都产生了同样的问题。

非常感谢您的宝贵时间。感谢您的帮助。

更新:

黑色 A 的角:

[(495, 515), (479, 497), (428, 646), (345, 565)]

蓝色 A 的角:

[(57, 125), (57, 151), (200, 80), (200, 198)]

最佳答案

用你的数字测试后我发现了问题:)

您将点用作 (y,x) 而不是 (x,y)。我尝试使用您的原始数字,并重现了与您相同的结果。然后我做了一个小脚本在 python 中测试它,反转坐标:

import numpy as np
import cv2

# loads iamge and data
img = cv2.imread("test.png")
pointsBlack = np.array([(495, 515), (479, 497), (428, 646), (345, 565)])
pointsBlue = np.array([(57, 125), (57, 151), (200, 80), (200, 198)])

# inverts the points (y,x) is (x,y)
a = np.array([(x[1], x[0]) for x in pointsBlack])
b = np.array([(x[1], x[0]) for x in pointsBlue])

res = cv2.estimateRigidTransform(a, b, True)
print(res)

imgWarped = cv2.warpAffine(img, res, img.shape[1::-1])
cv2.imshow("warped", imgWarped)
cv2.imshow("s", img)
cv2.waitKey(0)

结果是:

[[-7.80571429e-01 -7.46857143e-01  8.96688571e+02]
[ 6.53714286e-01 -7.35428571e-01 8.43742857e+01]]

图像看起来像:

enter image description here

在 C++ 中 cv::Point2f构造函数是 cv::Point2f(x, y) .您正在通过 (y,x)。不确定您是如何找到这一点的,但这可能与 cv::Mat::at<T>(row, col) 混淆接受第一行和列的函数,或者在笛卡尔坐标中,先是 y,然后是 x。

关于c++ - 在带有 OpenCV 的 C++ 中使用 estimateRigidTransform() 时,旋转正确但平移不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51133297/

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