Адаптивное вычитание фона с неподвижными объектами при обработке - PullRequest
3 голосов
/ 01 октября 2019

Я хотел бы получить метод вычитания фона для наружных условий, способный постепенно приспосабливаться к изменениям освещения окружающей среды, но с возможностью обнаружения присутствия, даже не находящегося в движении. Проблема с адаптивными методами вычитания фона opencv заключается в том, что они способны обнаруживать присутствие только во время движения. С другой стороны, старые методы вычитания фона не работают, когда условия освещения не всегда одинаковы. Чтобы получить это, я изменил метод Голана Левина в видео библиотеке Обработки (фактические кадры сравниваются с первым начальным кадром), установив определенный низкий порог разницы. Поэтому я предполагаю, что все изменения, превышающие этот порог, происходят из-за присутствия (люди, животные и т. Д.), А изменения ниже этого - из-за условий прогрессивного освещения, и я помещаю этот измененный пиксель в массив пикселей фона.

/* auto-updating background part*/
diferencia = diffR+diffG+diffB;
if (diferencia<minDif)  backgroundPixels[i]=video.pixels[i];

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

import processing.video.*;

int numPixels;
int[] backgroundPixels;
Capture video;
int camSel=0;
int topDiff=763;
int unbralDif=120;
int mindDif=20;
boolean subtraction, lowSubtr;
PGraphics _tempPG;

void setup() {
  size(640, 480); 

  _tempPG=createGraphics(width, height);
  if (camSel==0)video = new Capture(this, width, height);
  else video = new Capture(this, width, height, Capture.list()[1]);

  video.start();  

  numPixels = video.width * video.height;
  backgroundPixels = new int[numPixels];
  loadPixels();
}

void draw() {
  if (video.available()) {
    video.read(); 
    video.loadPixels(); 

    int presenceSum = 0;

    for (int i = 0; i < numPixels; i++) { 
      color currColor = video.pixels[i];
      color bkgdColor = backgroundPixels[i];

      int currR = (currColor >> 16) & 0xFF;
      int currG = (currColor >> 8) & 0xFF;
      int currB = currColor & 0xFF;

      int bkgdR = (bkgdColor >> 16) & 0xFF;
      int bkgdG = (bkgdColor >> 8) & 0xFF;
      int bkgdB = bkgdColor & 0xFF;

      int diffR = abs(currR - bkgdR);
      int diffG = abs(currG - bkgdG);
      int diffB = abs(currB - bkgdB);

      presenceSum += diffR + diffG + diffB;

      pixels[i] = 0xFF000000 | (diffR << 16) | (diffG << 8) | diffB;

      /* auto-updating background part*/
      int diferencia = diffR+diffG+diffB;
      //detect pixels that have change below a threshold
      if (lowSubtr && diferencia<mindDif) {
        /* substitute with them the backgound img array */
        backgroundPixels[i]=video.pixels[i];
      }
      /* end auto-updating background part*/
    }

    updatePixels();
  }
  subtraction=false;
}


void keyPressed() {
  if (keyPressed)startSubtr();
}

void startSubtr() {
  arraycopy(video.pixels, backgroundPixels);
  lowSubtr=true;
}


void actualizacion(int[] _srcArr, int[] _inputArr, int _ind) {
  for (int i=0; i<_srcArr.length; i++) {
    _srcArr[_ind]=_inputArr[i];
  }
}
...