Computer vision 在processing 3.0中在kinect视频图像上绘制图形

Computer vision 在processing 3.0中在kinect视频图像上绘制图形,computer-vision,processing,kinect,Computer Vision,Processing,Kinect,我正在阅读格雷格·博伦斯坦(Greg Borenstein)的书《让事物看得见》(Making Things See),并且已经找到了如何创建一个光标来跟踪最接近Kinect的物体的运动。现在光标是一个简单的红色球。这样我就可以跟踪我的手指了 image(kinect.getVideoImage(),0,0) 我还创建了一些按钮,当我将光标球放在按钮区域时,这些按钮会对视频图像应用过滤器 这有点有趣,但是新奇感已经消失了,所以现在我想用粒子或者类似的有趣的东西把光标球变成一个动画。这个动画图形

我正在阅读格雷格·博伦斯坦(Greg Borenstein)的书《让事物看得见》(Making Things See),并且已经找到了如何创建一个光标来跟踪最接近Kinect的物体的运动。现在光标是一个简单的红色球。这样我就可以跟踪我的手指了

image(kinect.getVideoImage(),0,0)
我还创建了一些按钮,当我将光标球放在按钮区域时,这些按钮会对视频图像应用过滤器

这有点有趣,但是新奇感已经消失了,所以现在我想用粒子或者类似的有趣的东西把光标球变成一个动画。这个动画图形应该仍然跟踪我的手指,并绘制在视频图像上

当我试着写这篇文章时,图形出现了错误,因为视频图像一直在粒子上重画,所以看起来不对劲

我想我可以使用capture()方法在图形下绘制视频图像,但我不知道如何使用Kinect的视频

有人知道我怎么做吗?任何帮助都将不胜感激

下面是我的kinect跟踪器和过滤器按钮的示例。如果您将其复制并粘贴到processing中,并且插入了kinect,则它应该会运行。我为代码缺乏口才而道歉。我还在学习如何编写漂亮的代码

代替过滤器,我想为红球触发一个新的图形,可能应用粒子或其他东西

//我的kinect跟踪器
导入org.openkinect.freenect.*;
导入org.openkinect.processing.*;
Kinect-Kinect;
布尔ir=真;
布尔颜色深度=真;
布尔镜像=真;
浮动关闭值;
浮动闭合器;
漂浮紧密;
//创建阵列以存储最近的x坐标和y坐标以进行平均
int[]recentXValues=新的int[3];
int[]recentYValues=新的int[3];
//跟踪要更改的数组中的当前值
int currentIndex=0;
浮点数circleButtonX,circleButtonY;//圆圈按钮的位置
浮动圆圈按钮大小;//圆形按钮直径
颜色圆圈按钮颜色;//圆形按钮的颜色
无效设置(){
尺寸(640480,P3D);
kinect=新的kinect(本);
kinect.initDepth();
kinect.initVideo();
//kinect.enableIR(ir);
kinect.enableMirror(镜像);
kinect.enableColorDepth(colorDepth);
circleButtonColor=颜色(0,0,255);
}
作废提款(){
关闭值=1700;
int[]depthValues=kinect.getRawDepth();
对于(int y=0;y<480;y++){
对于(int x=0;x<640;x++){
int i=x+y*640;
int currentDepthValue=深度值[i];
如果(currentDepthValue>0&¤tDepthValue2){
currentIndex=0;
}
//closetX和ClosestY成为运行平均值
//使用currentX和CurrentY
closestX=(recentXValues[0]+recentXValues[1]+recentXValues[2])/3;
closestY=(recentYValues[0]+recentYValues[1]+recentYValues[2])/3;
//在屏幕上绘制深度图像
图像(kinect.getVideoImage(),0,0);
填充(0,0,250);
椭圆(75,75,100,100);
椭圆(200,75,100,100);
椭圆(75200100100);
rect(540,25,75,100);
//钮扣
填充(255,0,0);
文本大小(24);
文本(“倒置”,40、85);
文本(“模糊”,50210);
文本大小(18);
文本(“阈值”,155、85);
文本(“停止”,560,75);
椭圆(closestX,closestY,25,25);
如果(closestX>25&&closestX<125&&closestY>25&&closestY<125){
过滤器(倒置);
};
如果(closestX>150&&closestX<250&&closestY>25&&closestY<125){
滤波器(阈值);
};
如果(closestX>25&&closestX<125&&closestY>150&&closestY<250){
滤波器(模糊,6);
};
如果(closestX>540&&closestX<615&&closestY>25&&closestY<100){
noLoop();
loop();
背景(0);
};

我相信您是在问如何在处理过程中创建粒子轨迹。这与kinect没有任何关系-对
background()
的简单调用也会覆盖您的任何粒子。因此,您目前有如下情况:

void setup(){
大小(500500);
}
作废提款(){
背景(0);
椭圆(mouseX,mouseY,10,10);
}
你在屏幕上画了一些东西(在你的代码中,一个红色的球,在我的代码中,一个椭圆),但是它被清除了(在你的代码中,kinect视频,在我的代码中,调用
background(0)
),你在问如何使它在你画完背景后,椭圆仍然留在屏幕上

答案是:您需要将轨迹的位置存储在数据结构中,然后每帧重新绘制一次。

一种简单的方法是创建
PVector
实例的
ArrayList
。要向轨迹添加粒子,只需将
PVector
添加到
ArrayList
。然后在轨迹上迭代并绘制每个
PVector

ArrayList trail=new ArrayList();
无效设置(){
大小(500500);
}
作废提款(){
背景(0);
//增加线索
添加(新的PVector(mouseX,mouseY));
//追踪
用于(PVector p:轨迹){
椭圆(p.x,p.y,10,10);
}
}
但是,此轨迹将不断增长,最终您将耗尽内存来容纳每一个点。因此,要防止您的轨迹这样做,您需要限制其大小:

ArrayList trail=new ArrayList();
无效设置(){
大小(500500);
}
作废提款(){
背景(0);
//增加线索
添加(新的PVector(mouseX,mouseY));
如果(trail.size()>10){
//轨迹太长,请删除最早的点
trail.remove(0);
}
//追踪
用于(PVector p:轨迹){
椭圆(p.x,p.y,10,10);
}
}
从这里你可以做一些更有趣的事情:在你的文章中给出每一点