gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:16:45 27 4
gpt4 key购买 nike

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

谢谢,

最佳答案

在 OpenCV 2.3 中,您想要的函数称为 cv::findContours .每个轮廓(连接组件的边界)都存储为点 vector 。以下是在 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_EXTERNALc->v_next 将始终为 NULL

关于c - 如何在opencv中找到图像中每个连通分量的边界像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8820289/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com