将更接近的白色像素组合在一起,并在 OpenCV 中在它们周围绘制一个矩形

2023-12-11

我想将这些彼此更接近的白色像素分组,并使用 C++ 在 OpenCV 中在它们周围绘制一个矩形。

原图:

预期结果:

我是 OpenCV 新手。任何帮助将不胜感激。


您可以根据给定的谓词对白色像素进行分组分割。在这种情况下,您的谓词可以是:将给定欧氏距离内的所有白色像素分组.

然后,您可以计算每个组的边界框,保留最大的框(下面的红色部分),并最终放大它(下面的绿色部分):

enter image description here

Code:

#include <opencv2\opencv.hpp>
#include <vector>
#include <algorithm>

using namespace std;
using namespace cv;

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

    // Convert to grayscale
    Mat1b gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);

    // Get binary mask (remove jpeg artifacts)
    gray = gray > 200;

    // Get all non black points
    vector<Point> pts;
    findNonZero(gray, pts);

    // Define the radius tolerance
    int th_distance = 50; // radius tolerance

    // Apply partition 
    // All pixels within the radius tolerance distance will belong to the same class (same label)
    vector<int> labels;

    // With lambda function (require C++11)
    int th2 = th_distance * th_distance;
    int n_labels = partition(pts, labels, [th2](const Point& lhs, const Point& rhs) {
        return ((lhs.x - rhs.x)*(lhs.x - rhs.x) + (lhs.y - rhs.y)*(lhs.y - rhs.y)) < th2;
    });

    // You can save all points in the same class in a vector (one for each class), just like findContours
    vector<vector<Point>> contours(n_labels);
    for (int i = 0; i < pts.size(); ++i)
    {
        contours[labels[i]].push_back(pts[i]);
    }

    // Get bounding boxes
    vector<Rect> boxes;
    for (int i = 0; i < contours.size(); ++i)
    {
        Rect box = boundingRect(contours[i]);
        boxes.push_back(box);
    }

    // Get largest bounding box
    Rect largest_box = *max_element(boxes.begin(), boxes.end(), [](const Rect& lhs, const Rect& rhs) {
        return lhs.area() < rhs.area();
    });

    // Draw largest bounding box in RED
    Mat3b res = img.clone();
    rectangle(res, largest_box, Scalar(0, 0, 255));

    // Draw enlarged BOX in GREEN
    Rect enlarged_box = largest_box + Size(20,20);
    enlarged_box -= Point(10,10);

    rectangle(res, enlarged_box, Scalar(0, 255, 0));


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

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

将更接近的白色像素组合在一起,并在 OpenCV 中在它们周围绘制一个矩形 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • 子进程打开('source venv/bin/activate'),没有这样的文件?

    我想进入 python 文件中的虚拟环境 但它没有引发这样的文件 import subprocess subprocess Popen source Users XX Desktop mio worker venv bin activate
  • 如何绘制双对数 R 图的线性回归?

    我有以下数据 someFactor 500 x c 1 250 y x 25 someFactor 我以双对数图显示 plot x y log xy 现在我使用线性模型 找出 数据的斜率 model lm log y log x model
  • 如何以编程方式从 Android 删除 SQLite 数据库

    我想从以下位置删除数据库文件Android file system以编程方式 我可以启动 shell 脚本吗adb它又在 Android 空间中运行 shell 脚本来删除数据库 我可以在短时间内完成这件事吗JUnit测试用例 带有syst
  • 哈希表和Trie(前缀树)如何选择?

    因此 如果我必须在哈希表或前缀树之间进行选择 那么导致我选择其中之一的区别因素是什么 从我自己天真的角度来看 使用 trie 似乎有一些额外的开销 因为它不是存储为数组 但就运行时间而言 假设最长的键是最长的英语单词 它本质上可以是 O 1
  • 使用 LightOpenID 登录/注销用户状态

    我正在尝试在我的网站上使用 LightOpenId 来登录 注销用户 这工作正常 但我的问题是 如何跟踪用户登录 注销状态并采取相应的操作 我希望用户仅在登录时访问我的网站功能 并在用户注销时重定向到登录页面 提前致谢 你的问题实际上与Op
  • 创建自定义键盘控件 [Elm]

    我正在尝试为 4 人游戏创建自定义键盘控件 现在 密钥是这样预先确定的 type Orient x Int y Int type GameInput space Bool delta Time so1 Orient so2 Orient s
  • 在 bash 中获取某些列

    假设我有一个数组 其中数组中的每个元素都采用以下格式 someText x1 y1 z1 x2 y2 z2 x3 y2 z3 KEY 构建新数组的方法是什么 其中新数组中的元素只是前一个数组的第一列和最后一列 你可以做这样的事情 其中OLD
  • CloudFormation - 从 Lambda 代码访问参数

    我有一个CloudFormation模板看起来像这样 AWSTemplateFormatVersion 2010 09 09 Description This template will deploy stuff Parameters my
  • 如何使用文件权限保护 Laravel 中的 .env 文件?

    我的 env 文件包含所有凭据 可通过 URL 访问 我发现了一些问题 比如如何在 laravel 5 4 中保护 env 文件 上面说要使用htaccess以防止用户访问该文件 但我更喜欢使用文件权限 所以我将权限更改为0111它只能执行
  • select语句中列的顺序会影响查询速度吗?

    例如 我有一个这样的数据库 id fname lname sex age tel cell address If I do select cell fname address sex而不是做select fname sex cell add
  • getResourceAsStream() 没有看到资源

    我想从我的 jar 文件中解压资源 jar的结构如下 my jar META INF resources my exe my dll my namespace UnpackResourceFromThisClass class 我想从 ja
  • 在响应文本中显示换行符

    我使用 Swagger UI v2 2 0 我有一个返回纯文本的 RESTful 方法 我想用换行符显示此文本 目前 返回的文本包含换行符 但它们显示为 n The Content Type响应头是text plain 我可以返回文本并插入
  • 如何仅使用 php 脚本播放声音文件

    请告诉我如何使用 php 脚本播放声音文件 wav 我需要从数据库获取值 并根据这些值我应该播放声音文件 预先感谢 iam 使用 Linux 操作系统 PHP只是一种处理语言 它cannot为用户播放音频 它can显示将播放 wav 声音的
  • ImageMagick 与 VS2012

    首先非常感谢您阅读我的帖子 我正在尝试使用图像魔术师 with VS2012 on Windows 7 64 位用于图像旋转 这是我所做的 下载图像魔术师对于 Windows 并解压缩它 进入 ImageMagick 6 8 8 Visua
  • ContentFile 未保存在 Django 模型 FileField 中

    我在 Django 模型中将字符串保存为文件时遇到问题 因为每当我尝试取回数据时 它都会给我一个 ValueError 属性没有关联的文件 详细信息如下 MODEL class GeojsonData models Model dname
  • 参考我自己的类型的最佳方式

    abstract class A
  • 无法将实体框架连接到本地 SQL Server Express

    我有连接字符串
  • MPMoviePlayerController 在 iPhone 应用程序中反向(向后)播放电影不流畅

    我正在开发一个 iPhone 应用程序 我需要反转视频播放 我目前正在使用 XCode 4 2 我正在尝试使用 MPMoviePlayerController 反向播放电影 但反向播放时就没有正向播放那么流畅 它变得有点断断续续 一点也不光
  • SQL 中日期范围内的工作日数

    这比看起来更难 我需要一个函数来计算日期范围内给定工作日的数字 我不需要任何循环或递归 SQL 有数以百万计的例子就是这样做的 我需要一个快速的计算函数 函数的输入将是工作日 起始日期 今日 counting fridays set dat
  • 将更接近的白色像素组合在一起,并在 OpenCV 中在它们周围绘制一个矩形

    我想将这些彼此更接近的白色像素分组 并使用 C 在 OpenCV 中在它们周围绘制一个矩形 原图 预期结果 我是 OpenCV 新手 任何帮助将不胜感激 您可以根据给定的谓词对白色像素进行分组分割 在这种情况下 您的谓词可以是 将给定欧氏距