diff --git a/ext/opencv/mat.cpp b/ext/opencv/mat.cpp index c14971a..e5b8a77 100644 --- a/ext/opencv/mat.cpp +++ b/ext/opencv/mat.cpp @@ -41,12 +41,6 @@ namespace rubyopencv { return mat2obj(ptr, rb_klass); } - cv::Mat* empty_mat() { - cv::Mat* m = new cv::Mat(); - m->allocator = &allocator; - return m; - } - void free_mat(void* ptr) { if (ptr) { cv::Mat* dataptr = (cv::Mat*)ptr; @@ -96,7 +90,7 @@ namespace rubyopencv { return Qnil; } - dataptr = empty_mat(); + dataptr = new cv::Mat(); tempdata.copyTo(*dataptr); RTYPEDDATA_DATA(self) = dataptr; @@ -122,7 +116,7 @@ namespace rubyopencv { VALUE rb_zeros(VALUE self, VALUE rows, VALUE cols, VALUE type) { cv::Mat* destptr = NULL; try { - destptr = empty_mat(); + destptr = new cv::Mat(); cv::Mat z = cv::Mat::zeros(NUM2INT(rows), NUM2INT(cols), NUM2INT(type)); z.copyTo(*destptr); } @@ -147,7 +141,7 @@ namespace rubyopencv { VALUE rb_ones(VALUE self, VALUE rows, VALUE cols, VALUE type) { cv::Mat* destptr = NULL; try { - destptr = empty_mat(); + destptr = new cv::Mat(); cv::Mat z = cv::Mat::ones(NUM2INT(rows), NUM2INT(cols), NUM2INT(type)); z.copyTo(*destptr); } @@ -172,7 +166,7 @@ namespace rubyopencv { VALUE rb_eye(VALUE self, VALUE rows, VALUE cols, VALUE type) { cv::Mat* destptr = NULL; try { - destptr = empty_mat(); + destptr = new cv::Mat(); cv::Mat z = cv::Mat::eye(NUM2INT(rows), NUM2INT(cols), NUM2INT(type)); z.copyTo(*destptr); } @@ -195,7 +189,7 @@ namespace rubyopencv { cv::Mat* selfptr = obj2mat(self); cv::Mat* dataptr = NULL; try { - dataptr = empty_mat(); + dataptr = new cv::Mat(); selfptr->copyTo(*dataptr); RTYPEDDATA_DATA(clone) = dataptr; } @@ -216,7 +210,7 @@ namespace rubyopencv { return Qnil; } - dataptr = empty_mat(); + dataptr = new cv::Mat(); tmp.copyTo(*dataptr); } catch (cv::Exception& e) { @@ -341,7 +335,7 @@ namespace rubyopencv { data[i] = (uchar)(NUM2INT(RARRAY_AREF(buf, i)) & 0xff); } - cv::Mat* dstptr = empty_mat(); + cv::Mat* dstptr = new cv::Mat(); try { cv::imdecode(data, NUM2INT(flags), dstptr); } @@ -596,7 +590,7 @@ namespace rubyopencv { */ VALUE rb_add(VALUE self, VALUE other) { cv::Mat* selfptr = obj2mat(self); - cv::Mat* retptr = empty_mat(); + cv::Mat* retptr = new cv::Mat(); cv::Mat tmp; try { @@ -632,7 +626,7 @@ namespace rubyopencv { */ VALUE rb_sub(VALUE self, VALUE other) { cv::Mat* selfptr = obj2mat(self); - cv::Mat* retptr = empty_mat(); + cv::Mat* retptr = new cv::Mat(); cv::Mat tmp; try { @@ -668,7 +662,7 @@ namespace rubyopencv { */ VALUE rb_mul(VALUE self, VALUE other) { cv::Mat* selfptr = obj2mat(self); - cv::Mat* retptr = empty_mat(); + cv::Mat* retptr = new cv::Mat(); cv::Mat tmp; try { @@ -700,7 +694,7 @@ namespace rubyopencv { */ VALUE rb_div(VALUE self, VALUE other) { cv::Mat* selfptr = obj2mat(self); - cv::Mat* retptr = empty_mat(); + cv::Mat* retptr = new cv::Mat(); cv::Mat tmp; try { @@ -734,7 +728,7 @@ namespace rubyopencv { VALUE value, mask; rb_scan_args(argc, argv, "11", &value, &mask); cv::Mat* selfptr = obj2mat(self); - cv::Mat* dstptr = empty_mat(); + cv::Mat* dstptr = new cv::Mat(); try { cv::Mat tmp; cv::Scalar* s = Scalar::obj2scalar(value); @@ -778,7 +772,7 @@ namespace rubyopencv { cv::Mat* src1ptr = obj2mat(src1); cv::Mat* src2ptr = obj2mat(src2); - cv::Mat* dstptr = empty_mat(); + cv::Mat* dstptr = new cv::Mat(); try { cv::addWeighted(*src1ptr, NUM2DBL(alpha), *src2ptr, NUM2DBL(beta), NUM2DBL(gamma), *dstptr, dtype_value); } @@ -806,7 +800,7 @@ namespace rubyopencv { double beta_value = NIL_P(beta) ? 0 : NUM2DBL(beta); cv::Mat* selfptr = obj2mat(self); - cv::Mat* dstptr = empty_mat(); + cv::Mat* dstptr = new cv::Mat(); try { cv::convertScaleAbs(*selfptr, *dstptr, alpha_value, beta_value); } @@ -837,7 +831,7 @@ namespace rubyopencv { double beta_value = NIL_P(beta) ? 0 : NUM2DBL(beta); cv::Mat* selfptr = obj2mat(self); - cv::Mat* dstptr = empty_mat(); + cv::Mat* dstptr = new cv::Mat(); try { selfptr->convertTo(*dstptr, NUM2INT(rtype), alpha_value, beta_value); } diff --git a/ext/opencv/mat.hpp b/ext/opencv/mat.hpp index e9bacd2..3d6ed21 100644 --- a/ext/opencv/mat.hpp +++ b/ext/opencv/mat.hpp @@ -17,7 +17,6 @@ namespace rubyopencv { cv::Mat* obj2mat(VALUE obj); VALUE mat2obj(cv::Mat* ptr); VALUE mat2obj(cv::Mat* ptr, VALUE klass); - cv::Mat* empty_mat(); class RubyMatAllocator: public cv::MatAllocator { public: diff --git a/ext/opencv/mat_imgproc.cpp b/ext/opencv/mat_imgproc.cpp index 4df4836..18da9b0 100644 --- a/ext/opencv/mat_imgproc.cpp +++ b/ext/opencv/mat_imgproc.cpp @@ -34,7 +34,7 @@ namespace rubyopencv { int border_type_value = NIL_P(border_type) ? cv::BORDER_DEFAULT : NUM2INT(border_type); cv::Mat* selfptr = obj2mat(self); - cv::Mat* destptr = empty_mat(); + cv::Mat* destptr = new cv::Mat(); try { cv::Sobel(*selfptr, *destptr, NUM2INT(ddepth), NUM2INT(dx), NUM2INT(dy), ksize_value, scale_value, delta_value, border_type_value); @@ -67,7 +67,7 @@ namespace rubyopencv { bool l2gradient_value = RTEST(l2gradient) ? true : false; cv::Mat* selfptr = obj2mat(self); - cv::Mat* destptr = empty_mat(); + cv::Mat* destptr = new cv::Mat(); try { cv::Canny(*selfptr, *destptr, NUM2DBL(threshold1), NUM2DBL(threshold2), aperture_size_value, l2gradient_value); @@ -102,7 +102,7 @@ namespace rubyopencv { int border_type_value = NIL_P(border_type) ? cv::BORDER_DEFAULT : NUM2INT(border_type); cv::Mat* selfptr = obj2mat(self); - cv::Mat* destptr = empty_mat(); + cv::Mat* destptr = new cv::Mat(); try { cv::Laplacian(*selfptr, *destptr, NUM2INT(ddepth), ksize_value, scale_value, delta_value, border_type_value); @@ -130,7 +130,7 @@ namespace rubyopencv { rb_scan_args(argc, argv, "11", &code, &dcn); int dcn_value = NIL_P(dcn) ? 0 : NUM2INT(dcn); - cv::Mat* destptr = empty_mat(); + cv::Mat* destptr = new cv::Mat(); cv::Mat* selfptr = obj2mat(self); try { cv::cvtColor(*selfptr, *destptr, NUM2INT(code), dcn_value); @@ -164,7 +164,7 @@ namespace rubyopencv { rb_scan_args(argc, argv, "13", &size, &inv_scale_x, &inv_scale_y, &interpolation); cv::Size* sizeptr = Size::obj2size(size); cv::Mat* selfptr = obj2mat(self); - cv::Mat* destptr = empty_mat(); + cv::Mat* destptr = new cv::Mat(); double sx = NIL_P(inv_scale_x) ? 0 : NUM2DBL(inv_scale_x); double sy = NIL_P(inv_scale_y) ? 0 : NUM2DBL(inv_scale_y); int method = NIL_P(interpolation) ? CV_INTER_LINEAR : NUM2INT(interpolation); @@ -195,7 +195,7 @@ namespace rubyopencv { int border_type_value = NIL_P(border_type) ? cv::BORDER_DEFAULT : NUM2INT(border_type); cv::Mat* selfptr = obj2mat(self); - cv::Mat* dstptr = empty_mat(); + cv::Mat* dstptr = new cv::Mat(); try { cv::blur(*selfptr, *dstptr, *(Size::obj2size(ksize)), anchor_value, border_type_value); } @@ -227,7 +227,7 @@ namespace rubyopencv { int border_type_value = NIL_P(border_type) ? cv::BORDER_DEFAULT : NUM2INT(border_type); cv::Mat* selfptr = obj2mat(self); - cv::Mat* dstptr = empty_mat(); + cv::Mat* dstptr = new cv::Mat(); try { cv::GaussianBlur(*selfptr, *dstptr, *(Size::obj2size(ksize)), NUM2DBL(sigma_x), sigma_y_value, border_type_value); diff --git a/ext/opencv/opencv.cpp b/ext/opencv/opencv.cpp index 2eedc53..d5ea3fc 100644 --- a/ext/opencv/opencv.cpp +++ b/ext/opencv/opencv.cpp @@ -20,6 +20,7 @@ namespace rubyopencv { VALUE rb_module = Qnil; + Mat::RubyMatAllocator allocator; VALUE rb_module_opencv() { return rb_module; @@ -78,6 +79,7 @@ namespace rubyopencv { extern "C" void Init_opencv() { + cv::Mat::setDefaultAllocator(&allocator); cv::redirectError(error_callback, NULL, NULL); rb_module = rb_define_module("Cv"); diff --git a/ext/opencv/videocapture.cpp b/ext/opencv/videocapture.cpp index b85d589..d4d516e 100644 --- a/ext/opencv/videocapture.cpp +++ b/ext/opencv/videocapture.cpp @@ -84,7 +84,7 @@ namespace rubyopencv { */ VALUE rb_read(VALUE self) { cv::VideoCapture* selfptr = obj2videocapture(self); - cv::Mat* m = Mat::empty_mat(); + cv::Mat* m = new cv::Mat(); try { (*selfptr) >> (*m); @@ -233,7 +233,7 @@ namespace rubyopencv { cv::VideoCapture* selfptr = obj2videocapture(self); bool ret = false; - cv::Mat* dstptr = Mat::empty_mat(); + cv::Mat* dstptr = new cv::Mat(); try { ret = selfptr->retrieve(*dstptr, flag_value); if (!ret) {