Skip to content

Instantly share code, notes, and snippets.

@logue
Created July 5, 2021 06:43
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save logue/0551272cb3a8fd0d4da183285870569a to your computer and use it in GitHub Desktop.
Save logue/0551272cb3a8fd0d4da183285870569a to your computer and use it in GitHub Desktop.
OpenCV内部で使われる画像型であるMat型をJavaで読み書きするクラス。マルチバイトを含むパスでも使用可能。
package dev.logue.opencv;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
/**
* OpenCVのMat型をJavaで読み書きするクラス
*
* @author Logue <logue@hotmail.co.jp>
* @version 1.0.0
* @copyright 2021 Masashi Yoshikawa <https://logue.dev/> All rights reserved.
* @license MIT
*/
@Slf4j
class MatUtility {
/**
* 画像ファイルをOpenCVに読み込ませる
*
* @param path ファイルへのパス
* @return
*/
private static Mat read(String path) throws FileNotFoundException {
// OpenCVのImgcodecs.imread()は、パスにマルチバイト文字列が含まれていると正常に処理することができない。
File file = new File(path);
if (!file.exists()) {
throw new FileNotFoundException();
}
BufferedImage image;
try {
image = ImageIO.read(file);
} catch (IOException e) {
log.error("🖼 画像ファイルの読み込みに失敗しました:" + path);
return null;
}
log.info("🖼 画像を読み込みました:" + path);
return image2mat(image);
}
/**
* Mat型をファイル出力する
*
* @param mat Matデータ
* @param path 出力先ファイル名
* @return
*/
private static Boolean write(Mat mat, String path) {
// OpenCVのImgcodecs.imwrite()は、パスにマルチバイトが含まれていると、以下略
File file = new File(path);
try {
ImageIO.write(mat2image(mat), "png", file);
} catch (IOException e) {
log.error("🖼 画像ファイルの書き出しに失敗しました:" + path);
return false;
}
log.info("🖼 画像ファイルを出力しました:" + path);
return true;
}
/**
* BufferedImage型をMat型に変換
*
* @param image 画像データ
* @return OpenCV内で使用する画像型
*/
public static Mat image2mat(BufferedImage image) {
// バイト列生成
ByteArrayOutputStream bout = new ByteArrayOutputStream();
try {
// 画像データをバイト列に書き出す
ImageIO.write(image, "png", bout);
// バイト列を閉じる
bout.close();
} catch (IOException e) {
log.error("🖼 画像データのOpenCVへの取り込みに失敗しました:" + e);
// 問題があれば終了
return null;
}
// バイト列からOpenCVのMatを生成
MatOfByte mb = new MatOfByte(bout.toByteArray());
// Mat形式取得
return Imgcodecs.imdecode(mb, Imgcodecs.IMREAD_COLOR);
}
/**
* Mat型をBufferedImage型に変換
*
* @param mat OpenCV内で使用する画像型
* @return 画像データ
*/
public static BufferedImage mat2image(Mat mat) {
if (mat == null) return null;
// バイト列生成
BufferedImage image;
// OpenCVのバイト列作成
MatOfByte mb = new MatOfByte();
// Mat形式からOpenCVのバイト列作成
Imgcodecs.imencode(".png", mat, mb);
try {
// バイト列から画像を読み込む
image = ImageIO.read(new ByteArrayInputStream(mb.toArray()));
} catch (IOException e) {
log.error("🖼 画像データの書き出しに失敗しました:" + e);
return null;
}
return image;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment