/
cameras.go
109 lines (84 loc) · 1.63 KB
/
cameras.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package colmap
import (
"bufio"
"encoding/binary"
"fmt"
"io"
"os"
"github.com/EliCDavis/bitlib"
)
type CameraModel int
const (
SIMPLE_PINHOLE CameraModel = iota
PINHOLE
SIMPLE_RADIAL
RADIAL
OPENCV
OPENCV_FISHEYE
FULL_OPENCV
FOV
SIMPLE_RADIAL_FISHEYE
RADIAL_FISHEYE
THIN_PRISM_FISHEYE
)
func (cm CameraModel) NumParameters() int {
switch cm {
case SIMPLE_PINHOLE:
return 3
case PINHOLE:
return 4
case SIMPLE_RADIAL:
return 4
case RADIAL:
return 5
case OPENCV:
return 8
case OPENCV_FISHEYE:
return 8
case FULL_OPENCV:
return 12
case FOV:
return 5
case SIMPLE_RADIAL_FISHEYE:
return 4
case RADIAL_FISHEYE:
return 5
case THIN_PRISM_FISHEYE:
return 12
}
panic(fmt.Errorf("unimplemented Camera Model Parameter Count %d", cm))
}
type Camera struct {
ID int
Model CameraModel
Width uint64
Height uint64
Params []float64
}
func ReadCamerasBinary(in io.Reader) ([]Camera, error) {
reader := bitlib.NewReader(in, binary.LittleEndian)
numCameras := reader.UInt64()
cameras := make([]Camera, numCameras)
for i := uint64(0); i < numCameras; i++ {
c := Camera{}
c.ID = int(reader.Int32())
c.Model = CameraModel(reader.Int32())
c.Width = reader.UInt64()
c.Height = reader.UInt64()
paramCount := c.Model.NumParameters()
c.Params = make([]float64, paramCount)
for pI := 0; pI < paramCount; pI++ {
c.Params[pI] = reader.Float64()
}
cameras[i] = c
}
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))
}