From 27818da2494511435d5f99be343ec280be8cd256 Mon Sep 17 00:00:00 2001 From: Chih-Wei Chang Date: Tue, 17 Feb 2015 00:14:10 +0800 Subject: [PATCH] Add *mat64.Dense to cv::Mat converter. --- gocv/gocv.go | 17 ++++++++++++++++- gocv/gocv_core.cpp | 21 +++++++++++++++++++++ gocv/gocv_core.hpp | 5 +++++ gocv/gocv_core.i | 9 ++++++--- gocv/gocv_test.go | 10 ++++++++++ 5 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 gocv/gocv_core.cpp create mode 100644 gocv/gocv_core.hpp diff --git a/gocv/gocv.go b/gocv/gocv.go index 82196d6..05ab78c 100644 --- a/gocv/gocv.go +++ b/gocv/gocv.go @@ -29,7 +29,7 @@ func NewGcvSize2f64(x, y float64) GcvSize2f64_ { return NewGcvSize2f64_(float64(x), float64(y)) } -// Convert Mat, which defined by SWIG, to mat64.Dense. +// 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. @@ -52,3 +52,18 @@ func MatToMat64(mat Mat) *mat64.Dense { return mat64.NewDense(row, col, data) } + +// Convert *mat64.Dense to Mat +func ToMat(mat *mat64.Dense) Mat { + 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 ToMat_(row, col, rawData) +} diff --git a/gocv/gocv_core.cpp b/gocv/gocv_core.cpp new file mode 100644 index 0000000..d5b4256 --- /dev/null +++ b/gocv/gocv_core.cpp @@ -0,0 +1,21 @@ +#include +#include +#include +#include + +#include "gocv_core.hpp" + +cv::Mat ToMat_(int row, int col, std::vector data) { + assert(row * col == data.size()); + + cv::Mat mat = cv::Mat(row, col, CV_64F); + + for (int i = 0; i < row; ++i) { + for (int j = 0; j < col; ++j) { + mat.at(i, j) = data[i*col + j]; + } + + } + + return mat; +} diff --git a/gocv/gocv_core.hpp b/gocv/gocv_core.hpp new file mode 100644 index 0000000..9210e09 --- /dev/null +++ b/gocv/gocv_core.hpp @@ -0,0 +1,5 @@ +#include +#include +#include + +cv::Mat ToMat_(int row, int col, std::vector data); diff --git a/gocv/gocv_core.i b/gocv/gocv_core.i index f14232c..47e782e 100644 --- a/gocv/gocv_core.i +++ b/gocv/gocv_core.i @@ -1,9 +1,11 @@ -%include "std_vector.i" - %{ #include "opencv2/core/core.hpp" +#include "gocv_core.hpp" %} +%include "std_vector.i" +%include "gocv_core.hpp" + /* Classes defined in core.hpp */ namespace cv { @@ -295,5 +297,6 @@ namespace std { %template(GcvPoint2f32Vector) vector; %template(GcvIntVector) vector; - %template(GcvFloatVector) vector; + %template(GcvFloat32Vector) vector; + %template(GcvFloat64Vector) vector; }; diff --git a/gocv/gocv_test.go b/gocv/gocv_test.go index 228cba8..4c082fb 100644 --- a/gocv/gocv_test.go +++ b/gocv/gocv_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/davecgh/go-spew/spew" + "github.com/gonum/matrix/mat64" ) func TestNewGcvPoint3f32(t *testing.T) { @@ -26,3 +27,12 @@ func TestMat(t *testing.T) { mat2 := NewMat(mat) spew.Dump(mat2) } + +func TestToMat(t *testing.T) { + mat := mat64.NewDense(3, 2, []float64{ + 0, 1, + 1.23, 4, + -12.3, -4, + }) + spew.Dump(ToMat(mat)) +}