【问题标题】:How to get coordinates of white dots on black background如何获取黑色背景上白点的坐标
【发布时间】:2015-06-18 05:49:20
【问题描述】:

一些背景:

我正在构建一个AR 的艺术装置,并且需要在一个人穿过一个房间时对其进行跟踪。

为此,我构建了一个头件,该头件具有多个红外灯(带有扩散器)和一个摄像头(一个 USB 网络摄像头),该摄像头具有滤光片以去除图像中的大部分/所有可见光,以及对图像进行了一些调整,基本上让我在黑色背景上留下了白点。

以捕捉房间边界的方式设置网络摄像头非常容易,但我不确定如何处理黑白图像以获得 x,y 坐标每个点。

示例图像输出:(这是一个模型,因为我现在没有一个模型,并且请记住,数据将来自有效的视频)

我正在使用的工具

  • NodeJS 处理
  • 用于图像捕捉的罗技网络摄像头
  • 用于视觉效果的 Google Cardboard
  • 聚苯乙烯泡沫塑料球中的红外 LED 可提供良好的漫射光点

有什么想法吗?

【问题讨论】:

  • 你的图片怎么样?
  • 添加了一个示例图像(它是一个模型,但我很快会用真实的图像替换它)

标签: node.js image-processing webcam-capture


【解决方案1】:

我可以想到三种使用 ImageMagick 的方法来做到这一点,它具有 node 绑定,并且安装在大多数 Linux 发行版上,并且可用于 OSX 和 Windows。

首先,在命令行中输入以下内容:

identify -precision 5 -define identify:locate=maximum -define identify:limit=3 image.png
Channel maximum locations:
Gray: 65535 (1) 146,164 147,164 148,164

这表明最亮的三个像素是从左上角向下 146 像素,从左上角向下 164 像素,以及它旁边的两个在其右侧。

或者,如果您对点的面积和/或质心感兴趣,您可以使用 ImageMagick 进行连通分量分析,如下所示:

convert image.png                               \
    -colorspace gray -threshold 10%             \
    -define connected-components:verbose=true   \
    -connected-components 8 output.png

Objects (id: bounding-box centroid area mean-color):
0: 818x502+0+0 408.6,250.5 410539 srgb(0,0,0)
1: 11x11+143+164 148.0,169.0 97 srgb(255,255,255)

这向您显示(在输出的最后一行),白色斑点是 11 像素 x 11 像素,位于图像左边缘 143 像素和顶部下方 164 像素处。它的质心为 148,169,面积为 97 像素,颜色为白色。

找到的第一个对象(在输出的倒数第二行)是整个图像,您可以忽略它,因为它的颜色是黑色,即 rgb(0,0,0)。

我也可以稍微解释一下参数...我转换为灰度是因为 Coonected Component Analysis 传统上在黑白图像中寻找黑色背景上的白色对象。然后我设置阈值以获得纯白色和纯黑色 - 例如,您可能需要在真实系统上使用中值滤波器来消除噪声-median 3verbose=true 意味着该命令应该打印它找到的所有 blob 的列表,8 意味着将 8 连接的像素视为同一个 blob 的一部分,即一个像素在其 NE 接触另一个像素、SE、SW 或 NW 角被视为同一个 blob 的一部分 - 如果将其设置为 4,则像素必须直接位于彼此旁边或上方/下方才能被视为邻居。

如果你想“装箱”它找到的区域,你可以这样做:

convert image.png -stroke red -fill none -strokewidth 2 -draw "rectangle 143,164 154,175" output.png

第三种方法速度较慢,它涉及将图像转换为文本,然后搜索单词“white”。所以。让我们从简单的开始,只需将图像转换为如下所示的文本:

convert image.png -threshold 50% txt:
# ImageMagick pixel enumeration: 818,502,255,srgb
0,0: (0,0,0)  #000000  black
1,0: (0,0,0)  #000000  black
2,0: (0,0,0)  #000000  black
3,0: (0,0,0)  #000000  black
...
... 410,000 lines later
...
813,501: (0,0,0)  #000000  black
814,501: (0,0,0)  #000000  black
815,501: (0,0,0)  #000000  black
816,501: (0,0,0)  #000000  black
817,501: (0,0,0)  #000000  black

现在,让我们对其进行优化,只查找白色像素(在 Windows 上,您将使用 FINDSTR 而不是 grep):

convert image.png -threshold 50% txt: | grep white
146,164: (255,255,255)  #FFFFFF  white
147,164: (255,255,255)  #FFFFFF  white
148,164: (255,255,255)  #FFFFFF  white
149,164: (255,255,255)  #FFFFFF  white
150,164: (255,255,255)  #FFFFFF  white
145,165: (255,255,255)  #FFFFFF  white
146,165: (255,255,255)  #FFFFFF  white
147,165: (255,255,255)  #FFFFFF  white
148,165: (255,255,255)  #FFFFFF  white
149,165: (255,255,255)  #FFFFFF  white
150,165: (255,255,255)  #FFFFFF  white
151,165: (255,255,255)  #FFFFFF  white
144,166: (255,255,255)  #FFFFFF  white
145,166: (255,255,255)  #FFFFFF  white
146,166: (255,255,255)  #FFFFFF  white
147,166: (255,255,255)  #FFFFFF  white
148,166: (255,255,255)  #FFFFFF  white
149,166: (255,255,255)  #FFFFFF  white
150,166: (255,255,255)  #FFFFFF  white
151,166: (255,255,255)  #FFFFFF  white
152,166: (255,255,255)  #FFFFFF  white
143,167: (255,255,255)  #FFFFFF  white
144,167: (255,255,255)  #FFFFFF  white
145,167: (255,255,255)  #FFFFFF  white
146,167: (255,255,255)  #FFFFFF  white
147,167: (255,255,255)  #FFFFFF  white
148,167: (255,255,255)  #FFFFFF  white
149,167: (255,255,255)  #FFFFFF  white
150,167: (255,255,255)  #FFFFFF  white
151,167: (255,255,255)  #FFFFFF  white
152,167: (255,255,255)  #FFFFFF  white
153,167: (255,255,255)  #FFFFFF  white
143,168: (255,255,255)  #FFFFFF  white
144,168: (255,255,255)  #FFFFFF  white
145,168: (255,255,255)  #FFFFFF  white
146,168: (255,255,255)  #FFFFFF  white
147,168: (255,255,255)  #FFFFFF  white
148,168: (255,255,255)  #FFFFFF  white
149,168: (255,255,255)  #FFFFFF  white
150,168: (255,255,255)  #FFFFFF  white
151,168: (255,255,255)  #FFFFFF  white
152,168: (255,255,255)  #FFFFFF  white
153,168: (255,255,255)  #FFFFFF  white
143,169: (255,255,255)  #FFFFFF  white
144,169: (255,255,255)  #FFFFFF  white
145,169: (255,255,255)  #FFFFFF  white
146,169: (255,255,255)  #FFFFFF  white
147,169: (255,255,255)  #FFFFFF  white
148,169: (255,255,255)  #FFFFFF  white
149,169: (255,255,255)  #FFFFFF  white
150,169: (255,255,255)  #FFFFFF  white
151,169: (255,255,255)  #FFFFFF  white
152,169: (255,255,255)  #FFFFFF  white
153,169: (255,255,255)  #FFFFFF  white
143,170: (255,255,255)  #FFFFFF  white
144,170: (255,255,255)  #FFFFFF  white
145,170: (255,255,255)  #FFFFFF  white
146,170: (255,255,255)  #FFFFFF  white
147,170: (255,255,255)  #FFFFFF  white
148,170: (255,255,255)  #FFFFFF  white
149,170: (255,255,255)  #FFFFFF  white
150,170: (255,255,255)  #FFFFFF  white
151,170: (255,255,255)  #FFFFFF  white
152,170: (255,255,255)  #FFFFFF  white
153,170: (255,255,255)  #FFFFFF  white
143,171: (255,255,255)  #FFFFFF  white
144,171: (255,255,255)  #FFFFFF  white
145,171: (255,255,255)  #FFFFFF  white
146,171: (255,255,255)  #FFFFFF  white
147,171: (255,255,255)  #FFFFFF  white
148,171: (255,255,255)  #FFFFFF  white
149,171: (255,255,255)  #FFFFFF  white
150,171: (255,255,255)  #FFFFFF  white
151,171: (255,255,255)  #FFFFFF  white
152,171: (255,255,255)  #FFFFFF  white
153,171: (255,255,255)  #FFFFFF  white
144,172: (255,255,255)  #FFFFFF  white
145,172: (255,255,255)  #FFFFFF  white
146,172: (255,255,255)  #FFFFFF  white
147,172: (255,255,255)  #FFFFFF  white
148,172: (255,255,255)  #FFFFFF  white
149,172: (255,255,255)  #FFFFFF  white
150,172: (255,255,255)  #FFFFFF  white
151,172: (255,255,255)  #FFFFFF  white
152,172: (255,255,255)  #FFFFFF  white
145,173: (255,255,255)  #FFFFFF  white
146,173: (255,255,255)  #FFFFFF  white
147,173: (255,255,255)  #FFFFFF  white
148,173: (255,255,255)  #FFFFFF  white
149,173: (255,255,255)  #FFFFFF  white
150,173: (255,255,255)  #FFFFFF  white
151,173: (255,255,255)  #FFFFFF  white
146,174: (255,255,255)  #FFFFFF  white
147,174: (255,255,255)  #FFFFFF  white
148,174: (255,255,255)  #FFFFFF  white
149,174: (255,255,255)  #FFFFFF  white
150,174: (255,255,255)  #FFFFFF  white

关于node 版本,我真的不太擅长node,但我可以指出我的答案here,它通过node 执行另一个ImageMagick 过程,希望你能适应它,如果你尝试上面的命令行,发现它对你很有效,你想使用 ImageMagick。

【讨论】:

  • 抱歉,选择您的答案需要一段时间
  • 不急 :-) 很高兴为您服务。
  • @apratimankur 请只问一个普通的、新鲜的问题(这些都是免费的),而不是把它附加到一个只有我会看到它的 5 年前的答案上。谢谢。
【解决方案2】:

许多(大多数?)图像处理库(例如 OpenCV)都有一个连接的组件提取模块。给定您示例中的二进制图像,您将获得所有连接图像区域的列表。您可以计算这些的质心以获得点的中心。

【讨论】:

    【解决方案3】:

    一种方法是使用“Hough Transform”。霍夫变换基本上将图像转换到另一个坐标系,您可以在其中“轻松”检测圆形。

    我在另一个问题中找到了一个 nodejs-example。我不确定它是否对他们成功:hough transform - javascript - node.js

    您还可以遍历图像的每个像素并检查它是否是白色的,如果是白色的,则找到所有它的白色邻居并将它们删除。计算它们的平均 x-y 坐标,瞧,你得到了你的点的坐标。如果您没有太多噪音,这可能会很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-16
      • 2019-12-13
      • 1970-01-01
      • 2017-04-23
      • 2013-09-18
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      相关资源
      最近更新 更多