2026/6/20 11:08:59
网站建设
项目流程
南宁市住房城乡建设厅网站,自有服务器可以做网站吗,动画设计专业就业前景和就业方向,长沙门户网站建设公司文字检测框坐标怎么用#xff1f;JSON输出解析一看就懂
OCR文字检测模型输出的坐标信息#xff0c;常常让刚接触的朋友一头雾水#xff1a;那些一长串数字到底代表什么#xff1f;为什么是8个数#xff1f;怎么画出框#xff1f;能不能直接用在其他程序里#xff1f;今…文字检测框坐标怎么用JSON输出解析一看就懂OCR文字检测模型输出的坐标信息常常让刚接触的朋友一头雾水那些一长串数字到底代表什么为什么是8个数怎么画出框能不能直接用在其他程序里今天我们就用科哥开发的cv_resnet18_ocr-detection镜像把检测框坐标的来龙去脉讲清楚——不讲理论、不堆公式只说你真正用得上的东西。这篇文章不是教你怎么训练模型也不是讲ResNet18的结构原理而是聚焦一个最实际的问题拿到JSON里的boxes字段后下一步该怎么做从看懂格式到可视化验证再到工程化调用全程手把手连Python基础一般的同学也能照着操作成功。1. 先看一眼真实的JSON输出我们上传一张商品宣传图点击“开始检测”后WebUI在下方会显示一段JSON数据。这是最核心的原始结果{ image_path: /tmp/test_ocr.jpg, texts: [[100%原装正品提供正规发票], [华航数码专营店]], boxes: [[21, 732, 782, 735, 780, 786, 20, 783]], scores: [0.98, 0.95], success: true, inference_time: 3.147 }注意这三行关键字段texts识别出的文字内容按检测顺序排列boxes每个文本框对应的8个坐标值重点scores每个框的置信度分数越高越可靠现在问题来了[21, 732, 782, 735, 780, 786, 20, 783]这8个数字到底怎么对应到图片上那个矩形框2. 坐标格式揭秘不是矩形是四边形很多初学者默认“检测框矩形”所以看到8个数就懵了——矩形明明只需要左上角x/y和右下角x/y也就是4个数啊真相是这个模型输出的是任意四边形quadrilateral坐标不是轴对齐矩形AABB。它能精准框住倾斜、弯曲、透视变形的文字区域比如斜放的广告牌、手机拍歪的发票、带弧度的包装盒文字。这8个数就是按顺时针顺序给出的四边形四个顶点的坐标x, y顶点坐标对含义第1点(21, 732)左上角或起始点第2点(782, 735)右上角第3点(780, 786)右下角第4点(20, 783)左下角你可以把它想象成用四根线段首尾相连画出的一个平行四边形实际可能是梯形或不规则四边形。这种表示法比矩形框更灵活也更贴近真实场景中文字的排布形态。小贴士如果你只需要一个粗略的包围矩形比如做简单裁剪可以用这4个点算出最小外接矩形x_min min(21, 782, 780, 20) 20y_min min(732, 735, 786, 783) 732x_max max(...) 782y_max max(...) 786得到(20, 732, 782, 786)—— 这就是标准的(x1, y1, x2, y2)格式。3. 动手验证用OpenCV把框画出来光看数字不够直观我们写几行Python代码把检测框真正在原图上画出来。不需要安装新库只要你的环境里有OpenCVWebUI本身已自带3.1 准备工作读取图片和JSON假设你已将检测结果保存为result.json图片为test.jpgimport json import cv2 import numpy as np # 读取JSON with open(result.json, r, encodingutf-8) as f: data json.load(f) # 读取原图 img cv2.imread(test.jpg) # 提取boxes和texts boxes data[boxes] # [[x1,y1,x2,y2,x3,y3,x4,y4], ...] texts data[texts] # [[文字1], [文字2], ...]3.2 绘制四边形框 标注文字# 遍历每个检测框 for i, box in enumerate(boxes): # 转换为numpy数组每两个数一组x, y pts np.array([ [box[0], box[1]], # 点1 [box[2], box[3]], # 点2 [box[4], box[5]], # 点3 [box[6], box[7]] # 点4 ], dtypenp.int32) # 绘制四边形绿色线宽2 cv2.polylines(img, [pts], isClosedTrue, color(0, 255, 0), thickness2) # 在框左上角写文字白色字体大小0.6 if i len(texts) and texts[i]: text texts[i][0] cv2.putText(img, text, (int(box[0]), int(box[1]) - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1) # 保存结果图 cv2.imwrite(result_with_boxes.jpg, img) print( 检测框已绘制完成保存为 result_with_boxes.jpg)运行后你会得到一张清晰标注了所有文字区域和内容的图片。你会发现每个框都严丝合缝地贴合文字边缘包括轻微倾斜的标题即使两行文字靠得很近也不会被合并成一个大框中文、英文、符号混合时依然能准确分离。这就是四边形坐标的价值——它不只是“能用”而是“用得准”。4. 工程化使用如何在自己的项目里调用你可能并不想每次手动保存JSON再读取而是希望把检测能力集成进自己的业务系统。cv_resnet18_ocr-detection提供了两种主流方式4.1 方式一调用WebUI API推荐给快速验证WebUI本质是一个Gradio服务它暴露了标准HTTP接口。你无需启动完整界面直接发POST请求即可curl -X POST http://localhost:7860/api/predict/ \ -H Content-Type: multipart/form-data \ -F data[\/path/to/your/image.jpg\, 0.25] \ -F fn_index0返回的就是上面看到的JSON结构。在Python中用requests调用更简洁import requests url http://localhost:7860/api/predict/ files {file: open(invoice.jpg, rb)} data {data: [/tmp/invoice.jpg, 0.25], fn_index: 0} response requests.post(url, filesfiles, datadata) result response.json() print(result[data][0]) # 就是那个带boxes的JSON字典注意fn_index0对应“单图检测”功能批量检测是fn_index1ONNX导出是fn_index3。具体可查看WebUI源码或Network面板。4.2 方式二本地Python函数调用适合生产部署镜像内部封装了可直接导入的检测器模块。进入容器后执行from detector import OCRDetector # 初始化检测器自动加载模型 detector OCRDetector() # 直接传入cv2读取的图像BGR格式 img cv2.imread(receipt.png) result detector.detect(img, threshold0.2) print(检测到, len(result[boxes]), 处文字) for i, (box, text, score) in enumerate(zip(result[boxes], result[texts], result[scores])): print(f[{i1}] {text[0]} (置信度: {score:.2f}) - 坐标: {box})这种方式绕过HTTP开销延迟更低适合高并发场景。detector.detect()返回的就是标准字典结构与WebUI完全一致你之前的解析逻辑可直接复用。5. 常见误区与避坑指南刚上手时容易踩的几个“隐形坑”帮你省下调试半天的时间5.1 坐标原点在哪单位是什么原点图片左上角(0, 0)x向右增长y向下增长OpenCV/PyTorch通用约定单位像素pixel不是毫米或英寸验证方法用画图工具打开原图量一下第一个点(21, 732)是否真的在文字左上角附近5.2 为什么有的框坐标超出图片范围比如出现x -5或y 1200而图片高度只有1080→ 这是模型在边界处的预测溢出属于正常现象。处理建议绘图前加截断np.clip(x, 0, img_width-1)业务逻辑中过滤掉面积过小10×10或坐标异常的框5.3texts里为什么是[[文字]]而不是[文字]这是为兼容多语言、多行文本设计的嵌套结构。当前版本每行文字单独成项所以是二维列表。正确取法text texts[i][0]❌ 错误写法text texts[i]会得到一个列表不是字符串5.4 置信度scores低于多少该丢弃参考科哥文档建议通用场景保留score 0.2的结果默认阈值高精度需求如合同关键字段 0.5容错型场景如社交媒体截图 0.1但注意单纯提高阈值不一定提升准确率有时会漏掉低对比度但正确的文字。6. 实战延伸三个马上能用的小技巧学会解析坐标只是起点下面这些技巧能立刻提升你的工作效率6.1 技巧一按位置排序还原阅读顺序检测结果默认按模型内部优先级返回不一定是从左到右、从上到下。要生成可读报告需重排序def sort_boxes_by_position(boxes, texts): # 按y中心坐标分组行再按x中心排序列 lines {} for i, (box, text) in enumerate(zip(boxes, texts)): y_center (box[1] box[3] box[5] box[7]) / 4 x_center (box[0] box[2] box[4] box[6]) / 4 line_key round(y_center / 20) # 每20像素为一行 if line_key not in lines: lines[line_key] [] lines[line_key].append((x_center, i, text[0])) # 合并结果 sorted_texts [] for line_key in sorted(lines.keys()): line sorted(lines[line_key], keylambda x: x[0]) sorted_texts.extend([item[2] for item in line]) return sorted_texts # 使用 ordered sort_boxes_by_position(boxes, texts) print(阅读顺序, | .join(ordered))6.2 技巧二提取指定区域文字如只读发票金额你想只获取图片右下角“金额¥1280.00”这一块可以设定坐标筛选规则def extract_region(boxes, texts, x_min600, x_max800, y_min900, y_max1000): results [] for i, box in enumerate(boxes): # 计算四边形中心点 cx sum(box[::2]) / 4 # 所有x坐标平均 cy sum(box[1::2]) / 4 # 所有y坐标平均 if x_min cx x_max and y_min cy y_max: results.append(texts[i][0]) return results amount_text extract_region(boxes, texts, 600, 800, 900, 1000) print(检测到金额, amount_text)6.3 技巧三批量导出为CSV对接Excel分析把所有检测结果整理成表格方便业务同事查看import csv with open(ocr_results.csv, w, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([序号, 文字内容, x1, y1, x2, y2, x3, y3, x4, y4, 置信度]) for i, (box, text, score) in enumerate(zip(boxes, texts, scores)): row [i1, text[0]] box [f{score:.3f}] writer.writerow(row) print( CSV已导出可用Excel直接打开分析)7. 总结坐标不是终点而是自动化流程的起点今天我们拆解了OCR检测框坐标的全部秘密看懂8位数组它是四边形四个顶点的(x, y)坐标不是矩形亲手画出来用OpenCV几行代码验证结果可靠性接入自己系统API调用或本地函数无缝集成避开常见坑原点、单位、嵌套结构、置信度过滤延伸实用技巧排序、区域筛选、CSV导出。记住坐标本身没有意义有意义的是你用它做了什么。它可以是自动填写表单的输入是电子合同的关键字段定位器是电商后台批量审核商品图的质检员也可以是你下一个AI应用的第一步数据源。别再把JSON当成黑盒输出——现在你已经掌握了打开它的钥匙。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。