opencv for Java4.1.2中有stitcher类了,可以不用JNI实现全景图片的拼接了吗

网上Java实现全景图片拼接都是用的JavaJNI调用c++的stitch函数,在maven上下载的JavaCPP presets for OpenCV最新的包中也有stitcher类了,类比c++中stitch的用法写了一段代码:

import static org.bytedeco.opencv.global.opencv_imgcodecs.imread;
import static org.bytedeco.opencv.global.opencv_imgcodecs.imwrite;
import org.bytedeco.opencv.opencv_core.Mat;
import org.bytedeco.opencv.opencv_core.MatVector;
import org.bytedeco.opencv.opencv_stitching.Stitcher;

public class Test {

    //拼接两张图片,路径为path1和path2
    public static Mat splice(String path1,String path2) {
        Mat mat1 = imread(path1);
        Mat mat2 = imread(path2);
        System.out.println(mat2);
        System.out.println(mat1);
        MatVector vector = new MatVector();
        Mat mat = new Mat();
        vector.put(mat2);
        vector.put(mat1);
        Stitcher stitcher = Stitcher.create();
        //c++中stitch函数的参数是vector<Mat>,Mat,前者存放要拼接的图片,后者为拼接结果
        stitcher.stitch(vector, mat);
        System.out.println(mat);
        stitcher.close();
        return mat;
    }
    public static void main(String[] args) {
        Mat mat = splice("D:\\img1.jpg", "D:\\img2.jpg");
        System.out.println(mat);
        imwrite("D:\\img3.jpg",mat);
    }
}

可这样得到的拼接结果是空值,报错如下Exception in thread "main" java.lang.RuntimeException: OpenCV(4.1.2) C:\projects\javacpp-presets\opencv\cppbuild\windows-x86_64\opencv-4.1.2\modules\imgcodecs\src\loadsave.cpp:715: error: (-215:Assertion failed) !_img.empty() in function 'cv::imwrite'
补充新的报错:更改了一下vector的创建和put为
MatVector vector = new MatVector();vector.put(0,mat2);vector.put(1,mat1)
Exception in thread "main" java.lang.RuntimeException: OpenCV(4.1.2) C:\projects\javacpp-presets\opencv\cppbuild\windows-x86_64\opencv-4.1.2\modules\imgproc\src\resize.cpp:3723: error: (-215:Assertion failed) inv_scale_x > 0 in function 'cv::resize'
网上查不到关于这方面的资料,请问有大神知道这个stitch方法怎么使用吗

  1. 图片路径问题:请确保imread方法中传递的图片路径是正确的,并且图片文件可读。

  2. MatVector使用问题:在使用MatVector时,需要使用put(i, mat)方法将图像放入指定位置。请确认mat2mat1是有效的Mat对象,并且按照正确的顺序放入MatVector中。通常情况下,应该先设置要拼接的右侧图像,再设置左侧图像。

  3. 图像尺寸问题:OpenCV的Stitcher在拼接图像时,要求图像具有相同的大小。请确保mat2mat1的尺寸相同,可以通过使用resize方法调整图像的大小。

修正后的代码示例:

import static org.bytedeco.opencv.global.opencv_imgcodecs.imread;
import static org.bytedeco.opencv.global.opencv_imgcodecs.imwrite;
import org.bytedeco.opencv.opencv_core.Mat;
import org.bytedeco.opencv.opencv_core.MatVector;
import org.bytedeco.opencv.opencv_stitching.Stitcher;

public class Test {
    public static Mat splice(String path1, String path2) {
        Mat mat1 = imread(path1);
        Mat mat2 = imread(path2);

        MatVector vector = new MatVector();
        vector.put(0, mat2);
        vector.put(1, mat1);

        Stitcher stitcher = Stitcher.create();
        Mat mat = new Mat();
        stitcher.stitch(vector, mat);
        stitcher.close();

        return mat;
    }

    public static void main(String[] args) {
        Mat mat = splice("D:\\img1.jpg", "D:\\img2.jpg");
        imwrite("D:\\img3.jpg", mat);
    }
}