cv2.drawContours不会绘制填充轮廓

2023-11-21

我正在尝试使用显示填充轮廓cv2.drawContoursOpenCV 中的函数。我已经从边缘图像中开发了一个轮廓列表,该边缘图像源自Canny检测,并找到轮廓RETR_EXTERNAL为层次结构定义启用。然而我遇到了一个问题,尽管使用-1标志在cv2.drawContours命令指示填充轮廓,仅显示轮廓本身(即边缘)。例如:

mask = np.zeros(rawimg.shape, np.uint8)
cv2.drawContours(mask, contours[246], -1, (0,255,255), -1)

结果仅显示轮廓246的轮廓。由于我只是检索外部轮廓,所以我认为我并没有看到每个边缘处发现的内部轮廓和外部轮廓之间的差异,所以我有点困惑为什么它显示轮廓,但没有填充为这-1flag 会建议它应该。


EDIT:完整的代码如下。问题在于该行: cv2.drawContours(掩码, cnt, 2, (0,255,255), -1) 虽然这是按照 Dan 建议的方式格式化的,但它会产生以下图像:

image linked. cnt is a single contour, so this makes sense that it would be referring to a single point in the contour. When the line is changed to:

cv2.drawContours(mask, cnt, -1, (0,255,255), -1)

轮廓像以前一样打印,但是轮廓仍然没有填充,因为命令末尾的 -1 标志表明它应该是这样。

测试图像:

is uploaded here

import os
import cv2
import numpy as np
from matplotlib import pyplot as plt
import copy as cp

path = 'C:\\Users\\...deleted...\\Desktop\\testimage6.jpg'



#Determine largest contour in the image
def maxContour(contours):
    cnt_list = np.zeros(len(contours))
    for i in range(0,len(contours)):
        cnt_list[i] = cv2.contourArea(contours[i])

    max_value = np.amax(cnt_list)
    max_index = np.argmax(cnt_list)
    cnt = contours[max_index]

    return cnt, max_index


if os.path.isfile(path):
    # Import the raw image to a working location and save to an isolated     variable
    # Import the raw image to a working location and save to an isolated     variable
    img = cv2.imread(path)
    rawimg = cv2.imread(path)
    saveimg = cv2.imread(path)
    imgray = cv2.cvtColor(saveimg, cv2.COLOR_BGR2GRAY)
    saveimgray = cp.copy(imgray)

    f1 = plt.figure(1)
    f1.set_size_inches(8,10)
    plt.title('Original Image')
    plt.xticks([]), plt.yticks([])
    plt.imshow(rawimg, cmap='gray')
    plt.savefig('output1.jpg', dpi=300)
    cv2.imshow('Raw Image',rawimg)
    cv2.waitKey(0)
    cv2.destroyWindow('Raw Image')

    # Impose an opening function as a filter
    kernel = np.ones((3,3),np.uint8)    
    opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

    f2 = plt.figure(2)
    f1.set_size_inches(8,10)
    plt.title('Opened Image')
    plt.xticks([]), plt.yticks([])
    plt.imshow(opening, cmap='gray')
    plt.savefig('output2.jpg', dpi=300)
    cv2.imshow('Opened Image', opening)
    cv2.waitKey(0)
    cv2.destroyWindow('Opened Image')


    #Extract the edges from the filtered image
    edges = cv2.Canny(opening,10,100)
    cv2.imshow('Edges', edges)
    cv2.waitKey(0)
    cv2.destroyWindow('Edges')
    f3=plt.figure(3)
    f3.set_size_inches(16,8)
    plt.title('Edge Image')
    plt.xticks([]), plt.yticks([])
    plt.imshow(edges, cmap='gray')
    plt.savefig('output3.jpg', dpi=300)


    #Detect contours in the edge image
    image, contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    cv2.drawContours(img, contours, -1, (0,255,255), 2)
    cv2.imshow('Contours Image', img)
    cv2.waitKey(0)
    cv2.destroyWindow('Contours Image')
    f4=plt.figure(4)
    f4.set_size_inches(16,8)
    plt.title('Contour Image')
    plt.xticks([]), plt.yticks([])
    plt.imshow(img)
    plt.savefig('output2.jpg', dpi=300)

    #Find maximum area contour    
    cnt, max_index = maxContour(contours)
    print(max_index)


    # Calculate contour-based statistics
    # TBD


    #Test of removing max contour
    #grayimg = cv2.cvtColor(rawimg, cv2.COLOR_BGR2GRAY)
    mask = np.zeros(rawimg.shape, np.uint8)
    cv2.drawContours(mask, cnt, 2, (0,255,255), -1) 
    #ret, mask = cv2.threshold(grayimg, 10, 255, cv2.THRESH_BINARY)
    mask_inv = cv2.bitwise_not(mask)
    cv2.imshow('Mask Image', mask)
    cv2.waitKey(0)
    cv2.destroyWindow('Mask Image')
    cv2.imshow('Mask Image', mask_inv)
    cv2.waitKey(0)
    cv2.destroyWindow('Mask Image')

    #Fit ellipse to contour and calculate ellipse statistics
    (x,y), (w,h), angle = cv2.fitEllipse(cnt)    
    rect = cv2.minAreaRect(cnt)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    x = np.int0(x)
    y = np.int0(y)
    w = np.int0(0.5*w)
    h = np.int0(0.5*h)


    #output2 = cv2.ellipse(img, center, dim, angle, 0, 360, (255,0,0), 12)
    output2 = cv2.ellipse(img, (x,y), (w,h), angle, 0, 360, (255,0,0), 2)
    output3 = cv2.drawContours(output2, [box], 0, (0,255,0), 2)
    cv2.imshow('Ellipse Image',output2)
    cv2.waitKey(0)
    cv2.destroyWindow('Ellipse Image')



else:
    print('file does not exist')`

The 功能drawContours需要一个list轮廓作为输入. Try:

cv2.drawContours(
    image=mask,
    contours=[cnt],
    contourIdx=-1,
    color=(0,255,255),
    thickness=cv2.FILLED)

代替:cv2.drawContours(mask, cnt, -1, (0,255,255), -1).

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

cv2.drawContours不会绘制填充轮廓 的相关文章

  • Django:模拟模型上的字段

    如何将模拟对象分配给该模型上的用户字段 无论如何都要绕过 SomeModel user 必须是 User 实例 检查吗 class SomeModel models Model user models ForeignKey User 我不会
  • Python 中的字节数组

    如何在 Python 中表示字节数组 如 Java 中的 byte 我需要用 gevent 通过网络发送它 byte key 0x13 0x00 0x00 0x00 0x08 0x00 在Python 3中 我们使用bytes对象 也称为s
  • 即使页面未完全加载,我们也可以使用 Selenium 获取页面源吗(TimeoutException: Message: timeout)?

    即使遇到 TimeoutException Message timeout 也能获取页面源码吗 当我调用 driver page source 时 有时无法加载整页 但我只需要它的部分信息 尚未确定 所以我只想在任何情况下保存页面 是否可以
  • Kivy - 文本换行工作错误

    我正在尝试在 Kivy 1 8 0 应用程序中换行文本 当没有太多文字时 一切正常 但如果文本很长并且窗口不是很大 它只是剪切文本 这是示例代码 vbox BoxLayout orientation vertical size hint y
  • Python 2.7 将比特币私钥转换为 WIF 私钥

    作为一名编码新手 我刚刚完成了教程 教程是这样的 https www youtube com watch v tX XokHf nI https www youtube com watch v tX XokHf nI 我想用 1 个易于阅读
  • for 循环如何评估其参数

    我的问题很简单 Does a for循环评估它每次使用的参数 Such as for i in range 300 python 是否会为此循环的每次迭代创建一个包含 300 个项目的列表 如果是的话 这是避免这种情况的方法吗 lst ra
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • 使用 Django Rest 保存 Base64ImageField 类型会将其保存为原始图像。如何将其转换为普通图像

    我的模型中有 5 个图像字段 imageS imageS imageS imageS 和 imageE 我正在尝试按以下方式保存图像 图像的类型Base64ImageField images imageA imageB imageC ima
  • 更新 Sqlalchemy 中的多个列

    我有一个在 Flask 上运行的应用程序 并使用 sqlalchemy 与数据库交互 我想用用户指定的值更新表的列 我正在使用的查询是 def update table value1 value2 value3 query update T
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • 如何使用 Django 项目设置 SQLite?

    我已阅读 Django 文档 仅供参考 https docs djangoproject com en 1 3 intro tutorial01 https docs djangoproject com en 1 3 intro tutor
  • 将文本注释到轴并对齐为圆

    我正在尝试在轴上绘制文本并将该文本与圆对齐 更准确地说 有一些具有不同坐标 x y 的点位于该圆内 并使用以下命令创建 ax scatter x y s 100 我想用圆圈连接并标记每个点 Cnameb 文本的坐标由 xp yp 定义 因此
  • Python 类型安全吗?

    根据维基百科 https en wikipedia org wiki Type system Type safety and memory safety 如果一种语言不允许违反类型系统规则的操作或转换 计算机科学家就认为该语言是 类型安全的
  • 在 Sphinx 中,有没有办法在声明参数的同时记录参数?

    我更喜欢在声明参数的同一行记录每个参数 根据需要 以便应用D R Y http en wikipedia org wiki Don t repeat yourself 如果我有这样的代码 def foo flab nickers a ser
  • 如何将回溯/sys.exc_info() 值保存在变量中?

    我想将错误名称和回溯详细信息保存到变量中 这是我的尝试 import sys try try print x except Exception ex raise NameError except Exception er print 0 s
  • 处理大文件的最快方法?

    我有多个 3 GB 制表符分隔文件 每个文件中有 2000 万行 所有行都必须独立处理 任何两行之间没有关系 我的问题是 什么会更快 逐行阅读 with open as infile for line in infile 将文件分块读入内存
  • Python 通过从现有 csv 文件中过滤选定的行来写入新的 csv 文件

    只是一个问题 我试图将 csv 文件中的选定行写入新的 csv 文件 但出现错误 我试图读取的 test csv 文件是这样的 两列 2013 9 1 2013 10 2 2013 11 3 2013 12 4 2014 1 5 2014
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • 使用 urllib 编码时保持 url 参数有序

    我正在尝试用 python 模拟 get 请求 我有一个参数字典 并使用 urllib urlencode 对它们进行 urlencode 我注意到虽然字典的形式是 k1 v1 k2 v2 k3 v3 urlencoding 后参数的顺序切
  • 缓存 Flask-登录 user_loader

    我有这个 login manager user loader def load user id None return User query get id 在我引入 Flask Principal 之前它运行得很好 identity loa

随机推荐

  • Vagrant 命令停止工作:在 WIndows 上找不到命令

    我一直在尝试从 Windows 上的 Homestead 文件夹中启动 vagrant 但一直显示 bash 流浪汉 找不到命令 我认为这是 Windows 上命令配置的问题 请问 对此可以采取什么措施 提前致谢 好的 我遇到了系统环境变量
  • r 中的 Shell 命令不适用于目录名称中的空格

    我正在尝试使用 shell 命令从 R 运行简单的外部应用程序 shell C Program Files SomeApp bin Release SomeApp exe C Users SomeUser R Scripts RProjec
  • 防御性编程[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在编写代码时 您是否有意识地进行防御性编程 以确保较高的程序质量并避免您的代码被恶意利用的可能性 例如通过缓冲区溢出漏洞或代码注入 您始终应用于代码的 最低 质量水平是什么 在我的工作中
  • 以编程方式捕获 LogCat 或将其导出到文件?

    我想过滤一个logcat String myCommand logcat f sdcard output txt no filters keep writing myCommand logcat d f sdcard output txt
  • iOS 6 中的 viewDidLoad 调用过一次吗?

    小心 这个问题与最近的弃用viewDidUnload 我见过 很棒 且合乎逻辑的答案围绕这个主题 但显然事实证明他们错了 请谨慎行事 正如您所看到的 这个主题非常令人困惑 来自苹果的文档 然而系统会自动释放这些昂贵的资源 当视图未附加到窗口
  • 输入尺寸与宽度

  • 定义条件路由

    我一直在寻找类似的东西 但没有运气 我想构建一个对相同网址使用不同控制器的应用程序 基本思想是 如果用户以管理员身份登录 他使用管理员控制器 如果用户只是用户 他使用用户控制器 这只是一个例子 基本上我想要一个函数来决定控制器路由采用什么
  • 是否有用于字符串自然排序的内置函数?

    我有一个字符串列表 我想对其执行自然字母排序 例如 以下列表是自然排序的 我想要的 elm0 elm1 Elm2 elm9 elm10 Elm11 Elm12 elm13 这是上面列表的 排序 版本 我使用的sorted Elm11 Elm
  • 我在 jQuery 中看到过这个 它有什么作用
  • iPhone X 上的 TableView 和 home 指示器

    我正在使用两者UITableViewController and UITableView在一个项目中 An UITableView in an UITableViewController覆盖 iPhone X 上的主页指示器 但是一个UIT
  • VIM:在 python 模式下使用 python3 解释器

    我最近切换到 vim 并将其配置为使用 Python 编程this教程 之前 我已经确保 vim 支持 python3 vim version 显示 python dyn 和 python3 dyn 使用this文章 但是当执行文件时pyt
  • 如何通过指定alpha混合量来计算RGB颜色?

    我正在编写一个颜色选择器 它可以从您指向屏幕上的任何位置获取像素 RGB 值 我还希望可以选择指定我选择的颜色已经具有 alpha 值 我只是想知道如何计算结果颜色 例如 生成的像素颜色为 240 247 249 但我知道原始颜色具有 10
  • 滚动角载荷数据 [For 循环]

    我正在显示与搜索词相关的数据 该数据一次性显示所有结果 我想要做的是一次显示 6 个数据 然后将剩余的数据加载到滚动条上 li category name li 如何滚动显示数据 你可以听window scroll当滚动到达页面底部时发生事
  • 从 Jenkinsfile 中的函数调用阶段

    我的 Jenkinsfile 中有 def foo 1 2 3 def parallelStagesFromMap foo collectEntries Build it generateStage it def generateStage
  • 如何正确模拟类的私有成员

    我正在尝试为依赖于另一个私有方法的方法编写一些单元测试 如下例所示 def is member of self group name members self get group members group name 我想模拟的私有方法是
  • 使用自定义证书文件在代理后面进行 Pip

    pip 的代理设置可以通过 proxy命令行选项或全局配置文件中 即 HOME config pip pip conf在Unix中 HOME Library Application Support pip pip conf在 OS X 中
  • 背景颜色十六进制到 JavaScript 变量

    我对 JavaScript 和 jQuery 有点陌生 现在我面临一个问题 我需要将一些数据发布到 PHP 其中一位数据需要是 div X 的背景颜色十六进制 jQuery 具有 css background color 函数 使用它我可以
  • 嵌套 ng-bootstrap 选项卡 (Angular 2)

    我正在尝试嵌套 ng bootstrap 选项卡小部件 但嵌套选项卡的内容未正确显示 当我单击嵌套选项卡时 内容本身就会消失 最小演示 我究竟做错了什么 这是查看代码
  • 在 WPF 中实现多停靠窗口系统(如 Blend、Visual Studio)

    您将如何实现如 Expression Blend 中所示的停靠工具箱窗口系统 您可以通过多种方式相互停靠工具箱窗口 如选项卡或浮动顶级窗口一样重叠 我的系统的行为应该与 Expression Blend 中的行为几乎相同 另外 我在拖动时获
  • cv2.drawContours不会绘制填充轮廓

    我正在尝试使用显示填充轮廓cv2 drawContoursOpenCV 中的函数 我已经从边缘图像中开发了一个轮廓列表 该边缘图像源自Canny检测 并找到轮廓RETR EXTERNAL为层次结构定义启用 然而我遇到了一个问题 尽管使用 1