我需要帮助 ,
我正在从服务器收到一个单应性,因此我想将此单应性归一化为我的应用的坐标系,当我尝试用坐标表示一个对象时,服务器应用会生成以下四个点:
收到[96.629539,217.31934; 97.289948,167.21941; 145.69249,168.28044; 145.69638,219.84604]
然后我的应用会产生以下4点:
本地[126.0098,55.600437; 262.39163,53.98035; 259.41382,195.34763; 121.48138,184.95235]
我用图形表示这一点,R(接收),P(局部)
看起来生成的正方形已旋转并缩放了,所以我想知道是否有任何方法可以将此缩放比例应用于服务器单应性,以便能够具有与我的应用程序单应性相同的单应性。
谢谢,我需要更多信息,请问我。
非常感谢您的快速解答,最后我使用了其他近似方法,就像从服务器获取点和使用findhomography获得逆单应性一样简单。
homography = findHomography(srcPoints,dstPoints,match_mask,RANSAC,10);
谢谢!!!
最佳答案
我想我明白了。下面是您的两个同形异义词的更准确图。蓝色是“接收”单应性图,红色是“本地”单应性图。
您可以使用OpenCV函数getAffineTransform计算与3个点对相关的仿射变换(我必须重新组织您的点对,因为它们的顺序不正确)。我在numpy中运行它,如下所示:
r = array([[97.289948, 167.21941], [96.629539, 217.31934], [145.69638, 219.84604]], np.float32)
l = array([[126.0098, 55.600437], [121.48138, 184.95235], [259.41382, 195.34763]], np.float32)
A = cv2.getAffineTransform(r, l)
这为我们提供了以下仿射关系:
array([[ 2.81385763e+00, -5.32961421e-02, -1.38838108e+02],
[ 7.88519054e-02, 2.58291747e+00, -3.83984986e+02]])
我将其应用于
r
,以查看是否可以获取l
来确保其工作原理如下:# split affine warp into rotation, scale, and/or shear + translation matrix
T = mat(A[:, 2]).T
matrix([[-138.83810801],
[-383.98498637]])
A = mat(A[:, 0:2])
matrix([[ 2.81385763, -0.05329614],
[ 0.07885191, 2.58291747]])
# apply warp to r to get l
r = mat(r).T
A*r + T
# gives
matrix([[ 126.00980377, 121.48137665, 259.41381836],
[ 55.60043716, 184.9523468 , 195.34762573]])
# which equals
l = mat(l).T
matrix([[ 126.00980377, 121.48137665, 259.41381836],
[ 55.60043716, 184.9523468 , 195.34762573]], dtype=float32)
还要注意的是,您可以使用OpenCV函数getPerspectiveTransform来生成
Markus Jarderot
所示的透视变换。希望对您有所帮助!