首页 文章

在图像上搜索轮廓

提问于
浏览
2

我正在尝试使用帮助OpenCV库来解决识别问题 .

我有一些文本(下面),我想使用 cvFindContours(...) 函数分隔本文中的每个符号 . 之后,我想在神经网络的输入上发送每个分离的符号以进行识别 . 一切都好 . 我可以在我的图像中获得所有轮廓,我可以使用帮助 cvDrawContours(...) 函数(下方)在我的图像上绘制它 . 但 cvFindContours(...) 返回无序序列(此序列中第一个轮廓上的指针),其中包含所有找到的轮廓 . 对于我的任务订单非常重要 .

CVAPI(int)  cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
                            int header_size CV_DEFAULT(sizeof(CvContour)),
                            int mode CV_DEFAULT(CV_RETR_LIST),
                            int method CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE),
                            CvPoint offset CV_DEFAULT(cvPoint(0,0)));

-image - 源图像

-storage - 用于存储包含轮廓的位置

-first_contour - 指向存储器中第一个轮廓的指针

-mode - 搜索模式(我使用 CV_RETR_EXTERNAL 搜索外部轮廓)

-method - 近似方法(我默认使用 CV_CHAIN_APPROX_SIMPLE

Source image

Source image with drawn a bound rectangles

如何使 cvFindContours(...) 函数按照图片中的顺序返回轮廓?可能吗?

谢谢!

2 回答

  • 2

    你不能直接强制 findContours 以某种顺序产生轮廓(我的意思是在函数调用中没有参数来调整它) .

    要按"read text"顺序对轮廓进行排序,您可以执行一个遍历所有轮廓的循环,并通过直接遍历每个 contour 对象中的所有点或使用边界框来检索每个轮廓最顶端的点(参见minAreaRect例如) .
    获得所有这些点后,可以从左到右,从下到上对它们进行排序(可能需要进行一些调整,例如检测从高度范围内开始的所有轮廓都是同一文本行的所有部分)

  • 1

    您已找到图像中存在的所有轮廓的边界矩形 . 您可以根据每个轮廓的 centroid 对轮廓进行排序,而不是采用 left-most 点方法,因为您的方法适用于文本,因此轮廓更加强大 .

    来自OpenCV社区的THIS ANSWER可能有助于提供一个开始

相关问题