home     zurück
letzte Änderung am 26.02.2016

Kamera-Nachführung bei Bewegungserkennung V2

Nach Erstellung einer findBrightestArea7x5() und Umbau von gotoMatrixElement() funktioniert es wie erwartet.
Der gotoMatrixElement() optimiert Wege jetzt auch durch Nutzung der Kombi-Bewegungen (LEFT_UP, RIGHT_UP, LEFT_DOWN, RIGHT_DOWN).

def findBrightestArea7x5(arr):
  cx=7  # Anzahl Elemente auf der X-Achse
  cy=5  # Anzahl Elemente auf der Y-Achse
  w=91  # Breite eines Elements
  h=96  # Höhe eines Elements

  max_seg=None
  max_seg_idx_x=None
  max_seg_sum=0
  for x in range(cx): # über die Segmente auf der X-Achse
    seg=arr[:, 1+x*w:1+x*w+w]
    tmp=np.sum(seg)
    if tmp>max_seg_sum:
      max_seg=seg       # hellstes Segment auf der X-Achse
      max_seg_idx_x=x   # X-Index merken
      max_seg_sum=tmp   # dessen Helligkeits-Wert

  max_seg_idx_y=None
  max_seg_sum=0
  for y in range(cy): # über die Segmente auf der Y-Achse
    seg=max_seg[y*h:y*h+h, :]
    tmp=np.sum(seg)
    if tmp>max_seg_sum:
      max_seg_sum=tmp
      max_seg_idx_y=y
  return(max_seg_idx_x, max_seg_idx_y)


class IP_Cam:
[...]
  def gotoMatrixElement(self, x, y):
    #  0,0  1,0  2,0  3,0  4,0  5,0  6,0
    #  0,1  1,1  2,1  3,1  4,1  5,1  6,1
    #  0,2  1,2  2,2 (3,2) 4,2  5,2  6,2
    #  0,3  1,3  2,3  3,3  4,3  5,3  6,3
    #  0,4  1,4  2,4  3,4  4,4  5,4  6,4
    nam={0:"UP   ", 2:"DOWN ", 4:"LEFT ", 6:"RIGHT", None:""}

    if   y<2: dv=self.UP
    elif y>2: dv=self.DOWN
    else:     dv=None

    if   x<3: dh=self.LEFT
    elif x>3: dh=self.RIGHT
    else:     dh=None

    tv=0
    if not dv is None:
      if   y in (0, 4): tv=0.581
      elif y in (1, 3): tv=0.325

    th=0
    if not dh is None:
      if   x in (0, 6): th=2.63
      elif x in (1, 5): th=1.72
      elif x in (2, 4): th=0.93

    print(x, y, nam[dv], nam[dh], tv, th)

    if not dv is None and not dh is None:
      # wenn beide Achsen bewegt werden sollen
      if dv==self.UP:
        if dh==self.LEFT:
          if tv>th: # mehr vertikal
            self.gotoDirection(self.LEFT_UP, th)
            self.gotoDirection(self.UP, tv-th)
          else:     # mehr horizontal
            self.gotoDirection(self.LEFT_UP, tv)
            self.gotoDirection(self.LEFT, th-tv)
        else: # dh==self.RIGHT
          if tv>th: # mehr vertikal
            self.gotoDirection(self.RIGHT_UP, th)
            self.gotoDirection(self.UP, tv-th)
          else:     # mehr horizontal
            self.gotoDirection(self.RIGHT_UP, tv)
            self.gotoDirection(self.RIGHT, th-tv)
      else: # dv==self.DOWN
        if dh==self.LEFT:
          if tv>th: # mehr vertikal
            self.gotoDirection(self.LEFT_DOWN, th)
            self.gotoDirection(self.DOWN, tv-th)
          else:     # mehr horizontal
            self.gotoDirection(self.LEFT_DOWN, tv)
            self.gotoDirection(self.LEFT, th-tv)
        else: # dh==self.RIGHT
          if tv>th: # mehr vertikal
            self.gotoDirection(self.RIGHT_DOWN, th)
            self.gotoDirection(self.DOWN, tv-th)
          else:     # mehr horizontal
            self.gotoDirection(self.RIGHT_DOWN, tv)
            self.gotoDirection(self.RIGHT, th-tv)
    else:
      if not dv is None:
        self.gotoDirection(dv, tv)
      if not dh is None:
        self.gotoDirection(dh, th)


if __name__=="__main__":
  cam=IP_Cam()

  img1=cam.getImageGrayscale()
  while True:
    time.sleep(0.2)
    img2=cam.getImageGrayscale()

    diff=cam.removeNoise(img1-img2)
    diff_sum=np.sum(diff)
    #diff_sum_p="{:,}".format(diff_sum)
    #print(diff_sum_p)
    if diff_sum>500000:
      t=datetime.datetime.utcnow()
      cam.saveImage(img1, "d_%s-1"%(t.strftime("%Y%m%d%H%M%S%f")))
      cam.saveImage(img2, "d_%s-2"%(t.strftime("%Y%m%d%H%M%S%f")))
      x, y=findBrightestArea7x5(diff)
      cam.saveImage(diff, "d_%s-d(%d,%d)"%(t.strftime("%Y%m%d%H%M%S%f"), x, y))

      cam.gotoMatrixElement(x, y)

      time.sleep(0.2)
      img2=cam.getImageGrayscale()

    img1=img2

Aber einige Problemchen gibts noch:
  1. das Script hat einen Fuß-Fetisch. Wenn man durch den Raum wandert, findet die größte Bewegung an den Füßen statt. Folglich wird dieser Bereich in die Bildmitte gebracht.
  2. gestört empfangene Bilder bringen alles durcheinander.
  3. gleicht die Kamera selbständig Helligkeitsschwankungen aus, gerät ebenfalls alles durcheinander.
  4. man kann der Kamera leicht weglaufen und dann findet sie einen erst wieder, wenn man an den letzten Aufnahme-Ort zurückkommt.
Mit 2. meine ich sowas hier (mit verschobenem unteren Drittel):
gestörtes Bild
Da fehlt mir irgendwie noch der Ansatz, wie ich den Empfang solcher Bilder entweder vermeiden oder wenigstens [schnell] detektieren kann - um sie dann zu verwerfen.

Gegen 3. könnte es helfen, Differenz-Bilder mit sehr vielen hellen Bereichen einfach zu ignorieren.

Bewegungs-Nachführung V3