基于颜色python的物体边界框

2023-11-23

我尝试在这张图片中的每个对象上绘制一个边界框,我写了这段代码文档

import cv2 as cv2
import os
import numpy as np


img = cv2.imread('1 (2).png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);
ret,thresh = cv2.threshold(img,127,255,0)
im2,contours,hierarchy = cv2.findContours(thresh, 1, 2)
for item in range(len(contours)):
    cnt = contours[item]
    if len(cnt)>20:
        print(len(cnt))
        M = cv2.moments(cnt)
        cx = int(M['m10']/M['m00'])
        cy = int(M['m01']/M['m00'])
        x,y,w,h = cv2.boundingRect(cnt)
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
        cv2.imshow('image',img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

the result is only one object,
pic1

when i change the value 127 in this line to 200 in this line ret,thresh = cv2.threshold(img,127,255,0) i got different object. pic2

here's the original image
original picture

问题是如何一次检测到所有对象?


该方法相当简单。我们首先转换为 HSV 并仅获取色调通道。

image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
h,_,_ = cv2.split(image_hsv)

接下来,我们找到主色调 - 首先使用以下方法计算每种色调的出现次数numpy.bincount (we flatten色调通道图像使其成为一维):

bins = np.bincount(h.flatten())

然后使用以下命令查找哪些是足够常见的numpy.where:

MIN_PIXEL_CNT_PCT = (1.0/20.0)
peaks = np.where(bins > (h.size * MIN_PIXEL_CNT_PCT))[0]

现在我们已经确定了所有主色调,我们可以重复处理图像以找到与每个主色调相对应的区域:

for i, peak in enumerate(peaks):

我们首先创建一个蒙版,选择该色调的所有像素(cv2.inRange,然后从输入的BGR图像中提取相应的部分(cv2.bitwise_and.

mask = cv2.inRange(h, peak, peak)
blob = cv2.bitwise_and(image, image, mask=mask)

接下来,我们找到轮廓(cv2.findContours该色调的所有连续区域,以便我们可以单独处理每个区域

_, contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

现在,对于每个识别的连续区域

for j, contour in enumerate(contours):

我们确定边界框(cv2.boundingRect,并通过用白色填充轮廓多边形来创建与该轮廓相对应的蒙版(numpy.zeros_like and cv2.drawContours)

bbox = cv2.boundingRect(contour)
contour_mask = np.zeros_like(mask)
cv2.drawContours(contour_mask, contours, j, 255, -1)

然后我们可以额外添加与边界框对应的 ROI

region = blob.copy()[bbox[1]:bbox[1]+bbox[3],bbox[0]:bbox[0]+bbox[2]]
region_mask = contour_mask[bbox[1]:bbox[1]+bbox[3],bbox[0]:bbox[0]+bbox[2]]
region_masked = cv2.bitwise_and(region, region, mask=region_mask)

或者想象一下(cv2.rectangle边界框:

result = cv2.bitwise_and(blob, blob, mask=contour_mask)
top_left, bottom_right = (bbox[0], bbox[1]), (bbox[0]+bbox[2], bbox[1]+bbox[3])
cv2.rectangle(result, top_left, bottom_right, (255, 255, 255), 2)

或者进行任何您想要的其他处理。


完整脚本

import cv2
import numpy as np

# Minimum percentage of pixels of same hue to consider dominant colour
MIN_PIXEL_CNT_PCT = (1.0/20.0)

image = cv2.imread('colourblobs.png')
if image is None:
    print("Failed to load iamge.")
    exit(-1)

image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# We're only interested in the hue
h,_,_ = cv2.split(image_hsv)
# Let's count the number of occurrences of each hue
bins = np.bincount(h.flatten())
# And then find the dominant hues
peaks = np.where(bins > (h.size * MIN_PIXEL_CNT_PCT))[0]

# Now let's find the shape matching each dominant hue
for i, peak in enumerate(peaks):
    # First we create a mask selecting all the pixels of this hue
    mask = cv2.inRange(h, peak, peak)
    # And use it to extract the corresponding part of the original colour image
    blob = cv2.bitwise_and(image, image, mask=mask)

    _, contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    for j, contour in enumerate(contours):
        bbox = cv2.boundingRect(contour)
        # Create a mask for this contour
        contour_mask = np.zeros_like(mask)
        cv2.drawContours(contour_mask, contours, j, 255, -1)

        print "Found hue %d in region %s." % (peak, bbox)
        # Extract and save the area of the contour
        region = blob.copy()[bbox[1]:bbox[1]+bbox[3],bbox[0]:bbox[0]+bbox[2]]
        region_mask = contour_mask[bbox[1]:bbox[1]+bbox[3],bbox[0]:bbox[0]+bbox[2]]
        region_masked = cv2.bitwise_and(region, region, mask=region_mask)
        file_name_section = "colourblobs-%d-hue_%03d-region_%d-section.png" % (i, peak, j)
        cv2.imwrite(file_name_section, region_masked)
        print " * wrote '%s'" % file_name_section

        # Extract the pixels belonging to this contour
        result = cv2.bitwise_and(blob, blob, mask=contour_mask)
        # And draw a bounding box
        top_left, bottom_right = (bbox[0], bbox[1]), (bbox[0]+bbox[2], bbox[1]+bbox[3])
        cv2.rectangle(result, top_left, bottom_right, (255, 255, 255), 2)
        file_name_bbox = "colourblobs-%d-hue_%03d-region_%d-bbox.png" % (i, peak, j)
        cv2.imwrite(file_name_bbox, result)
        print " * wrote '%s'" % file_name_bbox

控制台输出

Found hue 32 in region (186, 184, 189, 122).
 * wrote 'colourblobs-0-hue_032-region_0-section.png'
 * wrote 'colourblobs-0-hue_032-region_0-bbox.png'
Found hue 71 in region (300, 197, 1, 1).
 * wrote 'colourblobs-1-hue_071-region_0-section.png'
 * wrote 'colourblobs-1-hue_071-region_0-bbox.png'
Found hue 71 in region (301, 195, 1, 1).
 * wrote 'colourblobs-1-hue_071-region_1-section.png'
 * wrote 'colourblobs-1-hue_071-region_1-bbox.png'
Found hue 71 in region (319, 190, 1, 1).
 * wrote 'colourblobs-1-hue_071-region_2-section.png'
 * wrote 'colourblobs-1-hue_071-region_2-bbox.png'
Found hue 71 in region (323, 176, 52, 14).
 * wrote 'colourblobs-1-hue_071-region_3-section.png'
 * wrote 'colourblobs-1-hue_071-region_3-bbox.png'
Found hue 71 in region (45, 10, 330, 381).
 * wrote 'colourblobs-1-hue_071-region_4-section.png'
 * wrote 'colourblobs-1-hue_071-region_4-bbox.png'
Found hue 109 in region (0, 0, 375, 500).
 * wrote 'colourblobs-2-hue_109-region_0-section.png'
 * wrote 'colourblobs-2-hue_109-region_0-bbox.png'
Found hue 166 in region (1, 397, 252, 103).
 * wrote 'colourblobs-3-hue_166-region_0-section.png'
 * wrote 'colourblobs-3-hue_166-region_0-bbox.png'

输出图像示例

黄色边界框:

Hue 32 bounding box

黄色提取区域:

Hue 32 section

最大的绿色边界框(还有其他几个小的不相交区域):

Hue 71 largest bounding box

...以及相应的提取区域:

Hue 71 largest section

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

基于颜色python的物体边界框 的相关文章

  • Kivy - 有所有颜色名称的列表吗?

    在 Kivy 中 小部件 color属性允许输入其值作为字符串颜色名称 也 例如在 kv file Label color red 是否有所有可能的颜色名称的列表 就在这里 来自Kivy 的文档 https kivy org doc sta
  • pyspark 数据框中的自定义排序

    是否有推荐的方法在 pyspark 中实现分类数据的自定义排序 我理想地寻找 pandas 分类数据类型提供的功能 因此 给定一个数据集Speed列 可能的选项是 Super Fast Fast Medium Slow 我想实现适合上下文的
  • 工作日重新订购 Pandas 系列

    使用 Pandas 我提取了一个 CSV 文件 然后创建了一系列数据来找出一周中哪几天崩溃最多 crashes by day bc DAY OF WEEK value counts 然后我将其绘制出来 但当然它按照与该系列相同的排名顺序绘制
  • 搜索多个字段

    我想我没有正确理解 django haystack 我有一个包含多个字段的数据模型 我希望搜索其中两个字段 class UserProfile models Model user models ForeignKey User unique
  • 一段时间后终止线程的最 Pythonic 方法

    我想在线程中运行一个进程 它正在迭代一个大型数据库表 当线程运行时 我只想让程序等待 如果该线程花费的时间超过 30 秒 我想终止该线程并执行其他操作 通过终止线程 我的意思是我希望它停止活动并优雅地释放资源 我认为最好的方法是通过Thre
  • 结构差异 sudo() run('sudo 命令')

    我想知道函数之间有什么区别sudo 和函数run sudo u user smth 文档上有 sudo 在所有运行方式上都是相同的 除了它总是换行 调用 sudo 程序中的给定命令以提供超级用户 特权 但有几次 sudo cmd 提示我输入
  • 如果在等待“read -s”时中断,在子进程中运行 bash 会破坏 tty 的标准输出吗?

    正如 Bakuriu 在评论中指出的那样 这基本上与BASH 输入期间按 Ctrl C 会中断当前终端 https stackoverflow com questions 31808863 bash ctrlc during input b
  • Python新式类和__subclasses__函数

    有人可以向我解释为什么这有效 在 Python 2 5 中 class Foo object pass class Bar Foo pass print Foo subclasses 但这不是 class Foo pass class Ba
  • 在 Windows 上使用 apache mod_wsgi 运行 Flask 应用程序时导入冲突

    我允许您询问我在 Windows 上使用您的 mod wsgi portage 托管 Flask 应用程序时遇到的问题 我有两个烧瓶应用程序 由于导入冲突 只有一个可以同时存在 IE 如果请求申请 1 我有回复 然后 如果我请求应用程序 2
  • pytest:同一接口的不同实现的可重用测试

    想象一下我已经实现了一个名为的实用程序 可能是一个类 Bar在一个模块中foo 并为其编写了以下测试 测试 foo py from foo import Bar as Implementation from pytest import ma
  • Tensorflow 与 Keras 的兼容性

    我正在使用 Python 3 6 和 Tensorflow 2 0 并且有一些 Keras 代码 import keras from keras models import Sequential from keras layers impo
  • 通过索引访问Python字典的元素

    考虑一个像这样的字典 mydict Apple American 16 Mexican 10 Chinese 5 Grapes Arabian 25 Indian 20 例如 我如何访问该字典的特定元素 例如 我想在对 Apple 的第一个
  • 返回表示每组内最大值的索引的一系列数字位置

    考虑一下这个系列 np random seed 3 1415 s pd Series np random rand 100 pd MultiIndex from product list ABDCE list abcde One Two T
  • 在 keras 中保存和加载权重

    我试图从我训练过的模型中保存和加载权重 我用来保存模型的代码是 TensorBoard log dir output model fit generator image a b gen batch size steps per epoch
  • Mac OSX 10.6 上的 Python mysqldb 不工作

    我正在使用 Python 2 7 并尝试让 Django 项目在 MySQL 后端运行 我已经下载了 mysqldb 并按照此处的指南进行操作 http cd34 com blog programming python mysql pyth
  • Anaconda 无法导入 ssl 但 Python 可以

    Anaconda 3 Jupyter笔记本无法导入ssl 但使用Atom终端导入ssl没有问题 我尝试在 Jupyter 笔记本中导入 ssl 但出现以下错误 C ProgramData Anaconda3 lib ssl py in
  • Elasticsearch 通过搜索返回拼音标记

    我用语音分析插件 https www elastic co guide en elasticsearch plugins current analysis phonetic html由于语音转换 从弹性搜索中进行一些字符串匹配 我的问题是
  • 深度估计的准确性 - 立体视觉

    我正在研究立体视觉 我对这个问题的深度估计的准确性感兴趣 这取决于几个因素 例如 适当的立体校准 旋转 平移和失真提取 图像分辨率 相机和镜头质量 失真越小 色彩捕捉正确 两个图像之间的匹配特征 假设我们没有低成本的相机和镜头 没有廉价的网
  • Python SSL X509:KEY_VALUES_MISMATCH

    Python HTTPS server from http server import HTTPServer SimpleHTTPRequestHandler import ssl https stackoverflow com a 408
  • 在 Django 查询中使用 .extra(select={...}) 引入的值上使用 .aggregate() ?

    我正在尝试计算玩家每周玩游戏的次数 如下所示 player game objects extra select week WEEK games game date aggregate count Count week 但姜戈抱怨说 Fiel

随机推荐

  • CUDA 内核的即时 (jit) 编译可能吗?

    CUDA 是否支持 CUDA 内核的 JIT 编译 我知道 OpenCL 提供了这个功能 我有一些变量在运行时不会更改 即仅取决于输入文件 因此我想在内核编译时 即在运行时 使用宏定义这些值 如果我在编译时手动定义这些值 我的寄存器使用量将
  • 将遗留代码库从 cvs 转移到分布式存储库(例如 git 或 Mercurial)。初始存储库设计所需的建议[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 简介和背景 我们正在更改源代码控制系统 目前正在评估 git 和 Mercurial 总代码库大约有 600 万行代码 所以不算大 也不算小 首先让我简单介绍一下当前存储库设计的外观 我们
  • npm 错误! EPERM:不允许操作,scandir

    我们的部署过程使用 Jenkins 但有时我们的构建会失败 并显示以下内容 我们正在使用npm版本 6 7 0 任何帮助将不胜感激 我认为问题是另一个进程正在利用该文件夹所以它被锁定了 也许是以前的版本 我会尝试以下方法来解决您的问题 尝试
  • 如何在 HoneyComb 中获取可用屏幕高度减去导航栏?

    有没有办法测量底部导航栏的高度 以像素为单位 顺便说一句 对于像我这样偶然发现这个问题并寻找实际数字的人来说 它是 48 像素 至少在摩托罗拉 Xoom 上 这是基于此 诚然是粗略的 测试活动的调试输出 结合没有标题栏的主题 例如 andr
  • 如何用组件替换字符串(vue)

    我有包含以下内容的字符串 我用数组值替换 现在我想将它们与组件一起使用 我创建了该组件并且它可以工作 但我不知道如何在字符串中使用它 我不想手动包装它们 因为我不知道字符串将如何 它可以有几个 如果有 2 选项将有 2 个子数组 更好的方法
  • 标头中定义的 C++ 类方法是否始终内联?

    Edit 我已经恢复了原始标题 但我真正应该问的是 C 链接器如何处理已在多个对象文件中定义的类方法 假设我在标头中定义了一个 C 类 如下所示 class Klass int Obnoxiously Large Method many t
  • 增强现实框架[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我计划为 Android 手机开发一个增强现实应用程序 有谁知道是否有任何现有的增强现 实框架可用于此类应用程序 对于想法 您可以查看以下内容 现有应用程序及其 API Androi
  • 如何在conf.py中为sphinx设置自定义配置值? (例如,对于 sphinx.ext.ifconfig)

    经过更多测试和研究 我将原来的问题分成了两个 我在 conf py 中定义了自己的配置值 并编写了一个最小扩展名以使其在第一个文件中可见 在conf py中 sys path insert 0 os path abspath extensi
  • 如何使用 PHP Serialize() 和 Unserialize()

    我的问题非常基本 我没有找到任何例子来满足我的需求到底是什么serialize and unserialize 在php中的意思是 他们只是给出了一个例子 序列化一个数组并以无法解释的格式显示输出 通过他们的行话很难理解基本概念 EDIT
  • 用于识别主要基类的类型特征

    如果我有一个 Base 类 至少有一个虚函数 以及一个从该类单独继承的 Derived 类 那么 uintptr t derived uintptr t static cast
  • 使用 asp 页面 TagHelper 时链接不呈现

    我有一个页面在使用时不呈现 HTML 中的链接asp page标签助手 我以前见过这个 但这是由于拼写错误或页面不存在造成的 在下面的 Layout 中的两个链接中 用户渲染为http localhost ReportGroups Admi
  • Facebook SDK:页面选项卡应用程序返回在移动 Facebook 应用程序中找不到

    我有一个 Facebook 页面选项卡应用程序 使用时间轴 它在桌面版 Facebook 中运行良好 但当在 Facebook 应用程序中单击其 Wall Post 时 它会返回 找不到您请求的页面 并转发到无法访问的链接 https m
  • 如何禁用单行的操作列项?

    考虑这个 JSON 示例 id 1 editable true id 2 editable false 这些记录将被加载到商店中 然后显示在网格面板内 该网格有一个用于编辑目的的操作列项目 我正在寻找一种方法 仅禁用第二行的 编辑 按钮 而
  • javascript 使用 setTimeout() 超时/睡眠

    如何设置 2 秒超时来等待页面控件填充 我想使用 javascript 我已尝试以下但无济于事 setTimeout function 2000 setTimeout 2000 有谁能提供指点吗 setTimeout function pu
  • 在 PHP 中生成 OAuth 1 签名

    我正在尝试连接到LivePerson 参与历史 API我遇到了一个我认为与生成的签名有关的问题 首先 API 已经提供了必要的消费者密钥 消费者秘密 访问令牌和令牌秘密 所以我不必经历检索这些的过程 为了访问他们的 API 我只需要提供 a
  • 实体类名转换为带下划线的SQL表名

    我定义了以下实体 Entity Table name EmailTemplate public class EmailTemplate 尽管有表格注释 我还是收到了java sql SQLException Invalid object n
  • 如果镜像输入数据,XSL 文档会是什么样子?

    XSL 的典型用法是 XML1 xml gt transformed using xsl gt XML2 xml 如果我想简单地镜像输入数据 XSL 文档是什么样子的 ex XML1 xml gt transformed using xsl
  • 如何配置Clion编译gtkmm项目

    我从 GTK 复制了一个示例项目 include
  • hyperledger Fabric - 如何删除对等点上的链码?

    我安装了两个chaincode在对等点上 basic network master bin peer chaincode list installed 2018 06 25 10 37 44 825 CST msp GetLocalMSP
  • 基于颜色python的物体边界框

    我尝试在这张图片中的每个对象上绘制一个边界框 我写了这段代码文档 import cv2 as cv2 import os import numpy as np img cv2 imread 1 2 png img cv2 cvtColor