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