找到带有边界框的对象

时间:2016-08-15 10:32:21

标签: opencv image-segmentation object-detection bounding-box

我想为图片中的每个对象找到边界框,在我发现之后,我裁剪出边界框并将其用于后续步骤。Here is the input picture after preprocessing. 我有一个边界框的代码,但它适用于1个对象。如果有2个对象,则将它们相加并在它们周围绘制一个边界框。 Here is the first output.代码为:

vector<vector<Point>> contours;
vector<Point> points;
findContours(erod, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
for (size_t i = 0; i < contours.size(); i++) {
    for (size_t j = 0; j < contours[i].size(); j++) {
        Point p = contours[i][j];
        points.push_back(p);
    }
}
if (points.size() > 0) {
    Rect brect = boundingRect(Mat(points).reshape(2));
    cv::rectangle(erod, brect.tl(), brect.br(), Scalar(100,100,200), 2, CV_AA);
    Mat ROI = frame(brect);
}

我试过的一件事是使用OpenCV文档的代码。在这里,我将findContours中的CV_RETR_TREE更改为CV_RETR_EXTERNAL,但我仍然遇到许多边界框,我不知道如何裁剪框。

非常感谢!

1 个答案:

答案 0 :(得分:1)

在找到轮廓之前,你应该做一些形态开口来清除所有的噪音和线条:

Mat morphKernelOpen = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new org.opencv.core.Size(20, 20));
Imgproc.morphologyEx(mat, mat, Imgproc.MORPH_OPEN, morphKernelOpen);

结果: enter image description here

此外,对象内部还有一些黑色空格,因此要避免在其中找到轮廓,findContours函数应位于CV_RETR_EXTERNAL模式下:

Imgproc.findContours(scharrThresh, scharrThreshContours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

最后,你将有两个轮廓,你可以像以前一样继续你的盒子

如果您不喜欢物体周围的柔化边缘,则可以在形态开启前执行阈值功能。由于图像中的噪声太大,在物体周围获得100%精确的轮廓将非常困难或几乎不可能。此外,如果可以的话,下次如果你要求在你采取行动后得到结果图像,那么你会更容易给出正确的答案。