Search code examples
javaimageimage-processingmarvin-framework

Draw text in the Marvin Image Processing Framework Java


I'm working on the classifying object in the image.

I'm using Marvin Image Processing Framework, and I'm successfully segmenting object, but I want to insert text on the image

enter image description here

This is the output of my image segmentation, and I want to draw text above the object by condition.

For example, I write function that calculate average diagonal of each rectangle, and I insert "bolt" if rectangle's diagonal is larger than average.

However, I couldn't find any method to insert text with using Marvin Image Processing Framework.

This is part of my code:

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");
}

If I don't have any method to insert with Marvin Image Processing Framework, How can I insert text with these code?


Solution

  • Every time you need a rendering feature not provided by Marvin, but provided by Java Graphics, you can do the following:

    1. Get a BufferedImage representation from a MarvinImage object using image.getBufferedImageNoAlpha();
    2. Get the Graphics2D from the BufferedImage object.
    3. Use Graphics2D rendering algorithms
    4. Set the BufferedImage back to the MarvinImage using image.setBufferedImage(bufImage);

    The example below uses a hypothetical MarvinSegment object created using the coordinates of your output.jpg image. You just need to add the drawStringMarvin(...) to your code.

    Parts1_output_2.jpg:

    enter image description here

    Source code:

    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();
        }
    }