如何获得黑色背景上的白色点的坐标

一些背景:

我正在build造一个AR艺术装置,并且需要跟踪一个人在房间里的移动。

要做到这一点,我已经build立了一个头部有几个红外灯(与扩散器),并有一个摄像头(一个USB摄像头),有一个光学filter,从图像中删除大部分/所有可见光,以及一些调整基本上留给我在黑色背景上的白点的图像。

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

示例图像输出:(这是一个模拟,因为我这秒钟没有一个模型,并且还要记住,数据将来自有效的video) 在这里输入图像说明

我正在使用的工具

  • NodeJS进行处理
  • 罗技摄像头的图像捕捉
  • Google Cardboard for visuals
  • 红外线在聚苯乙烯泡沫球里散发出很好的漫射光点

有任何想法吗?

我可以想象使用ImageMagick执行此操作的三种方法,它具有node绑定,并且已安装在大多数Linux发行版上,可用于OSX和Windows。

首先,在命令行中input:

 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 

并且显示了三个最亮的像素从左上angular开始是146像素,从左上angular开始是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像素×11像素,并且从左边缘到图像143像素,从顶部向下164像素。 其质心为148,169,面积为97像素,颜色为白色。

find的第一个对象(在输出的第二行到最后一行)是整个图像,您可以将其打印为黑色,即rgb(0,0,0)。

我也可以解释一些参数…我转换为灰度,因为连续组件分析传统上在黑白图像的黑色背景上查找白色物体。 然后我得到纯白色和纯黑色的阈值 – 例如,您可能需要在您的真实系统中使用中值滤波器来消除噪声 – -median 3verbose=true意味着命令应该打印出所有find的斑点的列表,而8意味着将8连接的像素看作是同一个斑点的一部分,也就是说像素触及另一个像素的NE,SE ,SW或NW的angular落被认为是同一个斑点的一部分 – 如果你将其设置为4 ,像素必须直接在另一个的旁边或上方/下方作为邻居。

如果你想find它所的区域,你可以这样做:

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

在这里输入图像说明

第三种方法较慢,它涉及将图像转换为文本,然后search单词“白色” 。 所以。 让我们开始简单的,只是像这样将图像转换为文本:

 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但我可以指出你在我的答案,这是另一个ImageMagick进程通过node并希望你可以适应,如果你尝试上述在命令行,并find它的作品你足够好,你想使用ImageMagick。

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

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

我在另一个问题中find了一个nodejs例子。 我不确定它是否成功了: hough transform – javascript – node.js

你也可以遍历你的图像的每个像素,并检查是否是白色的,如果是白色,find所有的白色邻居,并删除它们。 调用它们的平均xy坐标,瞧,你有点的坐标。 如果你没有太多的噪音,这可能效果很好。

Interesting Posts