在处理中使用捕捉视频时,我想了解如何设置相机将不断扫描的相机输入的一小部分。在那个定义的部分,我希望相机寻找亮度的变化(即亮度现在变暗。)如果亮度发生变化,我只想让它返回“检测到阴影”。'任何人都可以帮助我开始吗?我对这门语言很新。
答案 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比例的灰度,如果数字高于基线,或者数字较暗,则可以判断它们是否较轻。