安卓 OpenCV 查找轮廓

11

我需要提取一张图片中的最大轮廓。这是我目前正在使用的代码,收集自网上的几个片段。

List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.findContours(outerBox, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
double maxArea = -1;
int maxAreaIdx = -1;
for (int idx = 0; idx < contours.size(); idx++) {
    Mat contour = contours.get(idx);
    double contourarea = Imgproc.contourArea(contour);
    if (contourarea > maxArea) {
        maxArea = contourarea;
        maxAreaIdx = idx;
    }
}

看起来它似乎可以工作,但我不太确定接下来该怎么做。 我尝试使用Imgproc.floodFill,但我不太确定如何操作。 这个函数需要一个与原始Mat大小相同的掩膜Mat+2水平和+2垂直。 当我在轮廓contours.get(maxAreaIdx)上运行它时,它给了我一个错误。 代码:

Mat mask = Mat.zeros(contour.rows() + 2, contour.cols() + 2, CvType.CV_8UC1);
int area = Imgproc.floodFill(contour, mask, new Point(0,0), new Scalar(255, 255, 255));

错误:

11-18 19:07:49.406: E/cv::error()(3117): OpenCV Error: Unsupported format or combination of formats () in void cvFloodFill(CvArr*, CvPoint, CvScalar, CvScalar, CvScalar, CvConnectedComp*, int, CvArr*), file /home/oleg/sources/opencv/modules/imgproc/src/floodfill.cpp, line 621

基本上我的问题是,我如何在找到最大面积的轮廓后,“突出显示”它? 我想让其他所有东西都变成黑色,而轮廓变成白色

谢谢!

1个回答

10
您可以在 OpenCV 中使用 DrawContours 函数: http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=drawcontours#drawcontours 或者您可以在 C++ 中使用此实现(您可以在 OpenCV 文档中找到 Java 版本的等效函数,只需在 Google 上键入OpenCV + 函数名称即可)。
Mat src = imread("your image"); int row = src.rows; int col = src.cols;
    //Create contour
vector<vector<Point> > contours; 
vector<Vec4i> hierarchy;
Mat src_copy = src.clone();
    findContours( src_copy, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);

// Create Mask
Mat_<uchar> mask(row,col);    
for (int j=0; j<row; j++)
    for (int i=0; i<col; i++)
        {
            if ( pointPolygonTest( contours[0], Point2f(i,j),false) =0)
            {mask(j,i)=255;}
            else
            {mask(j,i)=0;}
        };

尝试使用contours[1]、contours[2]...等来找到最大的轮廓。

这是用于显示轮廓的:

namedWindow("Contour",CV_WINDOW_AUTOSIZE);
imshow("Contour", mask);

@Marek 你拿到这个的Java实现了吗? - Prasanna Aarthi
2
在color-blob-detection示例中有Java/opencv4android findContours示例。 - Mytheral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接