当矩形与另一个矩形重叠时 OpenCV 连接轮廓

2023-11-30

我有以下输入图像:

enter image description here

我的目标是绘制红色区域的轮廓。为此,我有以下代码: 导入CV2

# Read image
src = cv2.imread("images.jpg", cv2.IMREAD_GRAYSCALE)

# Set threshold and maxValue
thresh = 150 
maxValue = 200

# Basic threshold example
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY);

# Find Contours
countours,hierarchy=cv2.findContours(dst,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

for c in countours:
    rect = cv2.boundingRect(c)
    if rect[2] < 10 or rect[3] < 10: continue
    x,y,w,h = rect
    cv2.rectangle(src,(x,y),(x+w,y+h),(255,255,255),2)

# Draw Contour
#cv2.drawContours(dst,countours,-1,(255,255,255),3)

cv2.imshow("Contour",src)
cv2.imwrite("contour.jpg",src)
cv2.waitKey(0)

我得到以下输出:

enter image description here

我的目标是删除落在更大矩形内的所有矩形并连接更大的矩形,例如如下所示:

enter image description here

我怎么做 ?


如果你使用cv2.RETR_EXTERNAL代替cv2.RETR_TREE in findContours,该函数将仅返回外部轮廓。因此它不会返回位于另一个轮廓内部的轮廓。

要合并轮廓,一种非常简单的方法是在黑色蒙版上绘制白色填充的轮廓,然后在该蒙版上执行新的 findContours。它将返回组合轮廓的轮廓。

要排除小轮廓:您可以使用以下命令获取轮廓的大小contourArea并将其与您设置的值进行比较。在下面的代码中,我添加了一个跟踪栏,以便您可以动态设置最小值。

Result:
enter image description here

注意小矩形的大小合适。它不重叠,但高于 minContourSize。如果您想排除该轮廓,可以增加 minContourSize,但您也可以开始排除您确实想要的轮廓。解决方案是对轮廓大小设置第二次检查,这次是在掩模上。由于蒙版具有组合轮廓,因此您可以将阈值设置得更高。

如果您想将该轮廓合并到较大的轮廓:您可以通过绘制填充轮廓以及具有几个像素宽轮廓的非填充矩形来使轮廓连接到蒙版上。尽管更合适的方法是调查形态转变,您可以将其应用到面膜上。

Code:

import cv2
import numpy as np
# Read image
src = cv2.imread("3E3MT.jpg", cv2.IMREAD_GRAYSCALE)

# Set threshold and maxValue
thresh = 150 
maxValue = 200
# set an initial minimal contour size
minContourSize = 250
# create a window  (needed for use with trackbar)
cv2.namedWindow("Contour")

def setMinSize(val):
        # set the minimal contour size and find/draw contours
        global minContourSize
        minContourSize = val
        doContours()

def doContours():
        # create a copy of the image (needed for use with trackbar)
        res = src.copy()
        # find contours - external only
        countours,hierarchy=cv2.findContours(dst,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
        # create an empty mask
        mask = np.zeros(src.shape[:2],dtype=np.uint8)
        # draw filled boundingrects if the contour is large enough
        for c in countours:
                if cv2.contourArea(c) > minContourSize:
                        x,y,w,h  = cv2.boundingRect(c)
                        cv2.rectangle(mask,(x,y),(x+w,y+h),(255),-1)

        # find the contours on the mask (with solid drawn shapes) and draw outline on input image
        countours,hierarchy=cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
        for c in countours:
                        cv2.drawContours(res,[c],0,(255,255,255),2)
        # show image
        cv2.imshow("Contour",res)

# create a trackbar to set the minContourSize - initial is set at 250,
# maximum value is currently set at 1500, you can increase it if you like
cv2.createTrackbar("minContourSize", "Contour",250,1500,setMinSize)
# Basic threshold example
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY)
# Find Contours
doContours()
# waitkey to prevent program for exiting by itself
cv2.waitKey(0)
cv2.destroyAllWindows()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当矩形与另一个矩形重叠时 OpenCV 连接轮廓 的相关文章

  • 如何在 Ubuntu 上安装 Python 模块

    我刚刚用Python写了一个函数 然后 我想将其做成模块并安装在我的 Ubuntu 11 04 上 这就是我所做的 创建 setup py 和 function py 文件 使用 Python2 7 setup py sdist 构建分发文
  • 使用 Django 的 post_save() 信号

    我有两张桌子 class Advertisement models Model created at models DateTimeField auto now add True author email models EmailField
  • 获取单个方程的脚本

    在文本文件中输入 a 2 8 b 3 9 c 4 8 d 5 9 e a b f c d g 0 6 h 1 7 i e g j f h output i j 期望的输出 输出 2 8 3 9 0 6 4 8 5 9 1 7 如果输入文件名
  • 使用 CLion 进行 OpenCV Windows 设置

    我想在 Windows 上为 CLion IDE 设置 OpenCV 我尝试使用 OpenCV 3 1 和 2 4 得到相同的结果 我有 Windows 10 64 位 CLion 使用 cygwin 环境 到目前为止我做了什么 1 从Op
  • 使用正则表达式解析 Snort 警报文件

    我正在尝试使用 Python 中的正则表达式从 snort 警报文件中解析出源 目标 IP 和端口 和时间戳 示例如下 03 09 14 10 43 323717 1 2008015 9 ET MALWARE User Agent Win9
  • 无法包含外部 pandas 文档 Pycharm v--2018.1.2

    我无法包含外部 pandas 文档Pycharm v 2018 1 2 例如 numpy gt http docs scipy org doc numpy reference generated module name element na
  • OpenCV 2.4.3rc 和 CUDA 4.2:“OpenCV 错误:没有 GPU 支持”

    我在这张专辑中上传了几张截图 https i stack imgur com TELST jpg https i stack imgur com TELST jpg 我正在尝试在 Visual Studio 2008 中的 OpenCV 中
  • Python3 查找 2 个列表中有多少个差异才能相等

    假设我们有 2 个列表 always具有相同的长度和always包含字符串 list1 sot sot ts gg gg gg list2 gg gg gg gg gg sot 我们需要找到 其中有多少项list2应该改变 以便它等于lis
  • python中函数变量的作用域

    假设我们有两个函数 def ftpConnect ftp FTP server ftp login ftp cwd path def getFileList ftpConnect files ftp nlst print files 如果我
  • VSCode pytest 测试发现失败

    Pytest 测试发现失败 用户界面指出 Test discovery error please check the configuration settings for the tests 输出窗口显示 Test Discovery fa
  • 唯一的图像哈希值即使 EXIF 信息更新也不会改变

    我正在寻找一种方法来为 python 和 php 中的图像创建唯一的哈希值 我考虑过对原始文件使用 md5 和 因为它们可以快速生成 但是当我更新 EXIF 信息 有时时区关闭 时 它会更改总和 并且哈希也会更改 有没有其他方法可以为这些文
  • 反加入熊猫

    我有两个表 我想附加它们 以便仅保留表 A 中的所有数据 并且仅在其键唯一时添加表 B 中的数据 键值在表 A 和 B 中是唯一的 但在某些情况下键将出现在表 A 和 B 中 我认为执行此操作的方法将涉及某种过滤联接 反联接 以获取表 B
  • Python unicode 字符代码?

    有没有办法将 Unicode 字符 插入 Python 3 中的字符串 例如 gt gt gt import unicode gt gt gt string This is a full block s unicode charcode U
  • 如何逐像素绘制正方形(Python,PIL)

    在空白画布上 我想使用 Pillow 逐像素绘制一个正方形 我尝试使用 img putpixel 30 60 155 155 55 绘制一个像素 但它没有执行任何操作 from PIL import Image def newImg img
  • ValueError:无法插入 ID,已存在

    我有这个数据 ID TIME 1 2 1 4 1 2 2 3 我想按以下方式对数据进行分组ID并计算每组的平均时间和规模 ID MEAN TIME COUNT 1 2 67 3 2 3 00 1 如果我运行此代码 则会收到错误 ValueE
  • Python模块单元测试的最佳文件结构组织?

    遗憾的是 我发现有太多方法可以在 Python 中保存单元测试 而且它们通常没有很好的文档记录 我正在寻找一种 终极 结构 它可以满足以下大部分要求 be discoverable by test frameworks including
  • Google App Engine 中的自定义身份验证

    有谁知道或知道我可以在哪里学习如何使用 Python 和 Google App Engine 创建自定义身份验证流程 我不想使用 Google 帐户进行身份验证 并且希望能够创建自己的用户 如果不是专门针对 Google App Engin
  • 使用 Keras 和 fit_generator 绘制 TensorBoard 分布和直方图

    我正在使用 Keras 使用 fit generator 函数训练 CNN 这似乎是一个已知问题 https github com fchollet keras issues 3358TensorBoard 在此设置中不显示直方图和分布 有
  • 从时间序列生成日期特征

    我有一个数据框 其中包含如下列 Date temp data holiday day 01 01 2000 10000 0 1 02 01 2000 0 1 2 03 01 2000 2000 0 3 30 01 2000 200 0 30
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is

随机推荐

  • matplotlib,具有透明度的颜色图在 colorbar 和 imshow 中看起来不同

    我想使用具有不同 alpha 值的自定义颜色图 但是 添加颜色条时 颜色看起来会有所不同 我相信下面所附的示例非常清楚地表明了这一点 颜色栏中的颜色穿过微红色 如预期 而图中的数据似乎更偏灰色 我该如何解决这个问题 我很确定我错过了一些微不
  • tryCatch 似乎没有返回我的变量

    我正在尝试使用 tryCatch 生成 p 值列表 矩阵中有几行没有足够的观察值进行 t 检验 这是我到目前为止生成的代码 pValues lt c for i in row names collapsed gs raw tryCatch
  • 如何在SQL中查找组内序列中的缺失值?

    我有一张 ID 和位置表 CREATE TABLE MissingSequence ID INT NOT NULL Position INT NOT NULL INSERT INTO MissingSequence ID Position
  • 路径名太长打不开?

    这是执行的截图 如您所见 错误表明目录 JSONFiles Apartment Rent dubizzleabudhabiproperty 不存在 但请看看我的文件 该文件夹肯定在那里 Update 2 The code self file
  • 从文件中打开 URL 并在 UiPath 中截取屏幕截图

    这是一个 UI 路径序列 我正在尝试从 Excel 文件中读取一些 URL 启动浏览器 从文件转到 URL 截图 保存截图 我无法使用 截屏 活动 不确定 如何截取屏幕截图并将其另存为文件 The Take Screenshot活动需要一个
  • 如何获取父级中动画值的子级小部件大小

    随着 flutter 的不断发展 有很多建议和 方法 我不确定什么是正确的 因为我对这个框架真的很陌生 比如说 我有以下代码 几乎没有减少 override Widget build BuildContext context return
  • 无法升级到 Jackson 2.1.4,Jersey 忽略注释

    简短版本 如中所述http wiki fasterxml com JacksonAnnotations 重要提示 Jackson 1 x 和 2 x 注释存在于不同的 Java 中 和 Maven 包 请参阅 Jackson 2 0 以获得
  • 如果在 Laravel 中通过身份验证,则将用户从登录页面重定向到主页

    我正在使用 Laravel 5 1 构建登录 注册模块 我定义了以下路线 Route get function return view welcome Route get home middleware gt auth function r
  • 多个配置文件导致重复消息

    我有一台在 AWS 中运行的 Logstash 机器 在 Logstash 中 我有 3 个配置文件 每个文件上定义了 1 个输入 这些输入正在从以下来源读取日志 From s3 来自http输入 来自文件节拍 问题是我在 Kibana 中
  • Angular 2+:如何从 HTML 代码中删除所有 Angular 属性和注释(以及其他 Angular 工件)?

    我想以一种不常见的方式使用 Angular 我用它来生成 HTML 稍后用于满足各种需求 为什么 我希望这个 HTML 是静态的并且独立于角度 例如 如果我更改我的应用程序 例如重构代码 生成的 HTML 应该是相同的 当然 如果背后的逻辑
  • 如何修复 IE 浏览器控件中的内存泄漏?

    我正在尝试在 C Winform 应用程序中嵌入 WebBrowser 控件 这听起来很容易 然而 我发现每次调用 Navigate 方法时 WebBrowser 控件都会占用大量内存 内存永远不会被释放 内存使用量不断增加 网上很多人都有
  • 将geojson标记加载到mapbox中设置自定义图标图像

    我是mapbox 传单的新手 我认为这是一个非常基本的问题 我在过去的两天里一直在努力解决这个问题 尽管我尝试了几种方法 但我无法解决这个问题 我通过 geojson 加载标记 var ma 3 L mapbox featureLayer
  • 检测和响应任何多边形内的球与墙碰撞

    需要编写良好的方法来检测和响应任何多边形内的球与墙的碰撞 例如 我有一个方法可以绘制一个在矩形内飞行的球 ctx beginPath ctx arc x y ballRadius 0 Math PI 2 ctx fillStyle 0095
  • Jasper 子报告未显示

    我有一份主要报告 调用2个不同的子报告两次 每次使用不同的参数 问题是显示不正确 LETTEROFACK TRANSF LTR 根本不来
  • 将数组从 php 发送到 python

    我正在尝试将一个数组从 php 传递到 python 由于某种原因 当我加载 php 页面时 我遇到了麻烦 所以如果人们建议我尝试不同的方法或者如果人们发现一个简单的方法 我将非常感激我在这里失踪了错误 因为我已经尝试这样做几个小时了 Th
  • 新工作表上的 VBA 数据透视表

    我已经录制了一个宏来在 VBA 中创建数据透视表和后续图表 它就像一种魅力 只是完全不是我需要的那样 问题是我希望能够运行代码并让它在尚不存在的工作表上创建一个表 基本上我将通过菜单上的按钮运行它 它应该在新页面上创建表格和图表 无需进一步
  • 从 Access 数据库收集数据

    我想从 Access 数据库的某些表中收集一些数据 我在网上找到了一些解决方案 但我还没有找到填充数据表或数据集并正确获取每个字段的方法 对我来说 获取整个表然后只获取我想要的信息是否更容易 或者我应该在访问数据库中进行大量搜索 每次只获取
  • 调试 PDO mySql 将 NULL 插入数据库而不是空

    我正在尝试使用 PDO 将 NULL 动态插入数据库 表结构 CREATE TABLE IF NOT EXISTS Fixes Id int 11 NOT NULL AUTO INCREMENT COMMENT PK CurrencyId
  • 没有名为 pkg_resources 的模块

    我正在将 Django 应用程序部署到开发服务器 并且在运行时遇到此错误pip install r requirements txt Traceback most recent call last File var www mydir vi
  • 当矩形与另一个矩形重叠时 OpenCV 连接轮廓

    我有以下输入图像 我的目标是绘制红色区域的轮廓 为此 我有以下代码 导入CV2 Read image src cv2 imread images jpg cv2 IMREAD GRAYSCALE Set threshold and maxV