在处理中提取像素数据

时间:2015-08-06 22:47:02

标签: processing pixel capture

在处理中使用捕捉视频时,我想了解如何设置相机将不断扫描的相机输入的一小部分。在那个定义的部分,我希望相机寻找亮度的变化(即亮度现在变暗。)如果亮度发生变化,我只想让它返回“检测到阴影”。'任何人都可以帮助我开始吗?我对这门语言很新。

2 个答案:

答案 0 :(得分:2)

您可以使用PImage的get()方法轻松获取相机(或任何图像)的一小部分,您可以通过该方法传递描述截面矩形(x,y,宽度,高度)的一组坐标。

这也被称为计算机视觉中的感兴趣区域(ROI)。

检索此区域后,您可以对其进行处理。 这是一个显示如何获得ROI并对其进行处理的最小示例(在这种情况下,只需根据鼠标位置执行阈值:

import processing.video.*;

Capture cam;
int w = 320;
int h = 240;
int np = w*h;

int roiX = 80;
int roiY = 60;
int roiW = 160;
int roiH = 120;
PImage roi;

void setup(){
  size(w,h);
  cam = new Capture(this,w,h);
  cam.start();
}
void draw(){
  image(cam,0,0);
  if(roi != null){
    //process ROI
//    roi.filter(GRAY);
    roi.filter(THRESHOLD,(float)mouseX/width);
    //display output
    image(roi,roiX,roiY);
  }
}
void captureEvent(Capture c){
  c.read();
  roi = c.get(roiX,roiY,roiW,roiH);
}

您可以使用brightness()功能获取像素的亮度。 这意味着您可以通过为每个像素添加亮度级别,然后将结果除以总像素数来获得ROI的平均亮度:

import processing.video.*;

Capture cam;
int w = 320;
int h = 240;
int np = w*h;

int roiX = 80;
int roiY = 60;
int roiW = 160;
int roiH = 120;
PImage roi;

void setup(){
  size(w,h);fill(127);
  cam = new Capture(this,w,h);
  cam.start();
}
void draw(){
  image(cam,0,0);
  if(roi != null){
    //process ROI
//    roi.filter(GRAY);
    roi.filter(THRESHOLD,(float)mouseX/width);
    //display output
    image(roi,roiX,roiY);
    text("ROI brightness:"+brightness(roi),10,15);
  }
}
void captureEvent(Capture c){
  c.read();
  roi = c.get(roiX,roiY,roiW,roiH);
}
float brightness(PImage in){
  float brightness = 0.0;
  int numPixels = in.pixels.length;
  for(int i = 0 ; i < numPixels; i++) brightness += brightness(in.pixels[i]); 
  return brightness/numPixels; 
}

如果您将ROI设置为覆盖明亮区域,则应该会看到阴影出现时平均亮度下降。只需在条件中使用阈值就可以对其采取行动:

import processing.video.*;

Capture cam;
int w = 320;
int h = 240;
int np = w*h;

int roiX = 80;
int roiY = 60;
int roiW = 160;
int roiH = 120;
PImage roi;

float brightness = 0.0;
float shadowThresh = 127.0;

void setup(){
  size(w,h);fill(127);
  cam = new Capture(this,w,h);
  cam.start();
}
void draw(){
  image(cam,0,0);
  if(roi != null){
    //process ROI
//    roi.filter(GRAY);
    roi.filter(THRESHOLD,(float)mouseX/width);
    brightness = brightness(roi);
    if(brightness < shadowThresh) println("shadow detected");
    //display output
    image(roi,roiX,roiY);
    text("ROI brightness:"+brightness,10,15);
  }
}
void captureEvent(Capture c){
  c.read();
  roi = c.get(roiX,roiY,roiW,roiH);
}
float brightness(PImage in){
  float brightness = 0.0;
  int numPixels = in.pixels.length;
  for(int i = 0 ; i < numPixels; i++) brightness += brightness(in.pixels[i]); 
  return brightness/numPixels; 
}

希望这些示例易于阅读和理解。 请注意,这并不像它们那么快。 请务必查看处理附带的视频示例(示例&gt;库&gt;视频&gt;捕获),尤其是:亮度阈值,亮度跟踪

如果您想了解更多有关这些技术的知识,您应该了解计算机视觉和OpenCV库。有一个非常好的OpenCV Processing library,您现在可以通过 Sketch&gt;轻松安装导入库...&gt;添加库... 并选择 OpenCV进行处理。它还附带了使用亮度的示例。

这涵盖了像素操作方面,但是进行此类开发的另一个重要方面是设置。拥有可靠的设置至关重要:它将使您的生活更轻松。我的意思是,在你的情况下:

  • 控制相机:能够控制自动白平衡/亮度等。因为自动调整可能会贬低你的价值。
  • 控制场景:确保减少意外灯光导致跟踪失误的风险,或者撞到您正在追踪的相机或物体上的东西。

答案 1 :(得分:0)

假设您正在分析的相机数据是PImage,您可以对数据应用滤镜,使其变为黑/白或灰度形式。关于PImage过滤器模式的文档:https://processing.org/reference/filter_.html应该是有用的。

您可能需要进行像素分析 - 这里可能有一个库可以提供帮助,但您可以从过滤后的PImage中获取一系列像素,循环显示它并根据基线值检查值,看看它们是否有效更亮或更暗。如果它们是0 - 255比例的灰度,如果数字高于基线,或者数字较暗,则可以判断它们是否较轻。