如何在opencv中查找图像中每个连通分量的边界像素

时间:2012-01-11 13:43:48

标签: c matlab opencv

我有一个带文字的图像,我想找到每个连接组件的边界像素。我应该在opencv 2.3中使用哪种方法,我在c编码。 这个函数可能就像matlab的bwboundaries一样。

感谢,

3 个答案:

答案 0 :(得分:11)

在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

答案 1 :(得分:1)

您可以使用cvFindContours(这是版本1.0调用,但在2.3中应该有类似的调用)

答案 2 :(得分:-1)

OpenCV中没有实现这样的功能。 您应该搜索形态学操作(图像的延迟和扩张的相同)或查看cvbloblib http://opencv.willowgarage.com/wiki/cvBlobsLib

它是为此目的而开发的;)。