首页 > 解决方案 > 将不规则形状划分为递减的矩形

问题描述

我必须将不规则形状划分为递减的矩形,其中一个是最大的矩形,然后是递减的矩形。我只是想知道在编码世界中是否知道这样的问题?怎么做?

该图显示了我想要实现的目标: 在此处输入图像描述

标签: c++opencv

解决方案


可以使用从此处获取的这段代码找到第一个矩形

Rect findMinRect(const Mat1b& src)
{
    Mat1f W(src.rows, src.cols, float(0));
    Mat1f H(src.rows, src.cols, float(0));

    Rect maxRect(0, 0, 0, 0);
    float maxArea = 0.f;

    for (int r = 0; r < src.rows; ++r)
    {
        for (int c = 0; c < src.cols; ++c)
        {
            if (src(r, c) == 0)
            {
                H(r, c) = 1.f + ((r > 0) ? H(r - 1, c) : 0);
                W(r, c) = 1.f + ((c > 0) ? W(r, c - 1) : 0);
            }

            float minw = W(r, c);
            for (int h = 0; h < H(r, c); ++h)
            {
                minw = min(minw, W(r - h, c));
                float area = (h + 1) * minw;
                if (area > maxArea)
                {
                    maxArea = area;
                    maxRect = Rect(Point(c - minw + 1, r - h), Point(c + 1, r + 1));
                }
            }
        }
    }

    return maxRect;
}

用法很简单

Mat src, src_gray, src_bin;
cv::cvtColor(src, src_gray, COLOR_BGR2GRAY);
src_bin = (src_gray > 1) * 255;
Rect box = findMinRect(~src_bin);
rectangle(src, box, Scalar(0, 0, 255), 2);
cv::imshow("with_rectangle", src);
cv::waitKey();

但这只是第一次迭代。在下一次迭代中,我们必须处理至少 3 个原始图像片段,然后处理 9 个片段,依此类推。我的事情......我将不胜感激任何进一步的建议。


推荐阅读