【问题标题】:How to find boundary pixels of each connected component in an image in opencv如何在opencv中找到图像中每个连接分量的边界像素
【发布时间】:2012-02-07 20:51:22
【问题描述】:

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

谢谢,

【问题讨论】:

    标签: c matlab opencv


    【解决方案1】:

    在 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-&gt;h_next 指向与当前轮廓同层次的下一个轮廓,c-&gt;v_next 指向当前轮廓内的第一个轮廓,如果有的话。当然,如果你像上面一样使用CV_RETR_EXTERNALc-&gt;v_next 将永远是NULL

    【讨论】:

    • 感谢您的回复..我在 C 中执行此操作。所以我将不得不使用 cvFindContours。对此有何建议。?
    • 如何对由轮廓划分的 ROI 着色?
    【解决方案2】:

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

    【讨论】:

    • 谢谢,我在 2.3 中也找到了。你能解释一下 CvSeq ** 是什么意思吗?
    • 每个 CvSeq* 结构都存储一个连接组件。
    【解决方案3】:

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

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

    【讨论】:

    • 好吧,也许是在阅读 cvbloblib 代码示例?我已经给你链接了:)
    • 我称之为不公平。网页的最后有一个代码示例。我很乐意帮助那些搜索了一下以解决他的问题的人。网络上有大量关于 findcontours 和 cvbloblib 的信息,但没有出现在 user1140170 的问题中
    猜你喜欢
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多