PaddleOCR BoundingBox输出格式说明及手动绘框异常解决
PaddleOCR边界框格式说明
PaddleOCR返回的检测框不是「左上角+右下角」的两点矩形格式,而是按顺时针顺序排列的4个顶点坐标,固定顺序为:[左上角点, 右上角点, 右下角点, 左下角点]。这种格式支持标记倾斜、旋转的文本块,不能直接取首尾两点作为矩形对角点绘框。
原代码错误点
- 格式理解错误:坐标列表最后一个点是左下角,不是右下角,取首尾两点无法得到正确的矩形对角
- 坐标取值笔误:原代码里右下角的y坐标错误取了第四个点的x值(
result[0][0][-1][0]),坐标值完全不匹配 - 逻辑缺失:仅尝试绘制第一个文本块的框,没有遍历所有检测结果
正确绘框实现
提供两种常用实现,第二种和官方draw_ocr效果完全一致,支持倾斜文本场景。
方法1:轴对齐矩形绘框(仅适合水平无倾斜文本)
从四个顶点中提取x、y的最大最小值,得到外接矩形的对角点再绘框:
import cv2 import matplotlib.pyplot as plt img_draw = img.copy() # 遍历所有检测到的文本块 for text_block in result: points = text_block[0] # 提取所有点的x、y坐标 x_list = [int(p[0]) for p in points] y_list = [int(p[1]) for p in points] x1, x2 = min(x_list), max(x_list) y1, y2 = min(y_list), max(y_list) # 绘绿色边框,线宽2,如需填充把最后一个参数改为-1 cv2.rectangle(img_draw, (x1, y1), (x2, y2), (0, 255, 0), 2) # OpenCV默认BGR格式,展示时转RGB plt.imshow(cv2.cvtColor(img_draw, cv2.COLOR_BGR2RGB)) plt.show()
方法2:多边形绘框(适配所有场景,和官方效果一致)
直接用四个顶点画闭合多边形,完美支持倾斜、旋转文本的框选:
import cv2 import numpy as np import matplotlib.pyplot as plt img_draw = img.copy() for text_block in result: points = np.array(text_block[0], dtype=np.int32).reshape((-1, 1, 2)) # 画闭合多边形边框 cv2.polylines(img_draw, [points], isClosed=True, color=(0, 255, 0), thickness=2) plt.imshow(cv2.cvtColor(img_draw, cv2.COLOR_BGR2RGB)) plt.show()
参考素材
测试原图:
官方draw_ocr输出的正确效果:
内容的提问来源于stack exchange,提问作者Ahmad Anis
相关产品推荐
相关产品推荐

