c++ - OpenCV:合并重叠的矩形

标签 c++ opencv bounding-box object-detection

在使用 OpenCV 进行检测任务时,我一直遇到合并重叠边界框的问题;也就是说,本质上是在两个重叠边界框的并集​​周围找到边界框。当出于某种原因,感兴趣的对象被分成许多边界框,而不是一个无所不包的边界框时,这在对象检测中经常出现。

StackOverflow 上有一些关于算法解决方案和有用的外部库的答案(例如 thisthisthis ),还有 groupRectangles OpenCV 提供的功能(以及一连串的相关问题/错误:thisthis 等)。

我似乎发现上述解决方案对于我要执行的任务来说有点过于复杂。很多算法解决方案都是从数学的角度(更像是一个思想实验)解决这个问题,同时做像 rect1 | 这样的操作。 rect2 可以在矩形数量很多时变得非常慢(它是 O(N^2) 来处理所有事情)并且 groupRectangles 有一些怪癖使其只能部分有效。所以我想出了一个有点老套的解决方案,但实际上非常有效。我想我会在下面与其他需要快速解决这个常见问题的人分享它。

欢迎发表评论和批评。

最佳答案

void mergeOverlappingBoxes(std::vector<cv::Rect> &inputBoxes, cv::Mat &image, std::vector<cv::Rect> &outputBoxes)
{
    cv::Mat mask = cv::Mat::zeros(image.size(), CV_8UC1); // Mask of original image
    cv::Size scaleFactor(10,10); // To expand rectangles, i.e. increase sensitivity to nearby rectangles. Doesn't have to be (10,10)--can be anything
    for (int i = 0; i < inputBoxes.size(); i++)
    {
        cv::Rect box = inputBoxes.at(i) + scaleFactor;
        cv::rectangle(mask, box, cv::Scalar(255), CV_FILLED); // Draw filled bounding boxes on mask
    }

    std::vector<std::vector<cv::Point>> contours;
    // Find contours in mask
    // If bounding boxes overlap, they will be joined by this function call
    cv::findContours(mask, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
    for (int j = 0; j < contours.size(); j++)
    {
        outputBoxes.push_back(cv::boundingRect(contours.at(j)));
    }
}

关于c++ - OpenCV:合并重叠的矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29523177/

相关文章:

graphics - 计算任意基于像素的图形的边界框

c++ - 声明 float 还是强制 float ?

c++ - 将 QListView 添加到 QComboBox 以正确显示滚动条

c++ - 如何在编译时根据 constexpr 结果选择函数

opencv - 查找两个摄像机之间的相对旋转

image - cuda 中的 Sobel 过滤器(无法显示完整图像)

python - Jupyter notebook 无法识别 venv 中的包

c++ - 成员函数模板错误

javascript - 三个 JS - 执行旋转后 BoundingBox 未更新

python - 在 tensorflow 中找到两个边界框的交集?