C ++:找到覆盖二进制图像的最小矩形集

时间:2017-10-04 11:57:19

标签: c++ algorithm opencv computational-geometry rectangles

任务

我有二进制图像,我想提取覆盖非零区域的相对少量的矩形。

我真的不需要最小的集。当然,至少在某些时候找到它不会受到伤害,但非病态病例的平均速度对我来说更为重要。

如果有帮助,您可以将二进制图像视为一组1x1矩形。事实上,这样的设置很容易找到,而且这个解决方案基本上对我有用 - 但是,找到任何较小的设置都会大大加快其他事情的发展。

另一个替代方案(或多或少等同于上述内容,至少从我的观点来看)是将一组任意轮廓(包括孔)作为输入:

enter image description here

相关工作

这个问题已被多次提出并回答;例如,接受的答案here很棒。

甚至还有一个Javascript实现here

所以问题不在于算法是否存在,或者哪种算法是最优的。

问题

相反,问题是:

鉴于我正在使用C ++和OpenCV,是否有一个实现可以轻松地集成到我的代码中?

更好的是,是否有允许许可的实施?

理想的解决方案

理想情况下,我可以这样做:

const cv::Mat binary_image = ...; // get input image from somewhere
const std::vector<cv::Rect> rects = dissect(binary_image);

或者:

const std::vector<cv::Rect> initial_rects = ...;
const std::vector<cv::Rect> rects = find_small_dissection(initial_rects);

但是,当然不使用OpenCV的解决方案也没问题;来回转换根本没问题。但由于OpenCV已经有了图像类型(cv::Mat)和矩形(cv::Rect),因此使用上述定义很方便。

此问题的动机

并不是我不能使用伪代码或Javascript代码,而是开始将其移植到C ++和OpenCV。但是,在我的实现运行无bug之前可能需要一段时间。我更倾向于使用同一时间测试,并可能修复现有的开源实现。如果找不到任何东西,那么我可能需要自己编写代码,但是我可能无法开源结果(因为我正在为我的客户开发商业产品)。

0 个答案:

没有答案