OpenCV (cv2) 中的 undistortPoints 与 Python 错误结果 [英] undistortPoints in OpenCV (cv2) with Python wrong results

查看:399
本文介绍了OpenCV (cv2) 中的 undistortPoints 与 Python 错误结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试纠正图像和该图像上的一些点.整图效果很好(这部分代码不是我写的):

I try to rectify an image and some points, which are on this image. Rectifying the image works very well (this part of the code is not from me):

(mapx, mapy) = cv2.initUndistortRectifyMap(camera_matrix,dist_coefs,np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]),newCameraMatrix,(int(resolution*w), int(resolution*h)), cv2.CV_32FC1)
RectImg = cv2.remap(img, mapx,mapy,cv2.INTER_LINEAR )

但是当我用 undistortPoints 和相同的参数校正点时,我得到(在我看来)错误的坐标.

But when I rectify the points with undistortPoints and the same parameters, I get (for my opinion) wrong coordinates.

point_file = np.loadtxt(fn)
point_matrix = np.zeros(shape=(nr_points,1,2))

# fill Pointfile in n x 1 x 2-Matrix
for each in range(0, nr_points):
    point_matrix[each][0][0] = point_file[each][0]
    point_matrix[each][0][1] = point_file[each][1]

point_matrix_new = cv2.undistortPoints(point_matrix, newCameraMatrix, dist_coefs)

这些是我使用的参数(newCameraMatrix & dist_coefs):

These are the parameters I'm using (newCameraMatrix & dist_coefs):

    [[  4.93906295e+02   0.00000000e+00   1.24539714e+03]
     [  0.00000000e+00   4.92616567e+02   1.03814593e+03]
     [  0.00000000e+00   0.00000000e+00   1.00000000e+00]]
    [  5.93179211e-01   3.59577119e-02  -3.34062329e-05  -8.92301489e-05
      -5.27895858e-04   9.28762999e-01   1.46636733e-01   0.00000000e+00]

我也不确定,实际输出是什么.结果值是图像坐标还是传感器坐标,单位是什么?我只能找到 cv 的 undistortPoints 文档(http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html) 但不适用于 cv2.

I'm also not sure, what the output actually is. Are the resulting values are image-coordinates or sensor-coordinates and in which unit? I could only find a documentation of undistortPoints for cv (http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html) but not for cv2.

示例(图像尺寸 = 2448 x 2048 像素/传感器尺寸 = 8.6 x 6.6 毫米

example (image size = 2448 x 2048 pixel / sensor size = 8.6 x 6.6 mm

输入(point_matrix):

Input (point_matrix):

[[[    0.     0.]]

 [[ 2448.     0.]]

 [[    0.  2048.]]

 [[ 2448.  2048.]]

 [[ 1224.  1024.]]]

输出(point_matrix_new):

Output (point_matrix_new):

[[[-6.49236118 -5.42726306]]

 [[ 6.39989444 -5.5358653 ]]

 [[-6.50237385  5.28935346]]

 [[ 6.58981334  5.54673511]]

 [[-0.04336093 -0.02874159]]]

感谢您的帮助!

推荐答案

所以我发现了我的错误:我必须在 cv2.undistortPoints 中使用旧的和新的相机矩阵,就像在 cv2.initUndistortRectifyMap 中一样.

so I found my error: I have to use the old and the new camera matrix in cv2.undistortPoints like in cv2.initUndistortRectifyMap.

所以为了纠正它,我只是使用了这个代码:

so to correct it I just used this code:

point_matrix_new = cv2.undistortPoints(point_matrix,camera_matrix,dist_coefs,P=newCameraMatrix)

这篇关于OpenCV (cv2) 中的 undistortPoints 与 Python 错误结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆