在二进制图像

时间:2015-07-18 08:49:39

标签: c++ opencv

下面给出了图像的示例。我使用图像的二进制版本进行进一步处理。我想获得对象的轮廓以执行形状匹配。我编写了一个代码,在给定二进制图像的情况下返回边界轮廓。但是,当图像不包含单个物体时会出现问题,就像这里的情况一样,即使手掌没有附着在身体上,您也可以看到腿的下半部分。我有兴趣找到近似整个物体的轮廓。所以,远远opencv没有帮助。

enter image description here

我的轮廓功能是使用opencvblobslib库,看起来像这样。基本上它会检测所有的blob并过滤掉真正的小blob。然后,它检查是否只剩下一个轮廓。只要对象已连接,这就可以工作,但我想使其健壮,以便它也可以处理多个对象的情况。

vector<Point>  getContour(Mat binaryImg) {
    CBlobResult res(binaryImg, Mat(),NUMCORES);  // We get all possible bounding box using this object
    CBlobResult resFiltered;                     // We shall then filter the bboxes if their area is less
                                                 // than alpha % of the total area

    double originalImageArea = binaryImg.rows * binaryImg.cols;
    double alpha = 0.05;
    double lowerLimitRectArea = alpha * originalImageArea;
    double bbox_area;
    for(int i = 0; i < res.GetNumBlobs(); i++){
        CBlob* b = res.GetBlob(i);
        Rect bbox = b->GetBoundingBox();
        double bbox_area = bbox.area();
        if(bbox_area < lowerLimitRectArea){
            b->to_be_deleted = 1.0;
        }
    }

    res.Filter(resFiltered, B_EXCLUDE, CBlobGetTBDeleted(), B_EQUAL, 1.0,1.0);

    if (resFiltered.GetNumBlobs() > 1) {
        cout << " Errror case " << endl;
        exit(1);
    }
    CBlob* b = resFiltered.GetBlob(0);
    CBlobContour* extCont = b->GetExternalContour();
    t_PointList contPts = extCont->GetContourPoints();
    vector<Point> contour;
    contour.resize(contPts.size());

    for( int i=0; i < contPts.size(); i++) {
        contour[i] = cv::Point(contPts[i].x, contPts[i].y);
    }
    return contour;
}

0 个答案:

没有答案