在图像上搜索轮廓

时间:2017-04-20 10:00:22

标签: c++ opencv opencv-contour

我尝试用C ++帮助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 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您已找到图像中存在的所有轮廓的边界矩形。您可以根据每个轮廓的质心对轮廓进行排序,而不是使用最左侧点方法,因为您的方法适用于文本

来自OpenCV社区的

THIS ANSWER可能有助于提供一个开始