我有一个带文字的图像,我想找到每个连接组件的边界像素。我应该在opencv 2.3中使用哪种方法,我在c编码。 这个函数可能就像matlab的bwboundaries一样。
感谢,
答案 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
。
编辑:您致电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
它是为此目的而开发的;)。