opencv 单应变换

nnvyjq4y  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(112)

我有一个概念上的误解。我只是想检查一下,我的单应性变换是否工作正常(它看起来非常好)
我写了一个小测试,我想做的就是将转换后的图像转换回原始图像。然而,它看起来不像原来的,甚至没有接近
我想,我所要做的就是计算逆单应矩阵,并将其用于变换后的图像,但没有。
(this只是一个程序,我以前用过,并将其适应了这个测试)

import numpy as np
#import matplotlib.pyplot as plt
import cv2

img  = cv2.imread("colour.jpg")
height= img.shape[0] 
width = img.shape[1]
#################   Vorgaben ###################################

f=200
rotX= 0.2
rotZ= 0.02
rotY= 0.002
distX = 0.5
distY =0.7
distZ= 0.1


K = np.array([[f, 0, width/2, 0],
            [0, f, height/2, 0],
            [0, 0,   1, 0]])

# K inverse
Kinv = np.zeros((4,3))
Kinv[:3,:3] = np.linalg.inv(K[:3,:3])*f
Kinv[-1,:] = [0, 0, 1]

RX = np.array([[1,           0,            0, 0],
                        [0,np.cos(rotX),-np.sin(rotX), 0],
                        [0,np.sin(rotX),np.cos(rotX) , 0],
                        [0,           0,            0, 1]])

RY = np.array([[ np.cos(rotY), 0, np.sin(rotY), 0],
                        [            0, 1,            0, 0],
                        [ -np.sin(rotY), 0, np.cos(rotY), 0],
                        [            0, 0,            0, 1]])

RZ = np.array([[ np.cos(rotZ), -np.sin(rotZ), 0, 0],
                            [ np.sin(rotZ), np.cos(rotZ), 0, 0],
                            [            0,            0, 1, 0],
                            [            0,            0, 0, 1]])

        # Composed rotation matrix with (RX,RY,RZ)
R = np.linalg.multi_dot([ RX , RY , RZ ])

        # Translation matrix
T = np.array([[1,0,0,distX],
                            [0,1,0,distY],
                            [0,0,1,distZ],
                            [0,0,0,1]])

        # Overall homography matrix
H = np.linalg.multi_dot([K, R, T, Kinv])
Hinv = np.linalg.inv(H)

transformed = cv2.warpPerspective(img, H, img.shape[:2][::-1])
back = cv2.warpPerspective(transformed, Hinv, transformed.shape[:2][::-1])



cv2.imshow("test", img)
cv2.waitKey(2000)

cv2.imshow("test", transformed)
cv2.waitKey(2000)

cv2.imshow("test", back)
cv2.waitKey(2000)

编辑:我加入了图片以更好地理解。
原件:

转化:

反向转化:

3qpi33ja

3qpi33ja1#

我只是非常粗心,使用了不同的分辨率,甚至没有注意到。我的程序从缩小的图像计算单应性,并在原始图像上使用逆单应性。所以这个“测试”从一开始就错了。问题中使用的代码运行时没有问题。
我们能从这个错误中学到什么?除了如何在不同的分辨率上使用单应性之外,什么都没有,解释为here

相关问题