diff --git a/ext/opencv/cvmat.cpp b/ext/opencv/cvmat.cpp index 3e75c56..f6c157c 100644 --- a/ext/opencv/cvmat.cpp +++ b/ext/opencv/cvmat.cpp @@ -594,7 +594,8 @@ rb_to_IplConvKernel(VALUE self, VALUE anchor) { CvMat *src = CVMAT(self); CvPoint p = VALUE_TO_CVPOINT(anchor); - IplConvKernel *kernel = cvCreateStructuringElementEx(src->cols, src->rows, p.x, p.y, CV_SHAPE_CUSTOM, src->data.i); + IplConvKernel *kernel = rb_cvCreateStructuringElementEx(src->cols, src->rows, p.x, p.y, + CV_SHAPE_CUSTOM, src->data.i); return DEPEND_OBJECT(cIplConvKernel::rb_class(), kernel, self); } diff --git a/ext/opencv/iplconvkernel.cpp b/ext/opencv/iplconvkernel.cpp index 317cd27..2346663 100644 --- a/ext/opencv/iplconvkernel.cpp +++ b/ext/opencv/iplconvkernel.cpp @@ -104,7 +104,8 @@ rb_initialize(int argc, VALUE *argv, VALUE self) for (int i = 0; i < num_values; i++) _values[i] = NUM2INT(values_ptr[i]); } - DATA_PTR(self) = cvCreateStructuringElementEx(_cols, _rows, NUM2INT(anchor_x), NUM2INT(anchor_y),shape_type, _values); + DATA_PTR(self) = rb_cvCreateStructuringElementEx(_cols, _rows, NUM2INT(anchor_x), NUM2INT(anchor_y), + shape_type, _values); return self; } diff --git a/ext/opencv/opencv.cpp b/ext/opencv/opencv.cpp index 9ef5cdf..6b357b3 100644 --- a/ext/opencv/opencv.cpp +++ b/ext/opencv/opencv.cpp @@ -216,6 +216,37 @@ rb_cvCreateImage(CvSize size, int depth, int channels) return ptr; } +/* + * Creates a structuring element + * When memory allocation is failed, run GC and retry it + */ +IplConvKernel * +rb_cvCreateStructuringElementEx(int cols, int rows, + int anchorX, int anchorY, + int shape, int *values) +{ + IplConvKernel* ptr = NULL; + try { + ptr = cvCreateStructuringElementEx(cols, rows, anchorX, anchorY, shape, values); + } + catch(cv::Exception& e) { + if (e.code != CV_StsNoMem) + rb_raise(rb_eRuntimeError, "%s", e.what()); + + rb_gc_start(); + try { + ptr = cvCreateStructuringElementEx(cols, rows, anchorX, anchorY, shape, values); + } + catch (cv::Exception& e) { + if (e.code == CV_StsNoMem) + rb_raise(rb_eNoMemError, "%s", e.what()); + else + rb_raise(rb_eRuntimeError, "%s", e.what()); + } + } + return ptr; +} + VALUE rb_module; VALUE rb_opencv_constants; diff --git a/ext/opencv/opencv.h b/ext/opencv/opencv.h index befa0f4..07dbfc4 100644 --- a/ext/opencv/opencv.h +++ b/ext/opencv/opencv.h @@ -188,6 +188,7 @@ void define_ruby_module(); void* rb_cvAlloc(size_t size); CvMat* rb_cvCreateMat(int height, int width, int type); IplImage* rb_cvCreateImage(CvSize size, int depth, int channels); +IplConvKernel* rb_cvCreateStructuringElementEx(int cols, int rows, int anchorX, int anchorY, int shape, int *values); // Ruby/OpenCV inline functions inline CvArr*