在OpenCV中寻找轮廓?
c++
image
image-processing
opencv
4
0

从图像检索轮廓时,每个斑点应获得2个轮廓-一个内部轮廓和一个外部轮廓。考虑下面的圆圈-由于该圆圈是像素宽度大于1的线,因此您应该能够在图像中找到两个轮廓-一个从圆圈的内部开始,一个从外部开始。

使用OpenCV,我想检索INNER轮廓。但是,当我使用findContours()时,我似乎只是在获取外部轮廓。如何使用OpenCV检索斑点的内部轮廓?

我使用的是C ++ API,而不是C,因此仅建议使用C ++ API的函数。 (即findContours()而不是cvFindContours())

谢谢。

在此处输入图片说明

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

我认为Farhad要求的是从原始图像中裁剪轮廓。

为此,您将需要如上所述找到轮廓,然后使用遮罩从原始图像中获取内部轮廓,然后将结果裁剪为与轮廓大小相同的图像。

收藏
评论

我在您的图像上运行了此代码,并返回了内部和外部轮廓。

#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

int main(int argc, const char * argv[]) {

    cv::Mat image= cv::imread("../../so8449378.jpg");
    if (!image.data) {
        std::cout << "Image file not found\n";
        return 1;
    }

    //Prepare the image for findContours
    cv::cvtColor(image, image, CV_BGR2GRAY);
    cv::threshold(image, image, 128, 255, CV_THRESH_BINARY);

    //Find the contours. Use the contourOutput Mat so the original image doesn't get overwritten
    std::vector<std::vector<cv::Point> > contours;
    cv::Mat contourOutput = image.clone();
    cv::findContours( contourOutput, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE );

    //Draw the contours
    cv::Mat contourImage(image.size(), CV_8UC3, cv::Scalar(0,0,0));
    cv::Scalar colors[3];
    colors[0] = cv::Scalar(255, 0, 0);
    colors[1] = cv::Scalar(0, 255, 0);
    colors[2] = cv::Scalar(0, 0, 255);
    for (size_t idx = 0; idx < contours.size(); idx++) {
        cv::drawContours(contourImage, contours, idx, colors[idx % 3]);
    }

    cv::imshow("Input Image", image);
    cvMoveWindow("Input Image", 0, 0);
    cv::imshow("Contours", contourImage);
    cvMoveWindow("Contours", 200, 0);
    cv::waitKey(0);

    return 0;
}

这是它发现的轮廓:

findContour结果图像

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号