c++ - 将不规则形状划分为递减的矩形
解决方案
可以使用从此处获取的这段代码找到第一个矩形
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 个片段,依此类推。我的事情......我将不胜感激任何进一步的建议。
推荐阅读
- python - 是否可以将包含字符串、变量和整数的多个打印命令包装到以后可以写入文件的变量中
- json - 如何在 Dart 中为地图、多级地图创建模型
- node.js - OAuth2:提供的`redirect_uri`与代码授权的内容不匹配
- java - 如何在springboot的@ResponseBody中用两个不同的节点映射单个实体
- vue.js - watchEffect 有副作用但没有无限循环
- php - XAMPP-VM 安装 Redis
- python - Python程序根据row和col确定字母
- java - spring security 中删除了重复的grantedAuthorities
- python - 代码抛出错误:只能将 str(不是“NoneType”)连接到 str
- django - 将模型中的每个 m2m 关系作为 DRF 序列化程序中的不同对象