Python Opencv单应矩阵H和逆H对一个点进行变换并没有得到预期的结果
我使用Opencv python接口,得到了单应矩阵H。它似乎工作正常,因为我可以使用扭曲透视从源图像获得扭曲图像。我现在尝试使用H和逆H在两个坐标之间来回变换一个点(不是图像),但没有得到预期的结果 为了得到矩阵,我做了以下工作:Python Opencv单应矩阵H和逆H对一个点进行变换并没有得到预期的结果,python,opencv,transform,perspective,homography,Python,Opencv,Transform,Perspective,Homography,我使用Opencv python接口,得到了单应矩阵H。它似乎工作正常,因为我可以使用扭曲透视从源图像获得扭曲图像。我现在尝试使用H和逆H在两个坐标之间来回变换一个点(不是图像),但没有得到预期的结果 为了得到矩阵,我做了以下工作: pts1 = np.float32(corners) pts2 = np.float32([[0,0], [400,0], [400,400], [0,400]]) self.transform_matrix = cv2.getPerspectiveTransfor
pts1 = np.float32(corners)
pts2 = np.float32([[0,0], [400,0], [400,400], [0,400]])
self.transform_matrix = cv2.getPerspectiveTransform(pts1, pts2)
给定此矩阵,我使用以下方法进行正变换和逆变换:
def transformPoints(self, x, y, reverse=False, integer=True):
if reverse == False:
H = self.transform_matrix
else:
val, H = cv2.invert(self.transform_matrix)
# get the elements in the transform matrix
h0 = H[0,0]
h1 = H[0,1]
h2 = H[0,2]
h3 = H[1,0]
h4 = H[1,1]
h5 = H[1,2]
h6 = H[2,0]
h7 = H[2,1]
h8 = H[2,2]
tx = (h0*x + h1*y + h2)
ty = (h3*x + h4*x + h5)
tz = (h6*x + h7*y + h8)
if integer==True:
px = int(tx/tz)
py = int(ty/tz)
Z = int(1/tz)
else:
px = tx/tz
py = ty/tz
Z = 1/tz
return (px, py)
现在,如果我这样做:
s, t = 100,200
print "s=%d, t=%d" % (s,t)
a, b = pt.transformPoints(s,t)
print "a=%d, b=%d" % (a,b)
c, d = pt.transformPoints(a, b, True)
print "c=%d, d=%d" % (c,d)
这是它打印的内容:
a=395,b=169
c=91,d=226
我期望c=100和d=200,或者至少接近
这是矩阵,它是逆矩阵。H矩阵 反向:
[[ 4.13378829e-01 1.05495739e-01 -1.91452995e+02]
[ -3.12201095e-02 -2.37099792e-02 -9.03788455e+00]
[ 4.97814178e-04 -5.46754880e-04 -2.36269358e-01]]
我试着做点积,它似乎生成了一个单位矩阵ok:
[[ 1.00000000e+00 1.77635684e-15 -5.68434189e-14]
[ -6.93889390e-18 1.00000000e+00 5.32907052e-15]
[ -2.16840434e-19 1.73472348e-18 1.00000000e+00]]
非常感谢您的帮助。您在第二行有一个输入错误
tx = (h0*x + h1*y + h2)
ty = (h3*x + h4*x + h5)
tz = (h6*x + h7*y + h8)
h4
应该与y
坐标相乘如果A*B是同一的,那么A和B实际上是彼此的倒数。猜测:numpy使用x,y索引而不是行,列索引。你能试试h0=H[0,0]h1=H[1,0]h2=H[2,0]h3=H[0,1]等等吗?谢谢你的建议。如果我打印h0,h1。。。单独而言,它们是矩阵中正确的元素,因此我认为这不是问题所在。请尝试使用integer=false。。。将生成的点变换并四舍五入到int精度。然后,您希望舍入的点反向转换回您的原始点,这是毫无意义的…请尝试t=200打印“s=%d,t=%d”%(s,t)(a,b)=pt。transformPoints(s,t,False,False)打印“a=%d,b=%d”%(a,b)(c,d)=pt。transformPoints(a,b,True,False)打印“transformPoints=%d,%d”(c,d)并发布结果这可能就是它。谢谢你发现了它,已经困扰了我一段时间了。我还没有试过,但很可能会解决这个问题。
tx = (h0*x + h1*y + h2)
ty = (h3*x + h4*x + h5)
tz = (h6*x + h7*y + h8)