85 lines
2.1 KiB
Go
85 lines
2.1 KiB
Go
package gocv
|
|
|
|
// #cgo CXXFLAGS: -std=c++11
|
|
// #cgo darwin pkg-config: opencv
|
|
// #cgo linux pkg-config: opencv
|
|
import "C"
|
|
import "github.com/gonum/matrix/mat64"
|
|
|
|
func NewGcvPoint3f32(pts ...float64) GcvPoint3f32_ {
|
|
// This make sure we have default values
|
|
safePts := getSafePts(pts, 3)
|
|
return NewGcvPoint3f32_(float32(safePts[0]), float32(safePts[1]), float32(safePts[2]))
|
|
}
|
|
|
|
func NewGcvPoint3f64(pts ...float64) GcvPoint3f64_ {
|
|
safePts := getSafePts(pts, 3)
|
|
return NewGcvPoint3f64_(safePts[0], safePts[1], safePts[2])
|
|
}
|
|
|
|
func NewGcvPoint2f32(pts ...float64) GcvPoint2f32_ {
|
|
safePts := getSafePts(pts, 2)
|
|
return NewGcvPoint2f32_(float32(safePts[0]), float32(safePts[1]))
|
|
}
|
|
|
|
func NewGcvPoint2f64(pts ...float64) GcvPoint2f64_ {
|
|
safePts := getSafePts(pts, 2)
|
|
return NewGcvPoint2f64_(safePts[0], safePts[1])
|
|
}
|
|
|
|
func NewGcvSize2f32(pts ...float64) GcvSize2f32_ {
|
|
safePts := getSafePts(pts, 2)
|
|
return NewGcvSize2f32_(float32(safePts[0]), float32(safePts[1]))
|
|
}
|
|
|
|
func NewGcvSize2f64(pts ...float64) GcvSize2f64_ {
|
|
safePts := getSafePts(pts, 2)
|
|
return NewGcvSize2f64_(safePts[0], safePts[1])
|
|
}
|
|
|
|
// Convert Mat, which defined by SWIG, to *mat64.Dense.
|
|
// The reason is the latter is much easier to handle
|
|
// in Go.
|
|
// GcvMat is assumed to be 2-dimensional matrix.
|
|
func GcvMatToMat64(mat GcvMat) *mat64.Dense {
|
|
col := mat.GetCols()
|
|
row := mat.GetRows()
|
|
|
|
data := []float64{}
|
|
|
|
for i := 0; i < row; i++ {
|
|
for j := 0; j < col; j++ {
|
|
if fltPtr, ok := mat.GcvAtf64(i, j).(*float64); ok {
|
|
data = append(data, *fltPtr)
|
|
} else {
|
|
panic("Non *float64 passed to MatToMat64")
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
return mat64.NewDense(row, col, data)
|
|
}
|
|
|
|
// Convert *mat64.Dense to Mat
|
|
func Mat64ToGcvMat(mat *mat64.Dense) GcvMat {
|
|
row, col := mat.Dims()
|
|
|
|
rawData := NewGcvFloat64Vector(int64(row * col))
|
|
|
|
for i := 0; i < row; i++ {
|
|
for j := 0; j < col; j++ {
|
|
rawData.Set(i*col+j, mat.At(i, j))
|
|
}
|
|
}
|
|
|
|
return Mat64ToGcvMat_(row, col, rawData)
|
|
}
|
|
|
|
func getSafePts(pts []float64, size int) []float64 {
|
|
// This make sure we have default values
|
|
safePts := make([]float64, size, size)
|
|
copy(safePts, pts)
|
|
|
|
return safePts
|
|
}
|