You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于PImage.get(x,y,length,width)返回数据解析的技术问询

问题

我需要持续监控PImage的特定区域颜色值,获取首个发生变化的像素XY坐标,用于基础碰撞检测与响应(比如监控阈值化视频特定区域,找到首个从黑变白的像素坐标)。

调用PImage.get()获取目标区域时遇到以下问题:

  • PImage.get(x,y)能返回可读的颜色数据,但PImage.get(x,y,width,height)返回的是类似processing.core.PImage@693b37ff的对象标识,查文档得知该方法返回PImage对象,不清楚如何解析它的颜色或alpha数据。
  • 尝试过使用PImage.pixels[]数组,但数据量过大,每帧遍历会影响性能,因此希望仅监控特定区域来优化性能。

复现该问题的代码:

PImage img;

void setup() {
    size(500, 500);
    
    img = createImage(250, 250, RGB);
    
    img.loadPixels();
    for (int i = 0; i < img.pixels.length; i++) {
        img.pixels[i] = color(0);
    }
    
    imageMode(CENTER);
    
    img.updatePixels();
}

void draw() {
    
    image(img, width / 2, height / 2);
    
    println(img.get((width / 2),(height / 2), 50, 50));
}
解决方法

1. 解析get(x,y,w,h)返回的PImage对象

PImage.get(x,y,w,h)返回的是包含指定区域像素的新PImage实例。要获取颜色数据,需先调用loadPixels()加载子图像的像素数组,之后可通过pixels[]访问所有像素颜色,或用get(x,y)(此处x/y为子图像内的相对坐标)获取单个像素颜色。

示例代码:

// 获取监控区域的子图像
PImage subImg = img.get(box.bx, box.by, box.bW, box.bH);
// 加载子图像的像素数据
subImg.loadPixels();

// 遍历子图像像素,寻找首个符合条件的像素
for (int i = 0; i < subImg.pixels.length; i++) {
  color pixelColor = subImg.pixels[i];
  // 示例:判断像素是否变为白色
  if (pixelColor == color(255)) {
    // 转换为原图像中的坐标
    int subX = i % subImg.width;
    int subY = i / subImg.width;
    int originalX = box.bx + subX;
    int originalY = box.by + subY;
    println("首个变白的像素坐标:(" + originalX + ", " + originalY + ")");
    // 找到后立即终止遍历,提升性能
    break;
  }
}

2. 直接遍历原图像的指定区域(性能更优)

无需创建子图像,直接计算监控区域的边界,逐行逐列遍历该范围内的像素,找到目标像素后立即停止,减少内存开销和遍历次数。

示例代码:

// 定义监控区域的边界
int startX = box.bx;
int startY = box.by;
int endX = startX + box.bW;
int endY = startY + box.bH;

// 加载原图像的像素数据(每帧仅需调用一次)
img.loadPixels();

// 遍历监控区域,优先按行/列查找,找到即停止
for (int y = startY; y < endY; y++) {
  for (int x = startX; x < endX; x++) {
    // 计算像素在pixels数组中的索引
    int index = y * img.width + x;
    color pixelColor = img.pixels[index];
    // 示例:检测像素从黑色变为白色
    if (pixelColor == color(255)) {
      println("首个变化的像素坐标:(" + x + ", " + y + ")");
      // 跳出所有循环,避免多余计算
      return;
    }
  }
}

3. 额外性能优化技巧

  • 按需调用loadPixels():仅在图像像素更新时(如视频新帧到来)调用,无需每帧重复加载。
  • 缩小监控范围:在业务允许的前提下,尽量减小监控区域的尺寸,减少需要遍历的像素数量。
  • 缓存初始状态:若检测的是从固定初始颜色的变化,可预先缓存监控区域的初始像素值,仅对比可能变化的像素(适用于非实时更新的图像场景)。

内容的提问来源于stack exchange,提问作者Spenser Spratlin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:35:36