使用任意旋转角度的翘曲透视

pzo*_*pzo 5 opencv image-processing

我有一个从某个角度拍摄的棋盘图像.现在我想扭曲视角,使棋盘图像再次看起来好像是从上面直接拍摄的.

我知道我可以尝试在匹配点之间使用'findHomography',但我想避免使用它,例如使用移动传感器的旋转数据来构建我自己的单应矩阵.我校准了相机以获得内在参数.然后让我们说下面的图像是围绕x轴以~60度角拍摄的.我认为我所要做的就是将相机矩阵与旋转矩阵相乘以获得单应矩阵.我尝试使用以下代码,但看起来我没有正确理解某些东西,因为它没有按预期工作(结果图像完全是黑色或白色.

在此输入图像描述

import cv2
import numpy as np
import math 



camera_matrix = np.array([[ 5.7415988502105745e+02, 0., 2.3986181527877352e+02],
                           [0., 5.7473682183375217e+02, 3.1723734404756237e+02], 
                           [0., 0., 1.]])

distortion_coefficients = np.array([ 1.8662919398453856e-01, -7.9649812697463640e-01,
   1.8178068172317731e-03, -2.4296638847737923e-03,
   7.0519002388825025e-01 ])

theta = math.radians(60)

rotx = np.array([[1, 0, 0],
               [0, math.cos(theta), -math.sin(theta)],
               [0, math.sin(theta), math.cos(theta)]])   



homography = np.dot(camera_matrix, rotx)


im = cv2.imread('data/chess1.jpg')
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

im_warped = cv2.warpPerspective(gray, homography, (480, 640), flags=cv2.WARP_INVERSE_MAP)
cv2.imshow('image', im_warped)
cv2.waitKey()
pass
Run Code Online (Sandbox Code Playgroud)

校准后我也有失真系数.如何将这些结合到代码中以改善结果?

Ham*_*mer 1

一个问题是,要乘以相机矩阵,您需要一些 az 坐标的概念。在考虑畸变系数之前,您应该首先让给定欧拉角的基本图像扭曲发挥作用。看一下这个答案以获得更详细的解释,并尝试复制我的结果。将图像沿 z 轴移动然后用相机矩阵投影的想法可能会令人困惑,如果其中任何部分没有意义,请告诉我。