1
0
Fork 0
mirror of https://github.com/ruby-opencv/ruby-opencv synced 2023-03-27 23:22:12 -04:00

implemented rb_cvCreateMat and replaced cvCreateMat with rb_cvCreateMat to create a CvMat as much as possible

This commit is contained in:
ser1zw 2011-04-27 23:39:16 +09:00
parent 882b778e94
commit 196c567ee0
4 changed files with 41 additions and 29 deletions

View file

@ -434,27 +434,8 @@ rb_initialize(int argc, VALUE *argv, VALUE self)
VALUE row, column, depth, channel;
rb_scan_args(argc, argv, "22", &row, &column, &depth, &channel);
CvMat *ptr;
try {
ptr = cvCreateMat(FIX2INT(row), FIX2INT(column),
CV_MAKETYPE(CVMETHOD("DEPTH", depth, CV_8U), argc < 4 ? 3 : FIX2INT(channel)));
}
catch(cv::Exception& e) {
if (e.code != CV_StsNoMem) {
rb_raise(rb_eRuntimeError, "%s", e.what());
}
// When memory allocation is failed, run GC and retry it
rb_gc_start();
try {
ptr = cvCreateMat(FIX2INT(row), FIX2INT(column),
CV_MAKETYPE(CVMETHOD("DEPTH", depth, CV_8U), argc < 4 ? 3 : FIX2INT(channel)));
}
catch (...) {
fprintf(stderr, "[FATAL] failed to allocate memory\n");
exit(EXIT_FAILURE);
}
}
CvMat *ptr = rb_cvCreateMat(FIX2INT(row), FIX2INT(column),
CV_MAKETYPE(CVMETHOD("DEPTH", depth, CV_8U), argc < 4 ? 3 : FIX2INT(channel)));
free(DATA_PTR(self));
DATA_PTR(self) = ptr;
@ -1518,7 +1499,7 @@ rb_split(VALUE self)
CvSize size = cvGetSize(CVARR(self));
CvMat *dest[] = {NULL, NULL, NULL, NULL};
for (int i = 0; i < channel; i++)
dest[i] = cvCreateMat(size.height, size.width, CV_MAKETYPE(depth, 1));
dest[i] = rb_cvCreateMat(size.height, size.width, CV_MAKETYPE(depth, 1));
cvSplit(CVARR(self), dest[0], dest[1], dest[2], dest[3]);
VALUE ary = rb_ary_new2(channel);
for (int i = 0; i < channel; i++)
@ -3226,8 +3207,8 @@ rb_good_features_to_track(int argc, VALUE *argv, VALUE self)
good_features_to_track_option = GOOD_FEATURES_TO_TRACK_OPTION(good_features_to_track_option);
CvMat *src = CVMAT(self);
CvSize size = cvGetSize(src);
eigen = cvCreateMat(size.height, size.width, CV_MAKETYPE(CV_32F, 1));
tmp = cvCreateMat(size.height, size.width, CV_MAKETYPE(CV_32F, 1));
eigen = rb_cvCreateMat(size.height, size.width, CV_MAKETYPE(CV_32F, 1));
tmp = rb_cvCreateMat(size.height, size.width, CV_MAKETYPE(CV_32F, 1));
int np = GF_MAX(good_features_to_track_option);
if(!(np > 0))
rb_raise(rb_eArgError, "option :max should be positive value.");
@ -3584,7 +3565,7 @@ rb_morphology_internal(VALUE element, VALUE iteration, int operation, VALUE self
CvSize size = cvGetSize(self_ptr);
VALUE dest = new_object(size, cvGetElemType(self_ptr));
if (operation == CV_MOP_GRADIENT) {
CvMat* temp = cvCreateMat(size.height, size.width, cvGetElemType(self_ptr));
CvMat* temp = rb_cvCreateMat(size.height, size.width, cvGetElemType(self_ptr));
cvMorphologyEx(self_ptr, CVARR(dest), temp, IPLCONVKERNEL(element), CV_MOP_GRADIENT, IF_INT(iteration, 1));
cvReleaseMat(&temp);
}
@ -5226,13 +5207,13 @@ rb_compute_correspond_epilines(VALUE klass, VALUE points, VALUE which_image, VAL
VALUE
new_object(int rows, int cols, int type)
{
return OPENCV_OBJECT(rb_klass, cvCreateMat(rows, cols, type));
return OPENCV_OBJECT(rb_klass, rb_cvCreateMat(rows, cols, type));
}
VALUE
new_object(CvSize size, int type)
{
return OPENCV_OBJECT(rb_klass, cvCreateMat(size.height, size.width, type));
return OPENCV_OBJECT(rb_klass, rb_cvCreateMat(size.height, size.width, type));
}

View file

@ -363,7 +363,7 @@ cvShiftDFT(CvArr *src_arr, CvArr *dst_arr )
}
if(src_arr==dst_arr){
tmp = cvCreateMat(size.height/2, size.width/2, cvGetElemType(src_arr));
tmp = rb_cvCreateMat(size.height/2, size.width/2, cvGetElemType(src_arr));
}
cx = size.width/2;
@ -425,7 +425,7 @@ create_fourier_image(const IplImage *im)
dft_M = cvGetOptimalDFTSize( im->height - 1 );
dft_N = cvGetOptimalDFTSize( im->width - 1 );
dft_A = cvCreateMat( dft_M, dft_N, CV_64FC2 );
dft_A = rb_cvCreateMat( dft_M, dft_N, CV_64FC2 );
image_Re = cvCreateImage( cvSize(dft_N, dft_M), IPL_DEPTH_64F, 1);
image_Im = cvCreateImage( cvSize(dft_N, dft_M), IPL_DEPTH_64F, 1);

View file

@ -129,6 +129,35 @@ release_iplconvkernel_object(void *ptr)
}
}
/*
* Creates CvMat and underlying data
* When memory allocation is failed, run GC and retry it
*/
CvMat*
rb_cvCreateMat(int height, int width, int type)
{
CvMat* ptr = NULL;
try {
ptr = cvCreateMat(height, width, type);
}
catch(cv::Exception& e) {
if (e.code != CV_StsNoMem)
rb_raise(rb_eRuntimeError, "%s", e.what());
rb_gc_start();
try {
ptr = cvCreateMat(height, width, type);
}
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;

View file

@ -185,6 +185,8 @@ void release_iplconvkernel_object(void *ptr);
VALUE rb_module_opencv();
void define_ruby_module();
CvMat* rb_cvCreateMat(int height, int width, int type);
// Ruby/OpenCV inline functions
inline CvArr*
CVARR(VALUE object)