我要在图像之间进行变换的点有两组。为此,我正在使用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_points
和blue_A_points
是 vector ,其中包含四个Point2f
值(这些是在它们之间转换的坐标)。使用warpAffine()进行转换后,我将在新窗口中显示转换后的图像。结果如下:
要转换的图像
变换后的图像
我将“A”的角用作特征点之间的转换(因此,为什么在它们上绘制红线和绿点以直观确认我已经正确找到了这些点)。我在窗口中手动移动了图像,以便可以更好地看到它,并且旋转在视觉上是正确的。但是,我希望看到蓝色的“A”,其中黑色的“A”在显示原始图像的窗口中(转换为该位置)。
我是否正确使用了单应矩阵?我需要对单应矩阵进行数学运算,然后才能在窗口的坐标中使用它(因为当前坐标系是错误的)?还是我使用的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]]
图像看起来像:
在C++中,
cv::Point2f
构造函数是cv::Point2f(x, y)
。您正在通过(y,x)。不确定如何找到这些点,但可能与cv::Mat::at<T>(row, col)
函数混淆,后者需要第一行和cols,或者是笛卡尔,y然后是x。关于c++ - 在带有OpenCV的C++中使用estimateRigidTransform()时,旋转正确,但翻译不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51133297/