Esempio n. 1
0
def run(algorithm):
    # Schwellwerte fuer die Segmentierung des Spielers
    threshold_value = 40
    depth_value = 170
    skeleton = skeletonization.Skeleton()
    while True:
        # Tiefenbild erzeugen
        depthvalues = depth.get_better_depth()
        # Spielersegmentierung
        depth_seg, depth_image = player_segmentation.player_segmentation(depthvalues, threshold_value, depth_value)
        # Glaetten des segmentierten Bildes
        cv.Smooth(depth_seg, depth_seg, smoothtype=cv.CV_MEDIAN, param1=5, param2=5)

        # Distance Map berechnen und das Skelett daraus extrahieren
        if algorithm == "distancetransform":
            diff_img, dist_gradient = skeleton.distance_skeleton(depth_seg)
            diff = image_conversion.cv2array(diff_img)
            diff = 255.0 * numpy.logical_and(diff >= 0.2, diff <= 1)
            diff = diff.astype(numpy.uint8)
            diff_img = image_conversion.array2cv(diff)

        # Skelettierung mittels Thinning. Innerhalb von Python-Wrapper
        # wird ein C++-Programm aufgerufen, in dem das Thinning
        # implementiert ist.
        elif algorithm == "thinning":
            greyscale_array = image_conversion.cv2array(depth_seg)
            new_g = greyscale_array.reshape((480, 640))
            new_g = pythonWrapper.reflectimage_band(new_g, 1)

        # Anzeige des Spielers (segmentiert) und des Distanz-Skeletts
        cv.ShowImage("Spieler", depth_seg)
        cv.ShowImage("Distanz-Skeltt", diff_img)

        if cv.WaitKey(10) == 27:
            break
    def distance_skeleton(self, img):
        # Ein Zielbild bereitstellen, um das Ergebnis der Distance
        # Transformation zu speichern
        dist_img = cv.CreateImage(cv.GetSize(img), 32, 1)
        # Distanztransformation
        cv.DistTransform(img, dist_img, distance_type=cv.CV_DIST_L2)
        # Konvertierung von CV-Bildobjekt zu Numpy-Array
        dist_img_mat = image_conversion.cv2array(dist_img)
        # Normalisierung der Distance Map
        max_of_dist = dist_img_mat.max()
        dist_img_mat = dist_img_mat / max_of_dist
        # Zurueck konvertieren
        dist_img = image_conversion.array2cv(dist_img_mat)
        # Erste Stufe fuer das Pruning: Gradientbild berechnen und
        # segmentieren des Gradientenbildes
        dist_gradient = self.pruning(dist_img, 1)
        dist_gradient_mat = image_conversion.cv2array(dist_gradient)
        dist_img_mat = image_conversion.cv2array(dist_img)
        # Zweite Stufe fuer das Pruning: Differenzbild aus Distanzbild und
        # segmentiertem Gradientenbild
        diff = dist_img_mat - dist_gradient_mat
        diff = diff * 1.0
        diff_img = image_conversion.array2cv(diff)

        return diff_img, dist_img
def player_segmentation(depth_image_input,threshold_value,depth_value):
    
   #Umwandlung in ein Numpy-Array
   depth = image_conversion.cv2array(depth_image_input)
   
   #Schwellwerte
   threshold = threshold_value
   current_depth = depth_value
        
   #Segmentierung
   depth = 255 * np.logical_and(depth >= current_depth - threshold,
                                 depth <= current_depth + threshold)
                                 
   #depth in ein Bild umwandeln (ist bis hierhin ein Numpy-Array)
   depth = depth.astype(np.uint8)
   depth_image = cv.CreateImageHeader((depth.shape[1], depth.shape[0]), cv.IPL_DEPTH_8U,1)
   #Mit den Daten aus dem Array fuellen
   cv.SetData(depth_image, depth.tostring(),
               depth.dtype.itemsize * depth.shape[1])  
   #Glaetten
   cv.Smooth(depth_image, depth_image, smoothtype=cv.CV_GAUSSIAN, param1=3, param2=0, param3=0, param4=0)
   #Dilatation um Loecher und Rauschen zu mindern
   depth_seg = dilate_image(depth_image)        

   return depth_seg, depth_image
def static():
    #Invertierung der Farbe, damit Objekt weiss und Hintergrund schwarz
    img = cv.LoadImage("hand.jpg")
    grey_img = cv.CreateImage(cv.GetSize(img),8,1)
    grey_img_mat = image_conversion.cv2array(grey_img)

    for i in xrange(len(grey_img_mat[:,1])):
        for j in xrange(len(grey_img_mat[1,:])):
            if grey_img_mat[i,j] == 255:
                grey_img_mat[i,j] = 0
            else:
                grey_img_mat[i,j] = 1   
                
    print(lib.static_function(grey_img_mat,grey_img_mat.shape[1],grey_img_mat.shape[0]))
Esempio n. 5
0
def test(image):

    grey_img = cv.CreateImage(cv.GetSize(image),8,1)
    dist_img = cv.CreateImage(cv.GetSize(image),32,1)
    cv.CvtColor(image,grey_img,cv.CV_BGR2GRAY)

    #Invertierung der Farbe, damit Objekt weiss und Hintergrund schwarz
    grey_img_mat = image_conversion.cv2array(grey_img)

    for i in xrange(len(grey_img_mat[:,1])):
        for j in xrange(len(grey_img_mat[1,:])):
            if grey_img_mat[i,j] == 255:
                grey_img_mat[i,j] = 0
            else:
                grey_img_mat[i,j] = 1   
    grey_img = image_conversion.array2cv(grey_img_mat)
    #Distance Transform
    dist_img, dist_map = skeleton.distance_skeleton(grey_img)
    #Pruning/Segmentierung des Skeletts
    dist_gradient = skeleton.pruning(dist_img,1)
    dist_gradient_thresh_mat = image_conversion.cv2array(dist_gradient)
    #Differenz der Distance-Map und dem segmentierten Gradientbild
    dist_img_mat = image_conversion.cv2array(dist_img)
    diff = dist_img_mat - dist_gradient_thresh_mat      
    #Schwellwertbasierte Segmentierung des Differenzbildes. Ergibt ein schoenes Skelett
    diff = 255.0 * numpy.logical_and(diff >= 0.2, diff <=1)
    #diff = diff.astype(numpy.float32)
    diff = diff.astype(numpy.uint8)
    diff_img = image_conversion.array2cv(diff)
    
    

    features = skeleton_improvement.calcGoodFeatures(diff_img)
    
    #return features, image, dist_img, diff_img, drawImage
    return diff_img, features, dist_gradient, dist_map
    def pruning(self, skeleton_img, sigma):
        skeleton_img_mat = image_conversion.cv2array(skeleton_img)
        # Ausgabe-Array fuer das Ergebnis der Gradientberechnung
        gradient_output = numpy.empty_like(skeleton_img_mat)
        # Gradienten-Berechnung
        ndimage.gaussian_gradient_magnitude(skeleton_img_mat, sigma, gradient_output)
        # Normalisierung
        gradient_output /= gradient_output.max()
        # Array ins Bild umwandeln
        grad_img = image_conversion.array2cv(gradient_output)
        # Schwellwertbasierte Segmentierung des Gradientbildes
        dist_gradient_thresh = cv.CreateImage(cv.GetSize(grad_img), 8, 1)
        cv.InRangeS(grad_img, 0.6, 1, dist_gradient_thresh)

        return dist_gradient_thresh
liste = png + jpg
skeleton = skeletonization.Skeleton()

descriptor = []

for i in liste:
	print os.path.join(workdir,i)
	img = cv.LoadImage(os.path.join(workdir,i))
	grey_img = cv.CreateImage(cv.GetSize(img),8,1)
	bin_img = cv.CreateImage(cv.GetSize(img),8,1)
	dist_img = cv.CreateImage(cv.GetSize(img),32,1)
	cv.CvtColor(img,grey_img,cv.CV_BGR2GRAY)

	#Invertierung der Farbe, damit Objekt weiss und Hintergrund schwarz
	grey_img_mat = image_conversion.cv2array(grey_img)
	
	for i in xrange(len(grey_img_mat[:,1])):
    		for j in xrange(len(grey_img_mat[1,:])):
        		if grey_img_mat[i,j] == 255:
            			grey_img_mat[i,j] = 0
        		else:
            			grey_img_mat[i,j] = 1       
			grey_img = image_conversion.array2cv(grey_img_mat)
	#Distance Transform
	dist_img = skeleton.distance_skeleton(grey_img)
	#Pruning/Segmentierung des Skeletts
	dist_gradient = skeleton.pruning(dist_img,1)
	dist_gradient_thresh_mat = image_conversion.cv2array(dist_gradient)
	#Differenz der Distance-Map und dem segmentierten Gradientbild
	dist_img_mat = image_conversion.cv2array(dist_img)
Esempio n. 8
0
def multipleCalls(num,features,img):
  i = 0
  while i < num:
    skeleton_improvement.startConnect(features,20,img)
    i = i + 1
  
img = cv.LoadImage("person.jpg")
#img2 = cv.LoadImage("person.jpg")

#corners1, image1, dist_img1, diff_img1, drawImage = test(img)
#corners2, image2, dist_img2, diff_img2 = test(img2)
diff_img, features, dist_gradient, dist_img = test(img)
skeleton_improvement.drawFeatures(features,diff_img)
#comparison.connectFeatures(diff_img,features,10)
#neighbours = skeleton_improvement.startConnect(features,20,img)
cProfile.run('skeleton_improvement.startConnect(features,20,img)')
cProfile.run('test(img)')

#skeleton_improvement.connectDFS(features)
print img.depth
diff_img_arr = image_conversion.cv2array(diff_img)
diff_img = image_conversion.array2cv(diff_img_arr)
cv.ShowImage("Diff-Image", diff_img)
cv.ShowImage("Image",img)
cv.SaveImage("hand-bfs.png",img)
cv.ShowImage("Gradient", dist_gradient)
cv.ShowImage("Distance", dist_img)


cv.WaitKey()