3

我想获得一种户外条件的背景减法方法,能够逐渐适应环境光的变化,但即使没有运动也能揭示存在的能力。

自适应opencv背景减法方法的问题在于它们只能在移动时检测到存在。另一方面,当光线条件并不总是相同时,旧的背景减除方法不起作用。

为了得到这个,我修改了处理视频库中的 Golan Levin 方法(实际帧与第一个初始帧进行比较),设置了一定的低差异阈值。

因此,我假设所有超过该阈值的变化都是由于存在(人、动物等),低于这个阈值的变化是由于渐进的光照条件,我把这个变化的像素放在背景的像素阵列中。

/* 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];
  }
}
4

0 回答 0