=== Protokoll vom 9. Februar 2017 === Erstes funktionierendes Programm (Kantenerkennung/Niveaulinien + Turtle): \\ Niveaulinien, bzw. Contours #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from scipy import misc, ndimage, signal import cv2 import scipy.misc as misc import skimage.color as color import turtle import pickle bild=misc.imread('hund_mittel_kl.jpg') # bild einlesen #cap = cv2.VideoCapture(0) #bei kamera bild wird zu bild2 #res, bild2 = cap.read() #bei kamera imgray =color.rgb2gray(bild) from skimage.measure import find_contours res = [] for value in np.linspace(np.min(imgray), np.max(imgray),10): res.extend(find_contours(imgray,value)) for cont in res: print cont.shape # alte Liste aller Contours! def Isolux(): #a_als_farbbild = cv2.cvtColor(a, cv2.COLOR_GRAY2BGR) #a ist ein s/w-bild, um farbe überhaupt anzeigen zu können, wird es in ein bgr konvertiert res2 = [] for cont in res: if cont.shape[0]>15: #and ... Fkt.Check for i,j in cont: cv2.circle(bild,(int(round(j)),int(round(i))),1,(1,0,0),-1) res2.append(cont) #cv2.imshow("Bild:",bild) #cv2.waitKey(0) #cv2.destroyAllWindows() return res2 res2 = Isolux() # unsere Liste der gewünschten Contours res2 (ausgefiltert) #print res2 # Contouren! for cont in res2: print cont.shape # Contourenanzahl Kantenprogramm bild=misc.imread('hund_mittel_kl.jpg',mode='F',) bild=ndimage.filters.gaussian_filter(bild,1.5) #plt.imshow(bild,cmap=plt.get_cmap('gray')) #Original #plt.show() # x b=ndimage.filters.sobel(bild, axis=-1) #Verschiebungsbild, x #cv2.namedWindow("Fenster 1") #cv2.imshow("Fenster 1",b) # y b2=ndimage.filters.sobel(bild, axis=0) #Verschiebungsbild, y #cv2.namedWindow("Fenster 2") #cv2.imshow("Fenster 2",b2) a=np.sqrt(b[1:,:]**2+b2[:-1,:]**2) # b und b2 werden zum Kantenbild a verrechnet #Kantenbild plt.imshow(a,cmap=plt.get_cmap('gray')) #plt.show() #cv2.waitKey(0) #cv2.destroyAllWindows() median2 = np.percentile(a,80) z = a.shape[0] #y z2 = range(0,z) s = a.shape[1] #x s2 = range(0,s) alle_koordinaten = [] for i in z2: for j in s2: alle_koordinaten.append((i,j)) kandidaten = [ p for p in alle_koordinaten if a[p[0],p[1]]>median2 ] #Rumspielbar...mit Schwellenwert def kurvenversuch(): #Nur zum Veranschaulichen! a_als_farbbild = cv2.cvtColor(a, cv2.COLOR_GRAY2BGR) #a ist ein s/w-bild, um farbe überhaupt anzeigen zu können, wird es in ein bgr konvertiert for i,j in kandidaten: cv2.circle(a_als_farbbild,(j,i),1,(1,0,0),-1) #cv2.imshow("1:",a_als_farbbild) #cv2.waitKey(0) #cv2.destroyAllWindows() #print kandidaten #print len(kandidaten) #Koordinaten x und y #print len(a) #Helligkeitswerte Niveaulinien + Kantenprogramm verbunden contouren = res2 #Liste in Listen kant = kandidaten #hat Schwellenwert #Kantenbild = a Schwellw = np.median(a) beste_Werte = [] def check(cont, Kant): hell = 0. #auf 0 gesetzt for pkt in cont: try: # try aufgrund der Rundungsfehler, über 319 hell += a[int(round(pkt[0])),int(round(pkt[1]))] #werden aufgerechnet except: pass if hell > Schwellw*len(cont): return True else: return False for cont in contouren: if check(cont, a): #print cont beste_Werte.append(cont) else: pass #print beste_Werte Turtle.mod von Stefan Born def smooth(kont): #? for i in range(1,len(kont)-1): kont[i]=1/3.*(kont[i-1]+kont[i]+kont[i+1]) class MyTurtle(turtle.Turtle): #? def turn_and_move(self,p): self.setheading(self.towards(p)) self.goto(p) class turtle_world(object): def __init__(self,bild): #pencv speichert die Bilder als BGR! self.screen=turtle.Screen() self.xsize=bild.shape[1] self.ysize=bild.shape[0] turtle.screensize(self.xsize,self.ysize) misc.imsave("zwischenbild_.gif",bild) turtle.bgpic("zwischenbild_.gif") self.t=MyTurtle() self.t.pensize(1) self.t.pencolor("blue") self.t.shape("turtle") self.t.speed(0) self.t.tracer(1,delay=0) def image_to_turtle(self,point): '''Rechnet die Koordinaten des Bild-Arrays auf die Turtle-Koordinaten um. Returns: Koordinatentupel.''' return (point[1]-(self.xsize//2),(self.ysize//2)-point[0]) def turtle_to_image(self,point): '''Rechnet die Turtle-Koordinaten auf Bild-Array-Koordinaten um. Returns: numpy-Vektor mit Bildkoordinaten''' return np.array([self.ysize//2-point[1], point[0]+self.xsize//2]) #______________________ def bewege_turtle_auf_bild(bild,kontouren): '''Lässt Turtle auf Hintergrundbild laufen. Dabei ist bild ein BGR-Bild (opencv-Farbbild) und kontouren eine Liste von Listen von Punkten.''' tw=turtle_world(bild) ### Hier müsste die Bewegung der Turtle hin for kontour in kontouren: tw.t.penup() for p in kontour: tw.t.turn_and_move(tw.image_to_turtle(p)) tw.t.pendown() def main(): #l=misc.ascent() bild_farbbild=cv2.cvtColor(np.uint8(bild),cv2.cv.CV_GRAY2BGR) #kontour=[[50,50],[70,400],[200,100],[300,300]] #hier Konturen übergeben? kontouren=beste_Werte bewege_turtle_auf_bild(bild_farbbild,kontouren) return 0 if __name__ == '__main__': main() turtle.exitonclick() Das Ergebnis:\\ {{eimer.png}}