class IP_Cam: def __init__(self): self.CAM_AUTH="camuser:pwd4Cam" self.snapshotURL="192.168.178.36/snapshot.cgi" self.ctrlURL="192.168.178.36/decoder_control.cgi?command=%d" self.http=urllib3.PoolManager() self.headers=urllib3.util.make_headers(basic_auth=self.CAM_AUTH) self.UP=0 self.DOWN=2 self.LEFT=4 self.RIGHT=6 [...] # ########################################################### # Liefert einen Snapshot aus Grauwerten als NumPy-Array. def getImageGrayscale(self): try: img=self.getImage().convert('L') except: #print("error - retry") img=self.getImage().convert('L') return(np.asarray(img)) # ########################################################### # Bewegt die Kamera "duration" Sekunden lang in die Richtung # "direction". def gotoDirection(self, direction, duration): r=self.http.request('GET', self.ctrlURL%(direction), headers=self.headers) if duration<0: return elif duration>0: time.sleep(duration) r=self.http.request('GET', self.ctrlURL%(direction+1), headers=self.headers) # ########################################################### # Bewegt die Kamera in Grundstellung. def gotoCenter(self): r=self.http.request('GET', self.ctrlURL%(25), headers=self.headers) while not self.hasStopped(): time.sleep(0.5) # ########################################################### # Liefert True, wenn zwei Bilder, die 100ms nacheinander # von der Kamera gelesen wurden, annähernd gleich sind. def hasStopped(self): p1=cam.getImagePattern(cam.getImageGrayscale()) time.sleep(0.1) p2=cam.getImagePattern(cam.getImageGrayscale()) return(self.compareImagePattern(p1, p2)) |
class IP_Cam: [...] # ########################################################### # Liefert für ein Grau-Bild in "imgAsArray" eine Liste mit # 64 Werten als Pattern. Die Werte entsprechen dem Mittelwert # des jeweiligen Bildausschnittes. def getImagePattern(self, imgAsArray): pat=np.empty([8, 8], dtype=np.int8) # Array anlegen arrsh=np.hsplit(imgAsArray, 8) # Bild horizontal splitten for h in range(len(arrsh)): # über 8 Teilbilder arrsv=np.vsplit(arrsh[h], 8) # Teilbild vertikal splitten for v in range(len(arrsv)): # über 8 Teilbilder #self.saveImage(arrsv[v], "b%d%d"%(h,v)) pat[v, h]=np.mean(arrsv[v]) # Bild-Mittelwert ins Array[y,x] return(pat) # Array als Pattern liefern # ########################################################### # Vergleicht die zwei Pattern "pat1" und "pat2" und liefert # True, wenn der mittlerer Grauwert jedes Bildausschnitts # in beiden Pattern maximal um "maxdelta" voneinander # abweicht. def compareImagePattern(self, pat1, pat2, maxdelta=2): return(np.max(np.absolute(pat1-pat2))<=maxdelta) |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
200 | 234 | 195 | 118 | 118 | 169 | 245 | 226 |
239 | 246 | 195 | 150 | 154 | 145 | 225 | 127 |
231 | 238 | 187 | 155 | 112 | 79 | 189 | 120 |
155 | 196 | 158 | 84 | 99 | 58 | 148 | 136 |
78 | 111 | 109 | 65 | 85 | 52 | 86 | 69 |
71 | 105 | 97 | 58 | 68 | 57 | 76 | 47 |
66 | 94 | 90 | 66 | 68 | 61 | 85 | 133 |
56 | 64 | 51 | 100 | 97 | 134 | 125 | 136 |