我正在建造一个AR艺术装置,需要在一个人穿过房间时跟踪他们。
要做到这一点,我已经制作了一个带有多个红外灯(带漫射器)的头部,并配有一个摄像头(一个USB摄像头),它有一个滤光器,可以从图像中去除大部分/全部可见光,如以及对图像的一些调整,基本上让我在黑色背景上留下白点。
以能够捕捉房间边界的方式设置网络摄像头非常简单,但我不确定如何处理黑白图像以获取x,y每个点的坐标。
示例图像输出:(这是一个模型,因为我不会在我这一秒上有一个,并且还要记住,数据将来自实际上是一个视频)
有什么想法吗?
答案 0 :(得分:2)
我可以想到使用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进行 Connected Components Analysis ,如下所示:
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 传统上在b& w图像中的黑色背景上寻找白色物体。然后,我获得纯白色和纯黑色的阈值 - 例如,您可能需要在真实系统上使用中值滤波器来消除噪声-median 3
。 verbose=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。
答案 1 :(得分:1)
许多(大多数?)图像处理库(例如OpenCV)具有连接组件提取模块。给定像您的示例中的二进制图像,您将获得所有连接图像区域的列表。您可以计算这些质心来获得点的中心。
答案 2 :(得分:1)
一种方法是使用“Hough Transform”。霍夫变换基本上将图像转换为另一个坐标系,您可以“轻松”检测圆形。
我在另一个问题中找到了一个nodejs-example。我不确定它是否对他们有效:hough transform - javascript - node.js
你也可以循环浏览图像的每个像素,检查它是否为白色,如果是白色,找到它的所有白色邻居并将其删除。计算它们的平均x-y坐标和瞧,你就得到了你的点的坐标。如果您没有太多噪音,这可能效果很好。