Рисование текста в среде обработки изображений Marvin Java

Я работаю над классифицирующим объектом на изображении.

Я использую Marvin Image Processing Framework, и я успешно сегментирую объект, но я хочу вставить текст на изображение

Это результат моей сегментации изображения, и я хочу нарисовать текст над объектом по условию.

Например, я пишу функцию, которая вычисляет среднюю диагональ каждого прямоугольника, и вставляю "болт", если диагональ прямоугольника больше среднего.

Однако я не смог найти какой-либо метод для вставки текста с помощью Marvin Image Processing Framework.

Это часть моего кода:

public Recognition() {
    MarvinImage input = MarvinImageIO.loadImage("Parts1.jpg");
    MarvinImage copy = input.clone();


    filterBlue(copy);
    MarvinImage bin = MarvinColorModelConverter.rgbToBinary(copy, 127);
    morphologicalClosing(bin.clone(), bin, MarvinMath.getTrueMatrix(30, 30));
    copy = MarvinColorModelConverter.binaryToRgb(bin);
    MarvinSegment[] marvSeg = floodfillSegmentation(copy);
    calculateAvg(marvSeg);
    for(int i = 1; i < marvSeg.length; i++)
    {
        MarvinSegment segment = marvSeg[i];
        input.drawRect(segment.x1, segment.y1, segment.width, segment.height, Color.ORANGE);
        input.drawRect(segment.x1+1, segment.y1+1, segment.width, segment.height, Color.ORANGE);
        if (calcDiag(segment.width, segment.height) > recDiagonalAverage)
        {
            //draw string "bolt" if current diagonal is larger than average
        }
    }

    MarvinImageIO.saveImage(input, "output.jpg");
}

Если у меня нет метода для вставки с помощью Marvin Image Processing Framework, как я могу вставить текст с этим кодом?

1 ответ

Решение

Каждый раз, когда вам нужна функция рендеринга, не предоставляемая Marvin, но предоставляемая Java Graphics, вы можете делать следующее:

  1. Получить представление BufferedImage из объекта MarvinImage с помощью image.getBufferedImageNoAlpha();
  2. Получить Graphics2D из объекта BufferedImage.
  3. Используйте Graphics2D алгоритмы рендеринга
  4. Установите BufferedImage обратно к MarvinImage, используя image.setBufferedImage(bufImage);

В приведенном ниже примере используется гипотетический объект MarvinSegment, созданный с использованием координат вашего изображения output.jpg. Вам просто нужно добавить drawStringMarvin(...) в ваш код.

Parts1_output_2.jpg:

введите описание изображения здесь

Исходный код:

public class DrawStringExample {

    private static Font FONT = new Font("Verdana", Font.BOLD, 28);

    public DrawStringExample() {
        MarvinImage image = MarvinImageIO.loadImage("./res/Parts1_output.jpg");
        MarvinSegment segment = new MarvinSegment(537, 26, 667, 96);
        drawStringMarvin("bolt", segment, image);
        MarvinImageIO.saveImage(image, "./res/Parts1_output_2.jpg");
    }

    private void drawStringMarvin(String text, MarvinSegment segment, MarvinImage image) {
        BufferedImage bufImage = image.getBufferedImageNoAlpha();
        Graphics2D g2d = (Graphics2D)bufImage.getGraphics();
        g2d.setFont(FONT);
        g2d.drawString(text, segment.x1, segment.y1+FONT.getSize());
        image.setBufferedImage(bufImage);   
    }

    public static void main(String[] args) {
        new DrawStringExample();
    }
}
Другие вопросы по тегам