我正在尝试使用帮助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
)
如何使 cvFindContours(...)
函数按照图片中的顺序返回轮廓?可能吗?
谢谢!
2 回答
你不能直接强制
findContours
以某种顺序产生轮廓(我的意思是在函数调用中没有参数来调整它) .要按"read text"顺序对轮廓进行排序,您可以执行一个遍历所有轮廓的循环,并通过直接遍历每个
contour
对象中的所有点或使用边界框来检索每个轮廓最顶端的点(参见minAreaRect例如) .获得所有这些点后,可以从左到右,从下到上对它们进行排序(可能需要进行一些调整,例如检测从高度范围内开始的所有轮廓都是同一文本行的所有部分)
您已找到图像中存在的所有轮廓的边界矩形 . 您可以根据每个轮廓的 centroid 对轮廓进行排序,而不是采用 left-most 点方法,因为您的方法适用于文本,因此轮廓更加强大 .
来自OpenCV社区的THIS ANSWER可能有助于提供一个开始