2017-01-15 4 views
0

Ich versuche, die go-skeltrack-Bibliothek mit einigen Tiefenbildern zu verwenden, die ich habe (nicht mit freenect). Dazu muss ich das mitgelieferte Beispiel ändern, indem ich die Kinect-Bilder durch meine eigenen ersetze. Dafür muss ich ein Bild lesen und später in eine []uint16 Variable umwandeln. Der Code, den ich versucht ist:Golang: Wie man ein image.image in uint16 umwandelt

file, err := os.Open("./images/4.png") 
if err != nil { 
    fmt.Println("4.png file not found!") 
    os.Exit(1) 
} 
defer file.Close() 

fileInfo, _ := file.Stat() 
var size int64 = fileInfo.Size() 
bytes := make([]byte, size) 

// read file into bytes 
buffer := bufio.NewReader(file) 
_, err = buffer.Read(bytes) 

integerImage := binary.BigEndian.Uint16(bytes) 

onDepthFrame(integerImage) 

Wo onDepthFrame eine Funktion ist, die die Form

func onDepthFrame(depth []uint16). 

hat, aber ich bin immer den folgenden Fehler beim Kompilieren:

./skeltrackOfflineImage. go: 155: kann nicht integerImage (type uint16) als type [] uint16 in argument zu onDepthFrame

Das bezieht sich natürlich auf die Tatsache, dass ich eine einzelne Ganzzahl anstelle eines Arrays generiert habe. Ich bin ziemlich verwirrt über die Art und Weise, wie Go Datentypen Konvertierung funktioniert. Bitte helfen Sie!

Vielen Dank im Voraus für Ihre Hilfe. Luis

+3

Ein Png ist keine Serie von Big Endian Uint16s. Was genau versuchst du zu tun? – JimB

Antwort

0

binary.BigEndian.Uint16 konvertiert zwei Bytes (in einem Slice) in einen 16-Bit-Wert unter Verwendung der Big-Endian-Byte-Reihenfolge. Wenn Sie Bytes zu einer Scheibe uint16 konvertieren möchten, sollten Sie binary.Read verwenden:

// This reads 10 uint16s from file. 
slice := make([]uint16, 10) 
err := binary.Read(file, binary.BigEndian, slice) 
0

Es klingt wie Sie suchen roh Pixel zu erhalten. Wenn das der Fall ist, empfehle ich nicht, die Datei direkt als Binärdatei zu lesen. Das bedeutet, dass Sie das Dateiformat selbst analysieren müssen, da Bilddateien mehr Informationen enthalten als nur die reinen Pixelwerte. Dafür gibt es bereits Tools im Image-Paket.

Dieser Code sollte Sie auf dem richtigen Weg bringen. Es liest RGBA-Werte, also endet es mit einem 1D-Array von Uint8's der Länge width * height * 4, da es vier Werte pro Pixel gibt.

https://play.golang.org/p/WUgHQ3pRla

import (
    "bufio" 
    "fmt" 
    "image" 
    "os" 

    // for decoding png files 
    _ "image/png" 
) 

// RGBA attempts to load an image from file and return the raw RGBA pixel values. 
func RGBA(path string) ([]uint8, error) { 
    file, err := os.Open(path) 
    if err != nil { 
     return nil, err 
    } 

    img, _, err := image.Decode(bufio.NewReader(file)) 
    if err != nil { 
     return nil, err 
    } 

    switch trueim := img.(type) { 
    case *image.RGBA: 
     return trueim.Pix, nil 
    case *image.NRGBA: 
     return trueim.Pix, nil 
    } 
    return nil, fmt.Errorf("unhandled image format") 
} 

Ich bin nicht ganz sicher, wo die uint16 Werte, die Sie benötigen, sollten herkommen, aber vermutlich ist es Daten pro Pixel, so dass der Code sollte sehr ähnlich sein, dies mit Ausnahme der Schalter auf trueim sollte wahrscheinlich nach etwas anderem suchen als image.RGBA. Werfen Sie einen Blick auf die anderen Bildtypen in https://golang.org/pkg/image

Verwandte Themen