Подтвердить что ты не робот

2D алгоритм распознавания формы - поиск руководства

Мне нужна возможность убедиться, что пользователь правильно нарисовал фигуру, начиная с простых форм, таких как круг, треугольник и более продвинутые формы, такие как буква A.

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

Существует несколько различных подходов к распознаванию формы, к сожалению, у меня нет опыта или времени, чтобы попробовать их всех и посмотреть, что работает.

Какой подход вы бы порекомендовали для этой конкретной задачи?

Ваша помощь приветствуется.

4b9b3361

Ответ 1

Мы можем определить "признание" как способность обнаруживать признаки/характеристики в элементах и ​​сравнивать их с особенностями известных элементов, наблюдаемых в нашем опыте. Объекты с похожими функциями, вероятно, похожи на объекты. Чем выше количество и сложность функций, тем больше наша способность различать похожие объекты.

В случае фигур мы можем использовать их геометрические свойства, такие как количество углов, значения углов, количество сторон, размеры сторон и т.д. Поэтому для выполнения вашей задачи вы должны использовать алгоритмы обработки изображений для извлечения таких объектов из чертежей.

Ниже я представляю очень простой подход, который демонстрирует эту концепцию на практике. Мы узнаем разные формы, используя число углов. Как я сказал: "Чем выше количество и сложность функций, тем больше наша способность различать похожие объекты". Поскольку мы используем только одну функцию, количество углов, мы можем различать несколько различных видов фигур. Формы с одинаковым числом углов не будут дискриминироваться. Поэтому, чтобы улучшить подход, вы можете добавить новые функции.

<ч/" > UPDATE:

Чтобы выполнить эту задачу в реальном времени, вы можете извлечь функции в режиме реального времени. Если объект, который нужно нарисовать, является треугольником, а пользователь рисует четвертую сторону любой другой фигуры, вы знаете, что он или она не рисует треугольник. О уровне правильности вы можете рассчитать расстояние между вектор-функцией желаемого объекта и нарисованным.


Ввод:

enter image description here

Алгоритм

  • Уменьшите входное изображение, так как требуемые функции могут быть обнаружены в более низком разрешении.
  • Сегмент каждого объекта, который будет обрабатываться независимо.
  • Для каждого объекта извлекайте его функции, в этом случае просто количество углов.
  • Используя функции, классифицируйте форму объекта.

Программное обеспечение:

Программное обеспечение, представленное ниже, было разработано на Java и с помощью Marvin Image Processing Framework. Однако вы можете использовать любой язык и инструменты программирования.

import static marvin.MarvinPluginCollection.floodfillSegmentation;
import static marvin.MarvinPluginCollection.moravec;
import static marvin.MarvinPluginCollection.scale;

public class ShapesExample {

    public ShapesExample(){
        // Scale down the image since the desired features can be extracted
        // in a lower resolution.
        MarvinImage image = MarvinImageIO.loadImage("./res/shapes.png");
        scale(image.clone(), image, 269);

        // segment each object
        MarvinSegment[] objs = floodfillSegmentation(image);
        MarvinSegment seg;

        // For each object...
        // Skip position 0 which is just the background
        for(int i=1; i<objs.length; i++){
            seg = objs[i];
            MarvinImage imgSeg = image.subimage(seg.x1-5, seg.y1-5, seg.width+10, seg.height+10);
            MarvinAttributes output = new MarvinAttributes();
            output = moravec(imgSeg, null, 18, 1000000);
            System.out.println("figure "+(i-1)+":" + getShapeName(getNumberOfCorners(output)));
        }
    }

    public String getShapeName(int corners){
        switch(corners){
            case 3: return "Triangle";
            case 4: return "Rectangle";
            case 5: return "Pentagon";
        }
        return null;
    }

    private static int getNumberOfCorners(MarvinAttributes attr){
        int[][] cornernessMap = (int[][]) attr.get("cornernessMap");
        int corners=0;
        List<Point> points = new ArrayList<Point>();
        for(int x=0; x<cornernessMap.length; x++){
            for(int y=0; y<cornernessMap[0].length; y++){
                // Is it a corner?
                if(cornernessMap[x][y] > 0){
                    // This part of the algorithm avoid inexistent corners
                    // detected almost in the same position due to noise.
                    Point newPoint = new Point(x,y);
                    if(points.size() == 0){
                        points.add(newPoint); corners++;
                    }else {
                        boolean valid=true;
                        for(Point p:points){
                            if(newPoint.distance(p) < 10){
                                valid=false;
                            }
                        }
                        if(valid){
                            points.add(newPoint); corners++;
                        }
                    }
                }
            }
        }
        return corners;
    }

    public static void main(String[] args) {
        new ShapesExample();
    }
}

Выход программного обеспечения:

figure 0:Rectangle
figure 1:Triangle
figure 2:Pentagon

Ответ 2

У вас есть два входа - начальное изображение и пользовательский ввод - и вы ищете логический результат.

В идеале вы конвертируете все свои входные данные в сопоставимый формат. Вместо этого вы можете также параметризовать оба типа ввода и использовать контролируемый алгоритм машинного обучения (Ближайший сосед приходит в голову для закрытых фигур).

Трюк заключается в поиске правильных параметров. Если ваш вход представляет собой файл с плоским изображением, это может быть двоичное преобразование. Если пользовательский ввод - это ход или ход пера, я уверен, что есть способы захватить и отобразить это как двоичное, но алгоритм, вероятно, будет более надежным, если бы он использовал данные, наиболее близкие к исходному входу.

Ответ 3

Другой способ - вы можете использовать математику с этой проблемой, используя среднее значение для каждой точки, которая является наименьшим расстоянием от того, с которым вы сравниваете его, сначала вы должны изменить размер фигуры в библиотеке форм, а затем:

      function shortestDistanceSum( subject, test_subject ) {

         var sum = 0;

         operate( subject, function( shape ){

            var smallest_distance = 9999;

            operate( test_subject, function( test_shape ){
                var distance = dist( shape.x, shape.y, test_shape.x, test_shape.y );

                smallest_distance = Math.min( smallest_distance, distance );
            });

            sum += smallest_distance;

        });

            var average = sum/subject.length;

            return average;
       }

       function operate( array, callback ) {
          $.each(array, function(){
              callback( this );
          });
       }

       function dist( x, y, x1, y1 ) {
            return Math.sqrt( Math.pow( x1 - x, 2) + Math.pow( y1 - y, 2) );
        }

        var square_shape = Array; // collection of vertices in a square shape
        var triangle_shape = Array; // collection of vertices in a triangle
        var unknown_shape = Array; // collection of vertices in the shape your'e comparing from

        square_sum = shortestDistanceSum( square_shape, unknown_shape );
        triangle_sum = shortestDistanceSum( triangle_shape, unknown_shape );

Где самая низкая сумма - ближайшая фигура.