本ブログはアフィリエイト広告を利用しています。

JavaCV(OpenCV)でパノラマ合成(Stitching)

dolphin プログラミング

JavaCVでパノラマ合成を行う方法を紹介します。

以下の関連記事です。

環境

  • Windows10 Pro
  • Spring Boot 2.5.3
  • JDK 11

pom.xml

pomでJavaCVのjarを読み込みます。

<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv -->
<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>1.5.6</version>
</dependency>

パノラマ合成とは

複数の画像から良い感じに1枚の画像にするものです。1枚の写真に入りきらない風景などを撮っておいてこのパノラマ合成を行うと迫力ある1枚の画像が出来上がります。
また、風景だけでなくプリンタでスキャンした文章画像などでも使用できます。

JavaCVでパノラマ合成

パノラマ合成を行うにはStitcher♯stitchを使用します。
第1引数に合成を行う複数枚のMatが格納されているMatVector、第2引数にパノラマ合成が成功した際に結果を格納するMatインスタンスを指定します。
なお、使用する画像は3割程度、同じ領域が含まれている必要があります。
少なすぎるとエラーとなるため注意が必要です。

文章画像をパノラマ合成する場合は、 Stitcher.create(Stitcher.PANORAMA) を Stitcher.create(Stitcher.SCANS) にすると良いかもしれません。
Stitcher.PANORAMA が写真など、 Stitcher.SCANS が平面的な画像ってイメージで使ってます。(違うかもしれないけど)

import static org.bytedeco.opencv.global.opencv_imgcodecs.*;

import java.nio.file.Path;
import java.nio.file.Paths;

import org.bytedeco.opencv.opencv_core.Mat;
import org.bytedeco.opencv.opencv_core.MatVector;
import org.bytedeco.opencv.opencv_stitching.Stitcher;
import org.junit.jupiter.api.Test;

class OpenCVUtilTest {


    @Test
    void testStitching() {
        // 画像読み込み
        Path imgLeft = Paths.get("C:\\gomibako\\stitching_left.jpg");
        Mat matLeft = imread(imgLeft.toFile().getAbsolutePath());
        Path imgRight = Paths.get("C:\\gomibako\\stitching_right.jpg");
        Mat matRight = imread(imgRight.toFile().getAbsolutePath());

        try (Stitcher stitcher = Stitcher.create(Stitcher.PANORAMA);
                MatVector matVector = new MatVector(matLeft, matRight);
                Mat panorama = new Mat()) {

            // パノラマ合成実行
            int ret = stitcher.stitch(matVector, panorama);
            if (ret != Stitcher.OK) {
                System.out.println("error ret = " + ret);
            } else {
                // パノラマ合成した画像を出力
                imwrite("C:\\gomibako\\panorama.jpg", panorama);
            }
        }
    }
}

実行結果

元画像を左右に分割した画像を使用します。

  • 元画像
  • stitching_left.jpg
  • stitching_right.jpg

実行した結果がこちらの画像です。
上がパノラマ合成した画像、下が元画像です。
多少全体的にボケっとしてしまいましたが、継ぎ目などは全く分からなくなりました。

以上です。

コメント

タイトルとURLをコピーしました