Android OpenCV undistort image从看似相同的python实现中产生不同的结果
我们有一个简单的python例程,它通过调用cv2.fisheye.undortimage()获取图像并对其进行解压缩。它根据输入图像和提供的相机矩阵生成预期结果 我将python函数移植到Android。当输入相同的图像时,Android版本不会产生相同的结果,我不明白为什么。我在港口丢了什么东西吗 Python源代码(按预期工作) 现在,python代码移植到Android,如下所示: Android端口(不产生预期结果) 给定一个常量输入,我希望两个实现产生相同的输出。这并没有发生。Python版本做了一些不失真的处理,但是Android版本似乎忽略了一些输入参数。我的Android端口是否有什么问题,我没有看到 输入图像 Python输出图像(正确!) 下图未按预期失真 Android输出图像(不正确!) 当如上所述运行Android功能时,未执行任何不失真操作。取而代之的是,图像按照已知的矩阵缩小。有没有关于如何解释这种差异的想法Android OpenCV undistort image从看似相同的python实现中产生不同的结果,android,python,opencv,opencv4android,Android,Python,Opencv,Opencv4android,我们有一个简单的python例程,它通过调用cv2.fisheye.undortimage()获取图像并对其进行解压缩。它根据输入图像和提供的相机矩阵生成预期结果 我将python函数移植到Android。当输入相同的图像时,Android版本不会产生相同的结果,我不明白为什么。我在港口丢了什么东西吗 Python源代码(按预期工作) 现在,python代码移植到Android,如下所示: Android端口(不产生预期结果) 给定一个常量输入,我希望两个实现产生相同的输出。这并没有发生。Pyt
经过反复的思考、论坛搜索和源代码搜索,我找到了答案。 事实证明,
Imgproc.unsortive()
的实现与cv2.fisheye.unsortimage()的实现不同
Java/JNI世界中的等价物是Calib3d.unortimage()
。调用该函数时,输出与python版本相同
必须将Android版OpenCV升级到高于3的版本才能访问此功能
cx = 960
cy = 540
val = 600
K = np.array([[ val, 0. , cx],
[ 0. , val , cy],
[ 0. , 0. , 1. ]])
# zero distortion coefficients work well for this image
D = np.array([0., 0., 0., 0.])
# use Knew to scale the output
Knew = K.copy()
Knew[(0,1), (0,1)] = 0.4 * Knew[(0,1), (0,1)]
img = cv2.imread('fisheye_sample.jpg')
img_undistorted = cv2.fisheye.undistortImage(img, K, D=D, Knew=Knew)
cv2.imwrite('fisheye_sample_undistorted.jpg', img_undistorted)
float fishVal = 600.0f;
float cX = 960;
float cY = 540;
Mat K = new Mat(3, 3, CvType.CV_32FC1);
K.put(0, 0, new float[]{fishVal, 0, cX});
K.put(1, 0, new float[]{0, fishVal, cY});
K.put(2, 0, new float[]{0, 0, 1});
Mat D = new Mat(1, 4, CvType.CV_32FC1);
D.put(0, 0, new float[]{0, 0, 0, 0});
Mat Knew = K.clone();
Knew.put(0, 0, new float[]{fishVal * 0.4f, 0.0f, cX});
Knew.put(1, 0, new float[]{0.0f, fishVal * 0.4f, cY});
Knew.put(2, 0, new float[]{0.0f, 0.0f, 1.0f});
Mat dst = new Mat(greyScaleMat.rows(), greyScaleMat.cols(), greyScaleMat.type());
Imgproc.undistort(greyScaleMat, dst, K, D, Knew);