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