weixin_46983636 2020-04-11 12:37 采纳率: 0%
浏览 504

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方法怎么使用吗

  • 写回答

2条回答 默认 最新

  • 故事不长丨 2023-07-08 10:36
    关注
    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);
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码