OpenCV:Undersort(对于图像)和UndersortPoints不一致

2024-10-16 22:25:34 发布

您现在位置:Python中文网/ 问答频道 /正文

对于测试,我生成一个网格图像作为矩阵,再次生成网格点作为点阵列:

"distorted" camera image with feature points

这表示“扭曲”的相机图像以及一些特征点。 现在取消对图像和栅格点的扭曲时,会得到以下结果:

image and points after individual undistortionzoom into undistorted result

(请注意,“失真”图像是直的,而“未失真”图像是变形的,这不是重点,我只是用一个直的测试图像来测试未失真函数。)

栅格图像和红色栅格点现在完全未对齐。我在谷歌上搜索发现,有些人忘记在不失真点中指定“新相机矩阵”参数,但我没有。文档中也提到了标准化,但当我使用身份矩阵作为相机矩阵时,仍然存在问题。而且,在中部地区,它非常适合

为什么这不一样,我用错了东西吗

我在Python中使用cv2(4.1.0)。以下是测试代码:


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

w = 401
h = 301


# helpers
#--------

def plotImageAndPoints(im, pu, pv):
    plt.imshow(im, cmap="gray")
    plt.scatter(pu, pv, c="red", s=16)
    plt.xlim(0, w)
    plt.ylim(0, h)
    plt.show()

def cv2_undistortPoints(uSrc, vSrc, cameraMatrix, distCoeffs):
    uvSrc = np.array([np.matrix([uSrc, vSrc]).transpose()], dtype="float32")
    uvDst = cv2.undistortPoints(uvSrc, cameraMatrix, distCoeffs, None, cameraMatrix)
    uDst = [uv[0] for uv in uvDst[0]]
    vDst = [uv[1] for uv in uvDst[0]]
    return uDst, vDst


# test data
#----------

# generate grid image
img = np.ones((h, w), dtype = "float32")
img[0::20, :] = 0
img[:, 0::20] = 0

# generate grid points
uPoints, vPoints = np.meshgrid(range(0, w, 20), range(0, h, 20), indexing='xy')
uPoints = uPoints.flatten()
vPoints = vPoints.flatten()

# see if points align with the image
plotImageAndPoints(img, uPoints, vPoints) # perfect!


# undistort both image and points individually
#---------------------------------------------

# camera matrix parameters
fx = 1
fy = 1
cx = w/2
cy = h/2

# distortion parameters
k1 = 0.00003
k2 = 0
p1 = 0
p2 = 0

# convert for opencv
mtx = np.matrix([
    [fx,  0, cx],
    [ 0, fy, cy],
    [ 0,  0,  1]
], dtype = "float32")

dist = np.array([k1, k2, p1, p2], dtype = "float32")

# undistort image
imgUndist = cv2.undistort(img, mtx, dist)
# undistort points
uPointsUndist, vPointsUndist = cv2_undistortPoints(uPoints, vPoints, mtx, dist)

# test if they still match
plotImageAndPoints(imgUndist, uPointsUndist, vPointsUndist) # awful!

感谢您的帮助


Tags: 图像imageimgnpplt矩阵cv2uv