【发布时间】:2012-02-07 20:51:22
【问题描述】:
我有一个带有文本的图像,我想找到每个连接组件的边界像素。我应该在 opencv 2.3 中使用哪种方法,我正在用 c 编码。 这个函数可能就像matlab的bwboundaries。
谢谢,
【问题讨论】:
我有一个带有文本的图像,我想找到每个连接组件的边界像素。我应该在 opencv 2.3 中使用哪种方法,我正在用 c 编码。 这个函数可能就像matlab的bwboundaries。
谢谢,
【问题讨论】:
在 OpenCV 2.3 中,您需要的函数称为 cv::findContours。每个轮廓(即连接分量的边界)都存储为点向量。以下是在 C++ 中访问轮廓的方法:
vector<vector<Point> > contours;
cv::findContours(img, contours, cv::RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
for (size_t i=0; i<contours.size(); ++i)
{
// do something with the current contour
// for instance, find its bounding rectangle
Rect r = cv::boundingRect(contours[i]);
// ...
}
如果您需要轮廓的完整层次结构,包括组件内部的孔等,对 findContours 的调用如下:
vector<vector<Point> > contours;
Hierarchy hierarchy;
cv::findContours(img, contours, hierarchy, cv::RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
// do something with the contours
// ...
注意:参数CV_CHAIN_APPROX_SIMPLE表示轮廓中的直线段将由其端点编码。如果您希望存储所有轮廓点,请使用CV_CHAIN_APPROX_NONE。
编辑:在 C 中调用 cvFindContours 并像这样访问轮廓:
CvSeq *contours;
CvMemStorage* storage;
storage = cvCreateMemStorage(0);
cvFindContours(img, storage, &contours, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
CvSeq* c;
for(c=contours; c != NULL; c=c->h_next)
{
// do something with the contour
CvRect r = cvBoundingRect(c, 0);
// ...
}
c->h_next 指向与当前轮廓同层次的下一个轮廓,c->v_next 指向当前轮廓内的第一个轮廓,如果有的话。当然,如果你像上面一样使用CV_RETR_EXTERNAL,c->v_next 将永远是NULL。
【讨论】:
你可以使用cvFindContours(这是1.0版本的调用,但2.3应该有类似的调用)
【讨论】:
OpenCV 中没有实现这样的功能。 您应该搜索形态学操作(图像的减法和相同的膨胀)或查看 cvbloblib http://opencv.willowgarage.com/wiki/cvBlobsLib
它就是为此目的而开发的;)。
【讨论】: