OpenCV "getOptimalNewCameraMatrix"在Linux / ARM和Windows上的行为不同



我使用OpenCV来消除图像侵权。该代码在Windows机器上运行良好(Win 10,Conda环境opencv 3.4版(,但在树莓派4b(opencv 4.3.0.38版(上产生0x0px图像。原因似乎是,getOptimalNewCameraMatrix在Pi 上返回不同的Matrix和Roi

就我而言,对于相同的输入,不应该有不同的输出,这取决于操作系统/体系结构。我有点迷路了,感谢任何类型的输入!

MWE:

import numpy as np
import cv2
#Image Dimensions
w=1024
h=768
#Parameters for undistortion
dist=np.array([[-2.85565904e-01, 1.12953316e-01, -1.99828374e-05, 1.23181460e-03, -2.40348722e-02]])
mtx =np.array([[500.94118521, 0., 557.7440342],[0., 500.13379004, 378.9970866],[0., 0., 1.]])

newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
print(newcameramtx)

Windows 10 Conda环境下的输出(产生有用的无失真(

[[354.12069702   0.         534.00911997]
[  0.         323.64080811 370.0690567 ]
[  0.           0.           1.        ]]

树莓派4 B 的输出

[[ 25.96581841   0.         988.14487751]
[  0.          31.46662331  35.98070241]
[  0.           0.           1.        ]]

因为旧版本OpenCV中有一个关于getOptimalNewCameraMatrix()的错误,并且在版本3.4.94.2.0中进行了修复(它们都在2019.12发布(

也就是说,如果您使用的是3.4.9之前的OpenCV3或4.2.0之前的OpenCV 4,函数getOptimalNewCameraMatrix()可能会得到错误的结果。这与平台无关。

供参考:

  • #15953:立体声校正(cvStereoRectify(、initCameraMatrix2D(cvInitIntrinsicParams2D(、getOptimalNewCameraMatrix(cvGetOptimalNewCameraMatrix(中的错误
  • #16024:calib3d:revert stereoRectify((从PR更改:6836、6972、6955

最新更新