Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Opencv单应矩阵H和逆H对一个点进行变换并没有得到预期的结果_Python_Opencv_Transform_Perspective_Homography - Fatal编程技术网

Python Opencv单应矩阵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

我使用Opencv python接口,得到了单应矩阵H。它似乎工作正常,因为我可以使用扭曲透视从源图像获得扭曲图像。我现在尝试使用H和逆H在两个坐标之间来回变换一个点(不是图像),但没有得到预期的结果

为了得到矩阵,我做了以下工作:

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)