【问题标题】:find objects with bounding boxes查找带有边界框的对象
【发布时间】:2016-12-21 13:29:58
【问题描述】:

我想为图片中的每个对象找到边界框,找到之后,我将边界框裁剪出来并用于接下来的步骤。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,但我仍然得到许多边界框,我不知道如何裁剪这些框。

非常感谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    结果:

    此外,您的对象内部有一些黑色空间,因此为避免在其中找到轮廓,您的 findContours 函数应在 CV_RETR_EXTERNAL 模式下:

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

    最后你会得到两个轮廓,你可以像以前一样继续寻找盒子

    如果您不喜欢对象周围的软边缘,您可以在形态学打开之前执行阈值函数。由于图像中的噪声过多,要在对象周围获得 100% 准确的轮廓将非常困难或几乎不可能。另外,如果可以的话,下次如果您要求将您得到的结果图像放在您执行的操作之后,给您一个正确的答案会更容易。

    【讨论】:

    • 感谢您的帮助。下次我会记住这一点。现在可以了!
    • 我忘了说我给出的这段代码是Java语言的,Java中opencv的类名称有点不同,如果给您带来任何困难,我深表歉意。如果你还没有,应该很容易集成和理解,
    • 没问题,我理解它并在我的代码中使用它。谢谢你:)
    猜你喜欢
    • 2011-01-17
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2013-02-04
    • 2017-10-07
    • 1970-01-01
    • 2019-09-30
    相关资源
    最近更新 更多