Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OpenCV undistort image从看似相同的python实现中产生不同的结果_Android_Python_Opencv_Opencv4android - Fatal编程技术网

Android OpenCV undistort image从看似相同的python实现中产生不同的结果

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

我们有一个简单的python例程,它通过调用cv2.fisheye.undortimage()获取图像并对其进行解压缩。它根据输入图像和提供的相机矩阵生成预期结果

我将python函数移植到Android。当输入相同的图像时,Android版本不会产生相同的结果,我不明白为什么。我在港口丢了什么东西吗

Python源代码(按预期工作)

现在,python代码移植到Android,如下所示:

Android端口(不产生预期结果)

给定一个常量输入,我希望两个实现产生相同的输出。这并没有发生。Python版本做了一些不失真的处理,但是Android版本似乎忽略了一些输入参数。我的Android端口是否有什么问题,我没有看到

输入图像

Python输出图像(正确!) 下图未按预期失真 Android输出图像(不正确!) 当如上所述运行Android功能时,未执行任何不失真操作。取而代之的是,图像按照已知的矩阵缩小。有没有关于如何解释这种差异的想法


经过反复的思考、论坛搜索和源代码搜索,我找到了答案。 事实证明,
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);