当前位置: 代码迷 >> 综合 >> OpenCV findContours 返回结果的顺序
  详细解决方案

OpenCV findContours 返回结果的顺序

热度:58   发布时间:2023-09-18 13:34:38.0

笔记

在做 OCR 的时候遇到了个坑,在使用了 findContours 查找文字区域的时候,发现返回的文字是倒序的,有时还是无序emmm。

找了很久才发现是这个函数的问题,它的实现算法并不是想当然的从左到右查找标记序号的(从整体来看)。所以要想输出有序结果必须自己实现,如得到区域质心 Centroid ,可参考这篇详解 http://opencvpython.blogspot.com/2012/06/contours-3-extraction.html

而对单行 OCR 文字区域,可以直接在 boudingRect 获取的 Rect 基础上,利用它们的 x 坐标从左到右排序,这样就可以了

备注

findContours 函数具体用法参考这里 Java Code Examples for org.opencv.imgproc.Imgproc.findContours()

public List<Mat> findOrderContours(Mat m) {List<MatOfPoint> contours = new ArrayList<>();Imgproc.findContours(m, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);List<Integer> axisX = new ArrayList<>(contours.size());List<Mat> orderContours = new ArrayList<>(contours.size());for (MatOfPoint matOfPoint : contours) {Rect cntRect = Imgproc.boundingRect(matOfPoint);// 插入排序int index;for (index = 0; index < axisX.size(); index++) {if (axisX.get(index) > cntRect.x)break;}axisX.add(index, digitRect.x);orderContours.add(index, new Mat(m, cntRect).clone());}return orderContours;
}