使用 OpenCV 在斑点内创建矩形

2023-11-24

输入图像:

输出图像:

我的图像中有几个彩色斑点,我试图在每种颜色的最大斑点内创建矩形(或正方形——这似乎更容易)。我发现了如何创建一个包围单个最大斑点的矩形​​的答案,但我不确定如何找到一个适合在斑点内的正方形。它不一定是最大的,它只需要大于某个区域,否则我不会包括它。我还看到了一些关于多边形的工作,但没有看到关于无定形形状的工作。


对于单个 blob,问题可以表述为:找到矩阵中仅包含零的最大矩形.

要找到斑点内最大的轴向矩形,您可以参考该函数findMinRect in 我的另一个答案。该代码是从Python 中的原始代码移植到C++ 中的here.


那么第二个问题是找到所有具有相同颜色的斑点。这有点棘手,因为您的图像是 jpeg,并且压缩会在边界附近产生很多人造颜色。所以我创建了一个 png 图像(如下所示),只是为了表明该算法是有效的。您可以提供没有压缩伪影的图像。

然后,您只需为每种颜色创建一个遮罩,找到该遮罩中每个斑点的连通分量,并计算每个斑点的最小矩形。

初始图像:

enter image description here

在这里,我显示了为每个斑点找到的矩形,按颜色划分。然后,您可以仅采用所需的矩形,无论是每种颜色的最大矩形,还是每种颜色的最大斑点的矩形​​。

Result:

enter image description here

这里是代码:

#include <opencv2/opencv.hpp>
#include <algorithm>
#include <set>
using namespace std;
using namespace cv;

// https://stackoverflow.com/a/30418912/5008845
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;
}


struct lessVec3b
{
    bool operator()(const Vec3b& lhs, const Vec3b& rhs) {
        return (lhs[0] != rhs[0]) ? (lhs[0] < rhs[0]) : ((lhs[1] != rhs[1]) ? (lhs[1] < rhs[1]) : (lhs[2] < rhs[2]));
    }
};

int main()
{
    // Load image
    Mat3b img = imread("path_to_image");

    // Find unique colors
    set<Vec3b, lessVec3b> s(img.begin(), img.end());

    // Divide planes of original image
    vector<Mat1b> planes;
    split(img, planes);
    for (auto color : s)
    {
        // Create a mask with only pixels of the given color
        Mat1b mask(img.rows, img.cols, uchar(255));
        for (int i = 0; i < 3; ++i)
        {
            mask &= (planes[i] == color[i]);
        }

        // Find blobs
        vector<vector<Point>> contours;
        findContours(mask, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

        for (int i = 0; i < contours.size(); ++i)
        {
            // Create a mask for each single blob
            Mat1b maskSingleContour(img.rows, img.cols, uchar(0));
            drawContours(maskSingleContour, contours, i, Scalar(255), CV_FILLED);

            // Find minimum rect for each blob
            Rect box = findMinRect(~maskSingleContour);

            // Draw rect
            Scalar rectColor(color[1], color[2], color[0]);
            rectangle(img, box, rectColor, 2);
        }
    }

    imshow("Result", img);
    waitKey();

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OpenCV 在斑点内创建矩形 的相关文章

  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 在每次迭代中使用 for 循环的索引命名图像

    我正在使用 MATLAB 进行图像处理项目 我使用 for 循环在每次循环迭代时生成某种图像数据 图像大小不同 我的问题是如何阻止它在下一次迭代中覆盖图像 Img i j data 理想情况下我希望它有 Img 1 data for 1st
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 如何迭代/流式传输 gzip 文件(包含单个 csv)?

    如何迭代包含单个文本文件 csv 的 gzip 压缩文件 搜索 crates io 我发现flate2其中解压的代码示例如下 extern crate flate2 use std io prelude use flate2 read Gz
  • CodeIgniter REST API 库 Ajax PUT 抛出 403 Forbidden

    我让库的其余部分充分工作 只是尝试生成 api 密钥 并在通过 ajax 执行时抛出 403 禁止 status false error Invalid API Key 我追踪到 REST Controller 下的 remap 函数 几乎
  • Java 8 泛型类型方法参考

    我在使用 Java 8 方法引用与泛型类型时遇到问题 我已经简化了我的问题 以明确问题所在 以下代码失败 public static void main String args new Mapper TestEvent setId priv
  • websphere 上的字符编码问题

    我在两个应用程序服务器 websphere 8 0 0 3 中部署的应用程序存在以下问题 这些服务器具有相同的配置文件 为了确定起见 我一度导出了一个配置文件并将其导入到第三个应用程序服务器 并且我在读取和显示以 iso8859 7 编码的
  • 来自 Bloomberg 价格的 IMPORTXML 和正确的 XPath [重复]

    这个问题在这里已经有答案了 我正在尝试从彭博网站获取共同基金的价格 我尝试在 Google 表格中使用 ImportXML 函数 放入 Bloomberg 链接并复制完整的 XPath 但它总是返回 N A 这是我的功能 IMPORTXML
  • Wix修改现有的ini文件

    我试图在 Wix 中修改 ini 文件 如果它不存在 则 msi 不会完成 我该如何检查这个 我真的很想修改它 是的 我查看了其他 stackoverflow 问题 答案以及 google 我正在尝试这个
  • 模板中的 ngIf-else

    我正在尝试加载pictureA or pictureB 我的第一个解决方案是这样的 img src my picture width 180 height 80 img src default picture 但我想用if else如 AP
  • Uri.IsWellFormedUriString 需要更新吗?

    我想我可能发现了 Uri IsWellFormedUriString 方法中的错误 可能是因为它只符合RFC 2396 and RFC 2732标准而不是新的RFC 3986这使得上述两个过时了 我认为发生的情况是任何非 us ascii
  • 从 nsarray 中获取 n 个随机对象(例如 4)

    我有一个很大的 NSArray 名称 我需要从该数组中随机获取 4 条记录 名称 我该怎么做 include
  • 是否有可能在 emgucv 中找到“斑点”区域的边缘?

    我有一个看起来像这样的图像 我想找到黑暗部分的边缘 如下所示 红线是我正在寻找的 我尝试了几种方法 但没有一个有效 所以我希望有一位 emgu 大师愿意帮助我 方法一 将图像转换为灰度 去除噪音并反转 删除任何不太亮的东西 获取精明和多边形
  • startMonitoringSignificantLocationChanges 的替代方案?

    我是iPhone应用程序开发的初学者 但我正在尝试制作一个应用程序 基本上每隔一段时间更新一次您的位置 当它不在前台时 这样我就可以绘制一个人在他 她时去过的地方启动一个应用程序 我以为我可以使用 startMonitoringSignif
  • 无法获取 Gradle 包装器属性

    当我尝试导入项目时出现以下错误 无法从以下位置获取 Gradle 包装器属性 F projects Polyfills cordova platforms android gradle wrapper gradle wrapper prop
  • 如何在 Maven 中使用 BOM 文件?

    我在互联网上进行了大量研究 但没有找到任何简单的解释如何处理BOM使用 Maven 生成文件 问题是我使用 JBoss 7 1 1 并且我想将所有 JBoss 客户端 jar 包含在pom xml JBoss 有一本手册说我应该使用 BOM
  • Python 样条线或其他与 x 轴上的时间一起工作的插值?

    尝试使用非常有用的 pandas 来处理作为时间序列的数据 我现在绊倒了这样一个事实 似乎不存在可以直接对具有 DateTime 作为 x 的数据进行插值 使用样条曲线或类似方法 的库轴 我似乎总是被迫首先转换为某个浮点数 例如 1980
  • SQL Server 2005 非聚集索引死锁

    谁能帮我解决 SQL Server 2005 中的死锁问题 对于一个简单的测试 我有一个表 Book 它有一个主键 id 和一个列名 该主键的默认索引是非聚集的 当两个会话同时运行时就会发生死锁 活动监视器显示第一个会话 step 1 使用
  • Heroku 和 node-cron?

    所以我知道 Heroku 的免费测功机在没有任何流量时会 放松 这会如何影响我使用 node cron 模块实现的 cron 作业 当您的空闲测功机处于睡眠状态时 由node cron 安排的作业将不会运行 作为替代方案 您可以使用Hero
  • json.dump() 是否附加到文件?

    我在使用 json dump 时遇到一些意外行为 我正在创建一个文件results 空 然后在代码中使用它 如下所示 with open results r as fp temp try file not empty load existi
  • Double 值返回 0 [重复]

    这个问题在这里已经有答案了 这是一个例子 Double d 1 3 System out println d 这会返回 0 而不是 0 33333 它应该是这样 有人知道吗 那是因为1 and 3被视为integers当你没有另外指定时 所
  • Spray.io:无法编译测试规范

    我有以下服务 trait PingService extends MyHttpService val pingRoutes path ping get complete message gt pong MyHttpService是一个扩展的
  • 使用 OpenCV 在斑点内创建矩形

    输入图像 输出图像 我的图像中有几个彩色斑点 我试图在每种颜色的最大斑点内创建矩形 或正方形 这似乎更容易 我发现了如何创建一个包围单个最大斑点的矩形 的答案 但我不确定如何找到一个适合在斑点内的正方形 它不一定是最大的 它只需要大于某个区