You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:在Java中使用OpenCV实现两张图片拼接的问题

嘿,我帮你捋捋在Java里用OpenCV做图片拼接的那些坑和解决方案,结合你用的OpenCV 3.4.1和IntelliJ 2016环境,一步步来解决问题:

一、先把基础配置的坑踩平

首先得确保你的OpenCV环境配置没毛病,这是很多新手卡壳的地方:

  • DLL文件加载要靠谱:要么把opencv_java341.dll(x64版本对应64位JVM,x86对应32位)放到项目根目录,要么直接在代码里用绝对路径加载,比如System.load("D:/opencv/build/java/x64/opencv_java341.dll");,比依赖系统PATH更稳妥
  • IntelliJ的Jar包配置:别只把opencv-341.jarAdd as Library,还要去Run/Debug Configurations里确认classpath包含这个Jar,有时候自动导入会漏
  • 版本匹配:OpenCV 3.4.1支持Java 8及以上,IntelliJ 2016.1.4默认是Java 8,没问题,但要去Project Structure里确认SDK选的是对应版本
二、给你一套可运行的图片拼接代码

网上找的代码经常是C++转过来的,Java版API细节有差异,我给你整理了横向/纵向拼接的完整可运行代码,直接改路径就能用:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import java.util.ArrayList;
import java.util.List;

public class ImageStitcher {
    public static void main(String[] args) {
        // 必须先加载OpenCV库,放在代码最开头
        // System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // 依赖系统PATH里的DLL
        System.load("你的OpenCV安装路径/build/java/x64/opencv_java341.dll"); // 推荐用绝对路径

        // 读取两张待拼接的图片
        Mat img1 = Imgcodecs.imread("path/to/your/first_image.jpg");
        Mat img2 = Imgcodecs.imread("path/to/your/second_image.jpg");

        // 先检查图片是否读取成功,避免空指针
        if (img1.empty() || img2.empty()) {
            System.out.println("Error: 图片读失败了!检查下路径是不是写错了");
            return;
        }

        // 横向拼接:统一两张图的高度;纵向拼接就统一宽度
        if (img1.rows() != img2.rows()) {
            // 按比例缩放第二张图,和第一张图高度一致
            double scaleRatio = (double) img1.rows() / img2.rows();
            Imgproc.resize(img2, img2, new Size(img2.cols() * scaleRatio, img1.rows()));
        }

        // 把图片放进列表,准备拼接
        List<Mat> imageList = new ArrayList<>();
        imageList.add(img1);
        imageList.add(img2);

        // 执行拼接:横向用hconcat,纵向用vconcat
        Mat stitchedResult = new Mat();
        Core.hconcat(imageList, stitchedResult); // 横向拼接
        // Core.vconcat(imageList, stitchedResult); // 纵向拼接

        // 保存结果
        Imgcodecs.imwrite("path/to/save/stitched_image.jpg", stitchedResult);
        System.out.println("拼接搞定!结果已经存到指定路径啦");

        // 记得释放Mat资源,避免内存泄漏
        img1.release();
        img2.release();
        stitchedResult.release();
    }
}
三、常见问题排查指南

如果还是跑不起来,按下面的步骤查:

  • UnsatisfiedLinkError:DLL没加载成功,检查DLL路径、JVM位数和OpenCV位数是否匹配(64位Java必须用64位OpenCV)
  • 图片读取失败:相对路径是相对于IntelliJ的项目根目录,不是src文件夹,嫌麻烦就直接用绝对路径
  • 拼接后图片变形:肯定是两张图尺寸没统一,横向拼接必须高度相同,纵向拼接必须宽度相同,代码里的resize逻辑一定要加上
  • IntelliJ调试报错:可以在Run/Debug Configurations里加VM参数-Djava.library.path=你的OpenCV安装路径/build/java/x64,强制指定DLL目录

内容的提问来源于stack exchange,提问作者Tim Cooper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:11:29