1

我正在开展一个项目,该项目试图纠正一系列图像中的透视失真。我知道这样做的正确方法是用已知对象校准系统,然后计算单应性。如果我能够做到这一点,我创建了一个虚拟环境(见下图)。

在此处输入图像描述 在此处输入图像描述

但是,我遇到了一种情况,需要校正的图像已经收集完毕,无法对其进行反向校准(图像相对没有特征)。基于一些额外的数据,我能够估计相机的位置。有了这些信息,我认为我应该能够创建单应矩阵(H)。为此,编写了一个创建旋转矩阵 (R) 的程序。将 R 乘以平移矩阵 (T),然后乘以相机内在函数。然后在 WarpPerspective 函数中使用该矩阵。生成的图像以固定的相机位置旋转图像。我想让图像处于固定位置并基本上旋转相机。我该怎么做呢?我现有的程序附在下面。感谢您的帮助。

from numpy import *
import cv

global x
global y
global z
x = y = z = float(90)

def createMatrix(x, y, z):
    print x,y,z 

    x1 = (x-90) * (pi / 180)
    y1 = (y-90) * (pi / 180)
    z1 = (z-90) * (pi / 180)

    # Create a rotation matrix
    R_array = array([[x1], [y1], [z1]])
    R_Vec = cv.fromarray(R_array)
    R = cv.CreateMat(3, 3, cv.CV_64FC1)

    cv.Rodrigues2(R_Vec, R)
    R_r = array(R)
    R_r[0][2] = 0
    R_r[1][2] = 0
    R_r[2][2] = 1
    RR = cv.fromarray(R_r)

    #Create and combine with translation matrix
    Trans_Mat = array([[[1], [0], [-w/2]],
                        [[0], [1], [-h/2]],
                        [[0], [0], [1]]])

    Trans_Mat2 = cv.fromarray(Trans_Mat)
    R_T_Mat = dot(RR, Trans_Mat2)
    R_T_Mat[2][2] += h

    #Create and combine with camera matrix
    Intrinsic_Mat = array([[[h], [0], [w/2]],
                           [[0], [h], [h/2]],
                           [[0], [0], [1]]])

    Int_Mat = cv.fromarray(Intrinsic_Mat)
    H = dot(Int_Mat, R_T_Mat)
    return cv.fromarray(H)

def warp_displayImage():

    H2 = createMatrix(x,y,z)
    persp = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_8U, 3)
    cv.WarpPerspective(im, persp, H2)

    cv.ShowImage("Distorted", im)
    cv.ShowImage("undistorted", persp)

def resetX(pos):
    global x
    x = float(pos)
    warp_displayImage()

def resetY(pos):
    global y
    y = float(pos)
    warp_displayImage()

def resetZ(pos):
    global z
    z = float(pos)
   warp_displayImage()

im = cv.LoadImage("homography_test.jpg")
h, w = cv.GetSize(im)
cv.NamedWindow("Distorted")
cv.NamedWindow("undistorted")
cv.CreateTrackbar("X axis", "undistorted", int(x),180, resetX)
cv.CreateTrackbar("Y axis", "undistorted", int(y),180, resetY)
cv.CreateTrackbar("Z axis", "undistorted", int(z),180, resetZ)


warp_displayImage()

cv.WaitKey(0)
cv.DestroyWindow("Distorted")
cv.DestroyWindow("undistorted")

此代码基于 Hammer 的帮助: 基于已知相机方向的 OpenCV 中的透视变形

4

0 回答 0