Created
July 5, 2021 06:43
-
-
Save logue/0551272cb3a8fd0d4da183285870569a to your computer and use it in GitHub Desktop.
OpenCV内部で使われる画像型であるMat型をJavaで読み書きするクラス。マルチバイトを含むパスでも使用可能。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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