windowsのSpring-bootでOpenCVメモ
環境
Spring Tool Suite 4
maven
pom.xmlに以下を追加して、mavenの依存関係を追加する
<!-- 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>
画像マッチング処理はこんな感じ
// アップロード画像保存
String fileid = new SimpleDateFormat("yyyyMMddHHmmsssss").format( new Date() );
File uploadDir = new File("**********");
File uploadFile = new File(uploadDir.getAbsoluteFile() + "/" + fileid + form.getMultipartFile().getOriginalFilename());
byte[] bytes = form.getMultipartFile().getBytes();
BufferedOutputStream uploadFileStream = new BufferedOutputStream(new FileOutputStream(uploadFile));
uploadFileStream.write(bytes);
uploadFileStream.close();
// 画像パターンマッチング
Path img1 = Paths.get( uploadFile.getAbsoluteFile().getAbsolutePath() );
Mat mat1 = imread(img1.toFile().getAbsolutePath());
KeyPointVector keypoints1 = new KeyPointVector();
Mat descriptors1 = new Mat();
detectAndCompute(mat1, keypoints1, descriptors1);
// URLから画像読み込み
URL matchImg = new URL("https://*********.png");
BufferedImage bufferedImage = ImageIO.read(matchImg);
// ARGB取得
int[] argbArray = bufferedImage.getRGB(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight(), null, 0, bufferedImage.getWidth());
// int配列をbyte配列に変換する
byte[] bgraArray = new byte[argbArray.length * 4];
for (int i = 0; i < argbArray.length; i++) {
bgraArray[i * 4 + 0] = (byte) ((argbArray[i] >> 0) & 0xFF); // B
bgraArray[i * 4 + 1] = (byte) ((argbArray[i] >> 8) & 0xFF); // G
bgraArray[i * 4 + 2] = (byte) ((argbArray[i] >> 16) & 0xFF); // R
bgraArray[i * 4 + 3] = (byte) ((argbArray[i] >> 24) & 0xFF); // A
}
Mat mat2 = new Mat(bufferedImage.getHeight(), bufferedImage.getWidth(), CvType.CV_8UC4, new BytePointer(bgraArray));
imwrite("*****.png", mat2);
KeyPointVector keypoints2 = new KeyPointVector();
Mat descriptors2 = new Mat();
detectAndCompute(mat2, keypoints2, descriptors2);
DMatchVectorVector matchVector = new DMatchVectorVector();
matcher.knnMatch(descriptors1, descriptors2, matchVector, 2, null, false);
// 値を小さくすると厳しめのマッチングになる
float threshold = 0.5f;
// パターンマッチ
int match = 0;
for (long i = 0; i < matchVector.size(); i++) {
DMatchVector vector = matchVector.get(i);
if (vector.size() == 2) { // 2枚分の特徴量が取得できた場合のみ
DMatch m = vector.get(0);
DMatch n = vector.get(1);
if (m.distance() < threshold * n.distance()) {
match++;
}
}
}
// 大体同じ画像かも?
if (match > 10) {
System.out.println("match=" + match);
}
Spring-Bootについて勉強したいなら!
基本的にはインターネットで調べれば、参考文献はいくらでも見つかるとは思います。
ただ、辞書替わりに必要でしたら、以下の書籍がおすすめです。
とはいえ、数多く読んできたわけではないですが。。。
こちらは、Spring Frameworkの書籍ではありますが、幅広く知識を身につけたい方にはおすすめです
こちらは、実践的なことから注意すべきことまで記載されています。
コメント