diff --git a/README.md b/README.md index 8d3c63c..1c9440d 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,14 @@ Structs for interacting with reconstruction data from different SFM programs +* COLMAP + * Cameras + * Points +* OpenSFM + * reconstruction.json +* Meshroom + * cameras.sfm + ## COLMAP ### Point Data @@ -18,7 +26,7 @@ import ( ) func main() { - points, err := colmap.ReadPoints3DBinary("ColmapProject/sparse/0/points3D.bin") + points, err := colmap.LoadPoints3DBinary("ColmapProject/sparse/0/points3D.bin") if err != nil { panic(err) } @@ -42,7 +50,7 @@ import ( ) func main() { - cameras, err := colmap.ReadCamerasBinary("ColmapProject/sparse/0/cameras.bin") + cameras, err := colmap.LoadCamerasBinary("ColmapProject/sparse/0/cameras.bin") if err != nil { panic(err) } diff --git a/colmap/cameras.go b/colmap/cameras.go index 81eee07..95846a3 100644 --- a/colmap/cameras.go +++ b/colmap/cameras.go @@ -1,8 +1,10 @@ package colmap import ( + "bufio" "encoding/binary" "fmt" + "io" "os" "github.com/EliCDavis/bitlib" @@ -70,14 +72,8 @@ type Camera struct { Params []float64 } -func ReadCamerasBinary(filename string) ([]Camera, error) { - f, err := os.Open(filename) - if err != nil { - return nil, err - } - defer f.Close() - - reader := bitlib.NewReader(f, binary.LittleEndian) +func ReadCamerasBinary(in io.Reader) ([]Camera, error) { + reader := bitlib.NewReader(in, binary.LittleEndian) numCameras := reader.UInt64() cameras := make([]Camera, numCameras) @@ -101,3 +97,13 @@ func ReadCamerasBinary(filename string) ([]Camera, error) { return cameras, reader.Error() } + +func LoadCamerasBinary(filename string) ([]Camera, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + + return ReadCamerasBinary(bufio.NewReader(f)) +} diff --git a/colmap/points.go b/colmap/points.go index 247f676..8ad8f7e 100644 --- a/colmap/points.go +++ b/colmap/points.go @@ -1,8 +1,10 @@ package colmap import ( + "bufio" "encoding/binary" "image/color" + "io" "os" "github.com/EliCDavis/bitlib" @@ -26,14 +28,8 @@ type Point3D struct { Tracks []Point3DTrack // as (IMAGE_ID, POINT2D_IDX) } -func ReadPoints3DBinary(filename string) ([]Point3D, error) { - f, err := os.Open(filename) - if err != nil { - return nil, err - } - defer f.Close() - - reader := bitlib.NewReader(f, binary.LittleEndian) +func ReadPoints3DBinary(in io.Reader) ([]Point3D, error) { + reader := bitlib.NewReader(in, binary.LittleEndian) numPoints := reader.UInt64() points := make([]Point3D, numPoints) @@ -71,3 +67,13 @@ func ReadPoints3DBinary(filename string) ([]Point3D, error) { return points, reader.Error() } + +func LoadPoints3DBinary(filename string) ([]Point3D, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + + return ReadPoints3DBinary(bufio.NewReader(f)) +} diff --git a/meshroom/camera.go b/meshroom/camera.go index 9ec077e..245957f 100644 --- a/meshroom/camera.go +++ b/meshroom/camera.go @@ -1,6 +1,10 @@ package meshroom -import "github.com/EliCDavis/sfm" +import ( + "io" + + "github.com/EliCDavis/sfm" +) type Version []string @@ -62,6 +66,10 @@ type Cameras struct { Poses []Pose `json:"poses"` } +func ReadCameras(in io.Reader) (Cameras, error) { + return sfm.ReadJSON[Cameras](in) +} + func LoadCameras(filename string) (Cameras, error) { return sfm.LoadJSONFile[Cameras](filename) } diff --git a/opensfm/reconstruction.go b/opensfm/reconstruction.go index 8a4191c..b41acd9 100644 --- a/opensfm/reconstruction.go +++ b/opensfm/reconstruction.go @@ -1,6 +1,10 @@ package opensfm -import "github.com/EliCDavis/sfm" +import ( + "io" + + "github.com/EliCDavis/sfm" +) // ReconstructionJson represents the reconstruction.json output by OpenSFM type ReconstructionJsonSchema []ReconstructionSchema @@ -61,6 +65,10 @@ type ReferenceLLA struct { Altitude float64 `json:"altitude"` } +func ReadReconstruction(in io.Reader) (ReconstructionJsonSchema, error) { + return sfm.ReadJSON[ReconstructionJsonSchema](in) +} + func LoadReconstruction(filename string) (ReconstructionJsonSchema, error) { return sfm.LoadJSONFile[ReconstructionJsonSchema](filename) } diff --git a/util.go b/util.go index a8dcb50..28e2a92 100644 --- a/util.go +++ b/util.go @@ -2,6 +2,7 @@ package sfm import ( "encoding/json" + "io" "os" ) @@ -13,3 +14,12 @@ func LoadJSONFile[T any](filename string) (T, error) { } return data, json.Unmarshal(fileData, &data) } + +func ReadJSON[T any](in io.Reader) (T, error) { + var data T + fileData, err := io.ReadAll(in) + if err != nil { + return data, err + } + return data, json.Unmarshal(fileData, &data) +}