Java-图片画框,标记算法识别目标物

需求:ai算法识别后返回结果,根据识别结果,以识别类型分组,生成新图片且标记识别物,进行word文档导出

返回数据

{
    "code": 0,
    "data": {
        "data": [
            {
                "bbox": [
                    562.0,
                    563.0,
                    725.0,
                    765.0
                ],
                "color": [
                    31,
                    112,
                    255
                ],
                "conf": "0.93798828125",
                "detector_type": 2,
                "label": "car",
                "label_cn": "轿车"
            },
            {
                "bbox": [
                    1154.0,
                    517.0,
                    1207.0,
                    590.0
                ],
                "color": [
                    56,
                    56,
                    255
                ],
                "conf": "0.859375",
                "detector_type": 0,
                "label": "person",
                "label_cn": "行人"
            },
            {
                "bbox": [
                    777.0,
                    65.0,
                    871.0,
                    168.0
                ],
                "color": [
                    29,
                    178,
                    255
                ],
                "conf": "0.83642578125",
                "detector_type": 3,
                "label": "van",
                "label_cn": "微面"
            }
        ],
        "imgAiUrl": "",
        "total": 26
    },
    "msg": "处理完成"
}

参数说明bbox为识别目标坐标   detector_type为识别类型  label_cn为识别目标标签

 开撸,实现这一功能 选择使用Graphics2D 以下是相关代码:


 

 Graphics2DUtil

package com.mmc.dms.common.utils;

import cn.afterturn.easypoi.entity.ImageEntity;
import org.json.JSONArray;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.Map;

public class Graphics2DUtil {

    public static ImageEntity annotateImages(Map.Entry<Integer, List<Map<String, Object>>> entry, String imageUrl) {



        // 读取源图片
        BufferedImage image = null;
        try {
            image = ImageIO.read(new URL(imageUrl));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        // 创建一个新的图片副本,以避免修改原始图片
        BufferedImage annotatedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
        annotatedImage.createGraphics().drawImage(image, 0, 0, null);

        // 在新的图片上进行标注
        Graphics2D g2d = annotatedImage.createGraphics();
        // 设置标记框颜色
        g2d.setColor(Color.RED);
        // 设置标记文字大小 字体 
        Font font = new Font(null, Font.BOLD, 30);
        g2d.setFont(font);

        // 设置矩形边框宽度为2个像素(你可以根据需要调整宽度)
        g2d.setStroke(new BasicStroke(2));


        for (Map<String, Object> dataItem : entry.getValue()) {
            JSONArray bboxDatum = (JSONArray) dataItem.get("bbox");
            Double lx = (Double) bboxDatum.get(0);
            Double ly = (Double) bboxDatum.get(1);
            Double rx = (Double) bboxDatum.get(2);
            Double ry = (Double) bboxDatum.get(3);
            int leftX = lx.intValue();
            int leftY = ly.intValue();
            int rightX = rx.intValue();
            int rightY = ry.intValue();
            // 绘制矩形
            g2d.drawRect(leftX, leftY, rightX - leftX, rightY - leftY);
            // 绘制文字标记
            g2d.drawString(dataItem.get("label_cn").toString(), leftX, leftY - 10);
        }

        //释放资源
        g2d.dispose();

        // 因为要做导出 所以这里封装成ImageEntity 方便导出
        ImageEntity imageEntity = new ImageEntity();
        imageEntity.setHeight(120);
        imageEntity.setWidth(120);
        try {
            imageEntity.setData(bufferedImageToByteArray(annotatedImage,"jpg"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        imageEntity.setType(ImageEntity.Data);
        return imageEntity;
    }


    public static byte[] bufferedImageToByteArray(BufferedImage image, String format) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, format, baos);
        return baos.toByteArray();
    }
}

 

serviceImpl

public static void main(String[] args) throws JSONException {

       
        String jsonData = "返回的json";
        String url = "原始图片url";

        JSONObject jsonObject = new JSONObject(jsonData);
        JSONObject data = jsonObject.getJSONObject("data");
        JSONArray dataArray = data.getJSONArray("data");

        Map<Integer, List<Map<String, Object>>> groupedData = new HashMap<>();

        for (int i = 0; i < dataArray.length(); i++) {
            JSONObject item = dataArray.getJSONObject(i);
            int detectorType = item.getInt("detector_type");

            Map<String, Object> dataItem = new HashMap<>();
            dataItem.put("bbox", item.getJSONArray("bbox"));
            dataItem.put("label_cn", item.getString("label_cn"));

            groupedData.computeIfAbsent(detectorType, k -> new ArrayList<>()).add(dataItem);
        }

        // 输出分组后的数据
        for (Map.Entry<Integer, List<Map<String, Object>>> entry : groupedData.entrySet()) {
            System.out.println("Detector Type: " + entry.getKey());
            ImageEntity imageEntity = Graphics2DUtil.annotateImages(entry, url);
            for (Map<String, Object> dataItem : entry.getValue()) {
                System.out.println("  Bbox: " + dataItem.get("bbox"));
                System.out.println("  Label_cn: " + dataItem.get("label_cn"));
            }
        }

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值