2015-08-06 4 views
0

Используя захват видео в процессе обработки, я хочу понять, как настроить небольшой раздел канала камеры, который камера будет постоянно сканировать. В этом определенном разделе я хочу, чтобы камера искала изменение яркости (то есть, теперь яркость становится темной.) Если меняется яркость, я просто хочу, чтобы она вернула «обнаружен тень». Может ли кто-нибудь помочь мне начать? Я очень новичок в этом языке.Извлечь пиксельные данные при обработке

ответ

0

Предполагая, что данные камеры, которые вы анализируете, являются PImage, вы можете применять фильтры к данным, чтобы получить их в форме черно-белой или серой шкалы. Должны быть полезны документы в режимах фильтра PImage: https://processing.org/reference/filter_.html.

Возможно, вам понадобится выполнить анализ пикселей - здесь может быть библиотека, но вы можете получить массив пикселей из фильтрованного PImage, пропустить его и проверить значения в соответствии с вашими базовыми значениями, чтобы увидеть, они ярче или темнее. Если они имеют шкалу серого в шкале 0 - 255, вы можете определить, светятся ли они, если число, превышающее базовое значение, или более темное число ниже.

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; 
} 

Если вы установили рентабельность инвестиций, чтобы покрыть светлую область, вы следует видеть, что средняя яркость снижается по мере появления тени. Просто с помощью порогового значения в состоянии должны позволить действовать на него:

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; 
} 

Надеется, что эти примеры легко читать и понимать. Обратите внимание, что это не так быстро, как они могут быть. Не забудьте также проверить видео примеров, которые приходят с обработкой (Примеров> Библиотека> видео> Захват), особенно это: BrightnessThresholding, BrightnessTracking

Если вы хотите узнать больше о методах, как это вы должны взгляните на компьютерное зрение и библиотеку OpenCV. Существует очень хороший OpenCV Processing library, который теперь можно легко установить через Sketch> Import Library ...> Добавить библиотеку ... и выберите OpenCV для обработки. Он также содержит примеры использования яркости.

Это покрывает сторону манипуляции с пикселями, но еще одним важным аспектом такого рода разработки является настройка. Очень важно иметь надежную настройку: это облегчит вашу жизнь.Я имею в виду, что в вашем случае:

  • Управление камерой: возможность управления автоматическим балансом белого/яркостью/и т. Д. поскольку автоматические корректировки могут сбросить ваши значения.
  • , имеющий контроль над сценой: убедитесь, что вы уменьшаете риски случайных огней, возиться с вашим отслеживанием или что-то натыкающееся на камеру или объект, который вы отслеживаете.
+0

Это именно то, что я искал. благодарю вас за подробное объяснение - я с нетерпением жду возможности поиграть с этим и изменить его для своего проекта. – Kingyyy

Смежные вопросы