在图像上搜索轮廓
Search contours on the image
我正在尝试使用 C++ 的帮助 OpenCV 库解决识别问题。
我有一些文本(如下),我想使用 cvFindContours(...)
函数分隔文本中的每个符号。之后,我想将每个分离的符号发送到神经网络的输入端以进行识别。没关系。我可以得到图像中的所有轮廓,并且可以借助 cvDrawContours(...)
函数(如下)将其绘制在图像上。但是 cvFindContours(...)
returns 无序序列(此序列中第一个轮廓上的指针)包含所有找到的轮廓。对于我的任务顺序很重要。
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(...)
函数使 returns 轮廓按照它们在图片中的顺序排列?可能吗?
谢谢!
您不能直接强制 findContours
以特定顺序产生等高线(我的意思是在函数调用中没有参数来调整它)。
要按 "read text" 顺序对轮廓进行排序,您可以执行一个循环,遍历所有轮廓并为每个轮廓检索最左上角的点,方法是直接遍历每个 contour
对象,或使用边界框(参见 minAreaRect 示例)。
一旦你有了所有这些点,将它们从左到右和从下到上排序(可能需要进行一些调整,比如检测从一定高度范围内开始的所有轮廓都是同一文本行的所有部分)
您已找到图像中所有轮廓的边界矩形。您可以根据每个轮廓的 centroid 对轮廓进行排序,而不是使用 left-most 点方法,这样更稳健,因为您的方法是针对文本。
来自 OpenCV 社区的 THIS ANSWER 可能有助于提供一个起点
我正在尝试使用 C++ 的帮助 OpenCV 库解决识别问题。
我有一些文本(如下),我想使用 cvFindContours(...)
函数分隔文本中的每个符号。之后,我想将每个分离的符号发送到神经网络的输入端以进行识别。没关系。我可以得到图像中的所有轮廓,并且可以借助 cvDrawContours(...)
函数(如下)将其绘制在图像上。但是 cvFindContours(...)
returns 无序序列(此序列中第一个轮廓上的指针)包含所有找到的轮廓。对于我的任务顺序很重要。
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(...)
函数使 returns 轮廓按照它们在图片中的顺序排列?可能吗?
谢谢!
您不能直接强制 findContours
以特定顺序产生等高线(我的意思是在函数调用中没有参数来调整它)。
要按 "read text" 顺序对轮廓进行排序,您可以执行一个循环,遍历所有轮廓并为每个轮廓检索最左上角的点,方法是直接遍历每个 contour
对象,或使用边界框(参见 minAreaRect 示例)。
一旦你有了所有这些点,将它们从左到右和从下到上排序(可能需要进行一些调整,比如检测从一定高度范围内开始的所有轮廓都是同一文本行的所有部分)
您已找到图像中所有轮廓的边界矩形。您可以根据每个轮廓的 centroid 对轮廓进行排序,而不是使用 left-most 点方法,这样更稳健,因为您的方法是针对文本。
来自 OpenCV 社区的THIS ANSWER 可能有助于提供一个起点