diff --git a/ext/opencv/cvmat.cpp b/ext/opencv/cvmat.cpp index 05e8cf2..a65bdcc 100644 --- a/ext/opencv/cvmat.cpp +++ b/ext/opencv/cvmat.cpp @@ -1502,9 +1502,8 @@ rb_reshape(VALUE self, VALUE hash) VALUE rb_repeat(VALUE self, VALUE object) { - CvMat* obj_ptr = CVMAT_WITH_CHECK(object); try { - cvRepeat(CVARR(self), obj_ptr); + cvRepeat(CVARR(self), CVARR_WITH_CHECK(object)); } catch (cv::Exception& e) { raise_cverror(e); @@ -1710,7 +1709,7 @@ rb_lut(VALUE self, VALUE lut) { VALUE dest = copy(self); try { - cvLUT(CVARR(self), CVARR(dest), CVMAT_WITH_CHECK(lut)); + cvLUT(CVARR(self), CVARR(dest), CVARR_WITH_CHECK(lut)); } catch (cv::Exception& e) { raise_cverror(e); @@ -1882,9 +1881,9 @@ rb_mat_mul(int argc, VALUE *argv, VALUE self) dest = new_mat_kind_object(cvGetSize(self_ptr), self); try { if (NIL_P(shiftvec)) - cvMatMul(self_ptr, CVMAT_WITH_CHECK(val), CVARR(dest)); + cvMatMul(self_ptr, CVARR_WITH_CHECK(val), CVARR(dest)); else - cvMatMulAdd(self_ptr, CVMAT_WITH_CHECK(val), CVMAT_WITH_CHECK(shiftvec), CVARR(dest)); + cvMatMulAdd(self_ptr, CVARR_WITH_CHECK(val), CVARR_WITH_CHECK(shiftvec), CVARR(dest)); } catch (cv::Exception& e) { raise_cverror(e); @@ -2354,7 +2353,7 @@ rb_dot_product(VALUE self, VALUE mat) { double result = 0.0; try { - result = cvDotProduct(CVARR(self), CVMAT_WITH_CHECK(mat)); + result = cvDotProduct(CVARR(self), CVARR_WITH_CHECK(mat)); } catch (cv::Exception& e) { raise_cverror(e); @@ -2376,7 +2375,7 @@ rb_cross_product(VALUE self, VALUE mat) VALUE dest = Qnil; try { dest = new_mat_kind_object(cvGetSize(self_ptr), self); - cvCrossProduct(self_ptr, CVMAT_WITH_CHECK(mat), CVARR(dest)); + cvCrossProduct(self_ptr, CVARR_WITH_CHECK(mat), CVARR(dest)); } catch (cv::Exception& e) { raise_cverror(e); @@ -2473,7 +2472,7 @@ rb_mul_transposed(int argc, VALUE *argv, VALUE self) _order = LOOKUP_CVMETHOD(options, "order"); } - CvArr* delta = NIL_P(_delta) ? NULL : CVMAT_WITH_CHECK(_delta); + CvArr* delta = NIL_P(_delta) ? NULL : CVARR_WITH_CHECK(_delta); double scale = NIL_P(_scale) ? 1.0 : NUM2DBL(_scale); int order = NIL_P(_order) ? 0 : NUM2INT(_order); CvArr* self_ptr = CVARR(self); @@ -2607,10 +2606,10 @@ rb_solve(int argc, VALUE *argv, VALUE self) VALUE mat, symbol; rb_scan_args(argc, argv, "11", &mat, &symbol); VALUE dest = Qnil; - CvMat* mat_ptr = CVMAT_WITH_CHECK(mat); + CvArr* arr_ptr = CVARR_WITH_CHECK(mat); try { - dest = new_mat_kind_object(cvGetSize(mat_ptr), self); - cvSolve(CVARR(self), mat_ptr, CVARR(dest), CVMETHOD("INVERSION_METHOD", symbol, CV_LU)); + dest = new_mat_kind_object(cvGetSize(arr_ptr), self); + cvSolve(CVARR(self), arr_ptr, CVARR(dest), CVMETHOD("INVERSION_METHOD", symbol, CV_LU)); } catch (cv::Exception& e) { raise_cverror(e); @@ -3913,7 +3912,7 @@ rb_remap(int argc, VALUE *argv, VALUE self) VALUE dest = Qnil; try { dest = new_mat_kind_object(cvGetSize(self_ptr), self); - cvRemap(self_ptr, CVARR(dest), CVMAT_WITH_CHECK(mapx), CVMAT_WITH_CHECK(mapy), + cvRemap(self_ptr, CVARR(dest), CVARR_WITH_CHECK(mapx), CVARR_WITH_CHECK(mapy), CVMETHOD("INTERPOLATION_METHOD", interpolation, CV_INTER_LINEAR) | CVMETHOD("WARP_FLAG", option, CV_WARP_FILL_OUTLIERS), VALUE_TO_CVSCALAR(fillval)); @@ -4741,7 +4740,7 @@ VALUE rb_watershed(VALUE self, VALUE markers) { try { - cvWatershed(CVARR(self), CVMAT_WITH_CHECK(markers)); + cvWatershed(CVARR(self), CVARR_WITH_CHECK(markers)); } catch (cv::Exception& e) { raise_cverror(e); @@ -4960,7 +4959,7 @@ rb_match_template(int argc, VALUE *argv, VALUE self) method_flag = CVMETHOD("MATCH_TEMPLATE_METHOD", method); CvArr* self_ptr = CVARR(self); - CvMat* templ_ptr = CVMAT_WITH_CHECK(templ); + CvArr* templ_ptr = CVARR_WITH_CHECK(templ); VALUE result = Qnil; try { CvSize src_size = cvGetSize(self_ptr); diff --git a/ext/opencv/cvutils.cpp b/ext/opencv/cvutils.cpp index c1b6125..98643f4 100644 --- a/ext/opencv/cvutils.cpp +++ b/ext/opencv/cvutils.cpp @@ -11,16 +11,28 @@ void raise_typeerror(VALUE object, VALUE expected_class) +{ + raise_typeerror(object, rb_class2name(expected_class)); +} + +void +raise_typeerror(VALUE object, const char* expected_class_name) { rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)", - rb_obj_classname(object), rb_class2name(expected_class)); + rb_obj_classname(object), expected_class_name); } void raise_compatible_typeerror(VALUE object, VALUE expected_class) +{ + raise_compatible_typeerror(object, rb_class2name(expected_class)); +} + +void +raise_compatible_typeerror(VALUE object, const char* expected_class_name) { rb_raise(rb_eTypeError, "wrong argument type %s (expected %s or compatible object)", - rb_obj_classname(object), rb_class2name(expected_class)); + rb_obj_classname(object), expected_class_name); } /* diff --git a/ext/opencv/cvutils.h b/ext/opencv/cvutils.h index cfd75e6..95eafab 100644 --- a/ext/opencv/cvutils.h +++ b/ext/opencv/cvutils.h @@ -17,7 +17,9 @@ #define raise_cverror(e) cCvError::raise(e) void raise_typeerror(VALUE object, VALUE expected_class); +void raise_typeerror(VALUE object, const char* expected_class_name); void raise_compatible_typeerror(VALUE object, VALUE expected_class); +void raise_compatible_typeerror(VALUE object, const char* expected_class_name); void* rb_cvAlloc(size_t size); CvMat* rb_cvCreateMat(int height, int width, int type); IplImage* rb_cvCreateImage(CvSize size, int depth, int channels); diff --git a/ext/opencv/opencv.h b/ext/opencv/opencv.h index 62e1f6b..444b4fe 100644 --- a/ext/opencv/opencv.h +++ b/ext/opencv/opencv.h @@ -204,6 +204,21 @@ CVARR(VALUE object) return ptr; } +inline CvArr* +CVARR_WITH_CHECK(VALUE object) +{ + Check_Type(object, T_DATA); + void *ptr = DATA_PTR(object); + if (CV_IS_IMAGE(ptr) || CV_IS_MAT(ptr) || CV_IS_SEQ(ptr) || + CV_IS_MATND(ptr) || CV_IS_SPARSE_MAT(ptr)) { + return CVARR(object); + } + else { + raise_compatible_typeerror(object, (char*)"CvArr"); + } + return NULL; +} + inline VALUE OPENCV_OBJECT(VALUE klass, void *ptr) {