如何在Processing中调整Xbox360 Kinect的输出图像尺寸?
问题解决:Kinect深度图缩放后无法刷新的问题
问题根源
你代码里每次draw()循环都调用result.resize(640*2,480*2),直接改变了result的尺寸,但后续更新像素时,还是用原640×480的depthCam尺寸计算像素索引,导致result变成1280×960后,绝大多数像素根本没被更新,所以看起来只有初始帧。另外窗口可调整但background(0)只清理原640×480区域,也是顶部出现重复刷新流的原因。
修复方案
不用修改result本身的尺寸,而是在绘制时用image()函数的缩放参数直接拉伸显示,既能保证每次像素正确更新,又能实现全屏/放大效果:
修改后的代码:
import SimpleOpenNI.*; SimpleOpenNI kinect; PImage depthCam; PImage result; void setup() { // 可直接设置目标尺寸,也保持窗口可调整 size(1280, 960); surface.setResizable(true); background(0); kinect = new SimpleOpenNI(this); kinect.enableDepth(); // result固定为Kinect输出的640×480尺寸 result = createImage(640, 480, RGB); } void draw() { // 按当前窗口尺寸清屏 background(0); kinect.update(); depthCam = kinect.depthImage(); int[] depthVals = kinect.depthMap(); result.loadPixels(); for (int y=0; y<depthCam.height; y=y+5) { for (int x =0; x<depthCam.width; x=x+5) { int loc = x + y * depthCam.width; if (depthVals[loc] <= 1200 && depthVals[loc] > 50) { result.pixels[loc] = color(250); } else if (depthVals[loc] > 1200 && depthVals[loc]< 3000 ) { result.pixels[loc] = color(102); } else { result.pixels[loc] = color(0); } } } result.updatePixels(); // 将小图直接拉伸到当前窗口尺寸显示 image(result, 0, 0, width, height); }
核心说明
result固定为Kinect输出的640×480,每次循环都能正确遍历并更新所需像素- 绘制时通过
image(result, 0, 0, width, height)自动适配窗口大小,不管窗口如何调整都能全屏显示 background(0)按当前窗口尺寸清屏,避免旧帧残留
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

