Как распознать что на изображении?

117
16 ноября 2019, 14:30

нужно распознать какая геометрическая фигура на изображении. Для этого у нас есть шаблоны: круг, треугольник и квадрат. Далее передаем изображение и программа должна сказать на какую фигуру она похожа. Проблема в том, что находит неправильно. Сперва добавляю изображения, передаю в массив(pixels) затем нахожу совпадение с шаблонами, после результат.

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class Main {
    public static void main(String[] args) throws IOException {
        Map<String, Image> mymap = new HashMap<String, Image>();
        //Создаем изображения
        Image square = new Image("C:\\Java\\projectImage\\src\\img\\R.png");
        Image circle = new Image("C:\\Java\\projectImage\\src\\img\\circle.png");
        Image triangle = new Image("C:\\Java\\projectImage\\src\\img\\tr.png");
        Image myImage = new Image("C:\\Java\\projectImage\\src\\img\\myTrian.png");
        // Вывод в консоль
        square.printMatrix();
        System.out.println();
        circle.printMatrix();
        System.out.println();
        triangle.printMatrix();
        System.out.println();
        myImage.printMatrix();
        // Сохраняем изображения в хранилище 
        mymap.put("Square", square);
        mymap.put("Circle", circle);
        mymap.put("Triangle", triangle);
        mymap.put("My Image", myImage);

        // Находим схожи или нет
        square.findSimilarity(square.pixels, myImage.pixels);
        System.out.println();
        circle.findSimilarity(circle.pixels, myImage.pixels);
        System.out.println();
        triangle.findSimilarity(triangle.pixels, myImage.pixels);
        int num = 500;
        String res = "";
        // Выявляем на что похоже
        for (Map.Entry<String, Image> pair : mymap.entrySet()) {
           if (pair.getKey() != "My Image"){
               if (pair.getValue().similarity < num){
                   num = pair.getValue().similarity;
                   res = pair.getKey();
               }
           }
        }
        System.out.println("Answer - " + res);
    }
}

Класс Image

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;

public class Image {
    File file;
    BufferedImage image; 
    int[][] pixels;
    int similarity = 0;
    Image(String path) throws IOException{
        file = new File(path);
        image = ImageIO.read(file);
        pixels = new int[image.getHeight()][image.getWidth()];
    }

    void printMatrix() {
        for(int i=0; i<image.getHeight(); i++) {
            for(int j=0; j<image.getWidth(); j++) {
                if(image.getRGB(i,j) != -1) {
                    System.out.print(" " + '0');
                    pixels[i][j] = 0;
                }
                else {
                    System.out.print(" " + '1');
                    pixels[i][j] = 1;
                }
            }
            System.out.println();
        }

    }
    void findSimilarity(int[][] arrayA, int[][] arrayB) {
        for(int i=0; i<image.getHeight(); i++) {
            for(int j=0; j<image.getWidth(); j++) {
                if (arrayA[i][j] == arrayB[i][j]){
                    similarity++;
                }
            }
        }
        System.out.println("Similarity: " + similarity);
    }

    public File getFile() {
        return file;
    }
    public void setFile(File file) {
        this.file = file;
    }
    public BufferedImage getImage() {
        return image;
    }
    public void setImage(BufferedImage image) {
        this.image = image;
    }
    public int[][] getPixels() {
        return pixels;
    }
    public void setPixels(int[][] pixels) {
        this.pixels = pixels;
    }
}
READ ALSO
Где найти пример реализации mvp?

Где найти пример реализации mvp?

Начал применять в своей практике паттерн проектирования MVPКак я понимаю этот паттерн помогает переносить ядро приложения на разные платформы

133
Конкретное число знаков после десятичного разделителя

Конкретное число знаков после десятичного разделителя

Как записать число в экспоненциальную форму, чтобы осталось определенное количество символов после точки или подскажите где почитать можно...

140
Выводит null-значения из таблицы

Выводит null-значения из таблицы

Не понимаю, почему выводит null при вызове метода в контроллере

146
Ошибка при попытке открыть COM порт JSSC

Ошибка при попытке открыть COM порт JSSC

В Java новичек, прошу помощи знатоковПытаюсь сделать пересылку данных через COM порт с помощью библиотеки JSSC

110