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