关于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
相关产品推荐
相关产品推荐

