Spring-bootでOpenCV

アイキャッチ プログラミング
スポンサーリンク

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の書籍ではありますが、幅広く知識を身につけたい方にはおすすめです

こちらは、実践的なことから注意すべきことまで記載されています。

コメント

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