/ext/opencv/cvmat.cpp
http://github.com/ryanfb/ruby-opencv · C++ · 5218 lines · 2671 code · 293 blank · 2254 comment · 255 complexity · ded9e7fe3ff7bdf9aa6be0064b9aa05c MD5 · raw file
Large files are truncated click here to view the full file
- /************************************************************
- cvmat.cpp -
- $Author: lsxi $
- Copyright (C) 2005-2008 Masakazu Yonekura
- ************************************************************/
- #include "cvmat.h"
- /*
- * Document-class: OpenCV::CvMat
- *
- * CvMat is basic 2D matrix class in OpenCV.
- *
- * C structure is here.
- * typedef struct CvMat{
- * int type;
- * int step;
- * int *refcount;
- * union
- * {
- * uchar *ptr;
- * short *s;
- * int *i;
- * float *fl;
- * double *db;
- * } data;
- * #ifdef __cplusplus
- * union
- * {
- * int rows;
- * int height;
- * };
- * union
- * {
- * int cols;
- * int width;
- * };
- * #else
- * int rows; // number of row
- * int cols; // number of columns
- * }CvMat;
- */
- __NAMESPACE_BEGIN_OPENCV
- __NAMESPACE_BEGIN_CVMAT
- #define SUPPORT_8UC1_ONLY(value) if (cvGetElemType(CVARR(value)) != CV_8UC1) {rb_raise(rb_eNotImpError, "support single-channel 8bit unsigned image only.");}
- #define SUPPORT_8U_ONLY(value) if (CV_MAT_DEPTH(cvGetElemType(CVARR(value))) != CV_8U) {rb_raise(rb_eNotImpError, "support 8bit unsigned image only.");}
- #define SUPPORT_C1_ONLY(value) if (CV_MAT_CN(cvGetElemType(CVARR(value))) != 1) {rb_raise(rb_eNotImpError, "support single-channel image only.");}
- #define SUPPORT_C1C3_ONLY(value) if (CV_MAT_CN(cvGetElemType(CVARR(value))) != 1 && CV_MAT_CN(cvGetElemType(CVARR(value))) != 3) {rb_raise(rb_eNotImpError, "support single-channel or 3-channnel image only.");}
- #define DRAWING_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("DRAWING_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("DRAWING_OPTION")), rb_intern("merge"), 1, op)
- #define DO_COLOR(op) VALUE_TO_CVSCALAR(rb_hash_aref(op, ID2SYM(rb_intern("color"))))
- #define DO_THICKNESS(op) FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("thickness"))))
- #define DO_LINE_TYPE(op) FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("line_type"))))
- #define DO_SHIFT(op) FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("shift"))))
- #define DO_IS_CLOSED(op) ({VALUE _is_closed = rb_hash_aref(op, ID2SYM(rb_intern("is_closed"))); NIL_P(_is_closed) ? 0 : _is_closed == Qfalse ? 0 : 1;})
- #define GOOD_FEATURES_TO_TRACK_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("GOOD_FEATURES_TO_TRACK_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("GOOD_FEATURES_TO_TRACK_OPTION")), rb_intern("merge"), 1, op)
- #define GF_MAX(op) FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("max"))))
- #define GF_MASK(op) MASK(rb_hash_aref(op, ID2SYM(rb_intern("mask"))))
- #define GF_BLOCK_SIZE(op) FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("block_size"))))
- #define GF_USE_HARRIS(op) TRUE_OR_FALSE(rb_hash_aref(op, ID2SYM(rb_intern("use_harris"))), 0)
- #define GF_K(op) NUM2DBL(rb_hash_aref(op, ID2SYM(rb_intern("k"))))
- #define FLOOD_FILL_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("FLOOD_FILL_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("FLOOD_FILL_OPTION")), rb_intern("merge"), 1, op)
- #define FF_CONNECTIVITY(op) NUM2INT(rb_hash_aref(op, ID2SYM(rb_intern("connectivity"))))
- #define FF_FIXED_RANGE(op) TRUE_OR_FALSE(rb_hash_aref(op, ID2SYM(rb_intern("fixed_range"))), 0)
- #define FF_MASK_ONLY(op) TRUE_OR_FALSE(rb_hash_aref(op, ID2SYM(rb_intern("mask_only"))), 0)
- #define FIND_CONTOURS_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("FIND_CONTOURS_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("FIND_CONTOURS_OPTION")), rb_intern("merge"), 1, op)
- #define FC_MODE(op) FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("mode"))))
- #define FC_METHOD(op) FIX2INT(rb_hash_aref(op, ID2SYM(rb_intern("method"))))
- #define FC_OFFSET(op)VALUE_TO_CVPOINT(rb_hash_aref(op, ID2SYM(rb_intern("offset"))))
- #define OPTICAL_FLOW_HS_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("OPTICAL_FLOW_HS_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("OPTICAL_FLOW_HS_OPTION")), rb_intern("merge"), 1, op)
- #define HS_LAMBDA(op) NUM2DBL(rb_hash_aref(op, ID2SYM(rb_intern("lambda"))))
- #define HS_CRITERIA(op) VALUE_TO_CVTERMCRITERIA(rb_hash_aref(op, ID2SYM(rb_intern("criteria"))))
- #define OPTICAL_FLOW_BM_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("OPTICAL_FLOW_BM_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("OPTICAL_FLOW_BM_OPTION")), rb_intern("merge"), 1, op)
- #define BM_BLOCK_SIZE(op) VALUE_TO_CVSIZE(rb_hash_aref(op, ID2SYM(rb_intern("block_size"))))
- #define BM_SHIFT_SIZE(op) VALUE_TO_CVSIZE(rb_hash_aref(op, ID2SYM(rb_intern("shift_size"))))
- #define BM_MAX_RANGE(op) VALUE_TO_CVSIZE(rb_hash_aref(op, ID2SYM(rb_intern("max_range"))))
- #define FIND_FUNDAMENTAL_MAT_OPTION(op) NIL_P(op) ? rb_const_get(rb_class(), rb_intern("FIND_FUNDAMENTAL_MAT_OPTION")) : rb_funcall(rb_const_get(rb_class(), rb_intern("FIND_FUNDAMENTAL_MAT_OPTION")), rb_intern("merge"), 1, op)
- #define FFM_WITH_STATUS(op) TRUE_OR_FALSE(rb_hash_aref(op, ID2SYM(rb_intern("with_status"))), 0)
- #define FFM_MAXIMUM_DISTANCE(op) NUM2DBL(rb_hash_aref(op, ID2SYM(rb_intern("maximum_distance"))))
- #define FFM_DESIRABLE_LEVEL(op) NUM2DBL(rb_hash_aref(op, ID2SYM(rb_intern("desirable_level"))))
- VALUE rb_klass;
- VALUE
- rb_class()
- {
- return rb_klass;
- }
- void define_ruby_class()
- {
- if (rb_klass)
- return;
- /*
- * opencv = rb_define_module("OpenCV");
- *
- * note: this comment is used by rdoc.
- */
- VALUE opencv = rb_module_opencv();
- rb_klass = rb_define_class_under(opencv, "CvMat", rb_cObject);
- rb_define_alloc_func(rb_klass, rb_allocate);
- VALUE drawing_option = rb_hash_new();
- rb_define_const(rb_klass, "DRAWING_OPTION", drawing_option);
- rb_hash_aset(drawing_option, ID2SYM(rb_intern("color")), cCvScalar::new_object(cvScalarAll(0)));
- rb_hash_aset(drawing_option, ID2SYM(rb_intern("thickness")), INT2FIX(1));
- rb_hash_aset(drawing_option, ID2SYM(rb_intern("line_type")), INT2FIX(8));
- rb_hash_aset(drawing_option, ID2SYM(rb_intern("shift")), INT2FIX(0));
- VALUE good_features_to_track_option = rb_hash_new();
- rb_define_const(rb_klass, "GOOD_FEATURES_TO_TRACK_OPTION", good_features_to_track_option);
- rb_hash_aset(good_features_to_track_option, ID2SYM(rb_intern("max")), INT2FIX(0xFF));
- rb_hash_aset(good_features_to_track_option, ID2SYM(rb_intern("mask")), Qnil);
- rb_hash_aset(good_features_to_track_option, ID2SYM(rb_intern("block_size")), INT2FIX(3));
- rb_hash_aset(good_features_to_track_option, ID2SYM(rb_intern("use_harris")), Qfalse);
- rb_hash_aset(good_features_to_track_option, ID2SYM(rb_intern("k")), rb_float_new(0.04));
- VALUE flood_fill_option = rb_hash_new();
- rb_define_const(rb_klass, "FLOOD_FILL_OPTION", flood_fill_option);
- rb_hash_aset(flood_fill_option, ID2SYM(rb_intern("connectivity")), INT2FIX(4));
- rb_hash_aset(flood_fill_option, ID2SYM(rb_intern("fixed_range")), Qfalse);
- rb_hash_aset(flood_fill_option, ID2SYM(rb_intern("mask_only")), Qfalse);
- VALUE find_contours_option = rb_hash_new();
- rb_define_const(rb_klass, "FIND_CONTOURS_OPTION", find_contours_option);
- rb_hash_aset(find_contours_option, ID2SYM(rb_intern("mode")), INT2FIX(CV_RETR_LIST));
- rb_hash_aset(find_contours_option, ID2SYM(rb_intern("method")), INT2FIX(CV_CHAIN_APPROX_SIMPLE));
- rb_hash_aset(find_contours_option, ID2SYM(rb_intern("offset")), cCvPoint::new_object(cvPoint(0,0)));
- VALUE optical_flow_hs_option = rb_hash_new();
- rb_define_const(rb_klass, "OPTICAL_FLOW_HS_OPTION", optical_flow_hs_option);
- rb_hash_aset(optical_flow_hs_option, ID2SYM(rb_intern("lambda")), rb_float_new(0.0005));
- rb_hash_aset(optical_flow_hs_option, ID2SYM(rb_intern("criteria")), cCvTermCriteria::new_object(cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 1, 0.001)));
- VALUE optical_flow_bm_option = rb_hash_new();
- rb_define_const(rb_klass, "OPTICAL_FLOW_BM_OPTION", optical_flow_bm_option);
- rb_hash_aset(optical_flow_bm_option, ID2SYM(rb_intern("block_size")), cCvSize::new_object(cvSize(4, 4)));
- rb_hash_aset(optical_flow_bm_option, ID2SYM(rb_intern("shift_size")), cCvSize::new_object(cvSize(1, 1)));
- rb_hash_aset(optical_flow_bm_option, ID2SYM(rb_intern("max_range")), cCvSize::new_object(cvSize(4, 4)));
- VALUE find_fundamental_matrix_option = rb_hash_new();
- rb_define_const(rb_klass, "FIND_FUNDAMENTAL_MAT_OPTION", find_fundamental_matrix_option);
- rb_hash_aset(find_fundamental_matrix_option, ID2SYM(rb_intern("with_status")), Qfalse);
- rb_hash_aset(find_fundamental_matrix_option, ID2SYM(rb_intern("maximum_distance")), rb_float_new(1.0));
- rb_hash_aset(find_fundamental_matrix_option, ID2SYM(rb_intern("desirable_level")), rb_float_new(0.99));
- rb_define_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
- rb_define_singleton_method(rb_klass, "load", RUBY_METHOD_FUNC(rb_load_imageM), -1);
- // Ruby/OpenCV original functions
- rb_define_method(rb_klass, "method_missing", RUBY_METHOD_FUNC(rb_method_missing), -1);
- rb_define_method(rb_klass, "to_s", RUBY_METHOD_FUNC(rb_to_s), 0);
- rb_define_method(rb_klass, "has_parent?", RUBY_METHOD_FUNC(rb_has_parent_q), 0);
- rb_define_method(rb_klass, "parent", RUBY_METHOD_FUNC(rb_parent), 0);
- rb_define_method(rb_klass, "inside?", RUBY_METHOD_FUNC(rb_inside_q), 1);
- rb_define_method(rb_klass, "to_IplConvKernel", RUBY_METHOD_FUNC(rb_to_IplConvKernel), 1);
- rb_define_method(rb_klass, "create_mask", RUBY_METHOD_FUNC(rb_create_mask), 0);
- rb_define_method(rb_klass, "width", RUBY_METHOD_FUNC(rb_width), 0);
- rb_define_alias(rb_klass, "columns", "width");
- rb_define_alias(rb_klass, "cols", "width");
- rb_define_method(rb_klass, "height", RUBY_METHOD_FUNC(rb_height), 0);
- rb_define_alias(rb_klass, "rows", "height");
- rb_define_method(rb_klass, "depth", RUBY_METHOD_FUNC(rb_depth), 0);
- rb_define_method(rb_klass, "channel", RUBY_METHOD_FUNC(rb_channel), 0);
- rb_define_method(rb_klass, "data", RUBY_METHOD_FUNC(rb_data), 0);
- rb_define_method(rb_klass, "clone", RUBY_METHOD_FUNC(rb_clone), 0);
- rb_define_method(rb_klass, "copy", RUBY_METHOD_FUNC(rb_copy), -1);
- rb_define_method(rb_klass, "to_8u", RUBY_METHOD_FUNC(rb_to_8u), 0);
- rb_define_method(rb_klass, "to_8s", RUBY_METHOD_FUNC(rb_to_8s), 0);
- rb_define_method(rb_klass, "to_16u", RUBY_METHOD_FUNC(rb_to_16u), 0);
- rb_define_method(rb_klass, "to_16s", RUBY_METHOD_FUNC(rb_to_16s), 0);
- rb_define_method(rb_klass, "to_32s", RUBY_METHOD_FUNC(rb_to_32s), 0);
- rb_define_method(rb_klass, "to_32f", RUBY_METHOD_FUNC(rb_to_32f), 0);
- rb_define_method(rb_klass, "to_64f", RUBY_METHOD_FUNC(rb_to_64f), 0);
- rb_define_method(rb_klass, "vector?", RUBY_METHOD_FUNC(rb_vector_q), 0);
- rb_define_method(rb_klass, "square?", RUBY_METHOD_FUNC(rb_square_q), 0);
- rb_define_method(rb_klass, "to_CvMat", RUBY_METHOD_FUNC(rb_to_CvMat), 0);
- rb_define_method(rb_klass, "sub_rect", RUBY_METHOD_FUNC(rb_sub_rect), -2);
- rb_define_alias(rb_klass, "subrect", "sub_rect");
- rb_define_method(rb_klass, "slice_width", RUBY_METHOD_FUNC(rb_slice_width), 1);
- rb_define_method(rb_klass, "slice_height", RUBY_METHOD_FUNC(rb_slice_height), 1);
- rb_define_method(rb_klass, "row", RUBY_METHOD_FUNC(rb_row), -2);
- rb_define_method(rb_klass, "col", RUBY_METHOD_FUNC(rb_col), -2);
- rb_define_alias(rb_klass, "column", "col");
- rb_define_method(rb_klass, "each_row", RUBY_METHOD_FUNC(rb_each_row), 0);
- rb_define_method(rb_klass, "each_col", RUBY_METHOD_FUNC(rb_each_col), 0);
- rb_define_alias(rb_klass, "each_column", "each_col");
- rb_define_method(rb_klass, "diag", RUBY_METHOD_FUNC(rb_diag), -1);
- rb_define_alias(rb_klass, "diagonal", "diag");
- rb_define_method(rb_klass, "size", RUBY_METHOD_FUNC(rb_size), 0);
- rb_define_method(rb_klass, "dims", RUBY_METHOD_FUNC(rb_dims), 0);
- rb_define_method(rb_klass, "dim_size", RUBY_METHOD_FUNC(rb_dim_size), 1);
- rb_define_method(rb_klass, "[]", RUBY_METHOD_FUNC(rb_aref), -2);
- rb_define_alias(rb_klass, "at", "[]");
- rb_define_method(rb_klass, "[]=", RUBY_METHOD_FUNC(rb_aset), -2);
- rb_define_method(rb_klass, "fill", RUBY_METHOD_FUNC(rb_fill), -1);
- rb_define_alias(rb_klass, "set", "fill");
- rb_define_method(rb_klass, "fill!", RUBY_METHOD_FUNC(rb_fill_bang), -1);
- rb_define_alias(rb_klass, "set!", "fill!");
- rb_define_method(rb_klass, "clear", RUBY_METHOD_FUNC(rb_clear), 0);
- rb_define_alias(rb_klass, "set_zero", "clear");
- rb_define_method(rb_klass, "clear!", RUBY_METHOD_FUNC(rb_clear_bang), 0);
- rb_define_alias(rb_klass, "set_zero!", "clear!");
- rb_define_method(rb_klass, "identity", RUBY_METHOD_FUNC(rb_set_identity), -1);
- rb_define_method(rb_klass, "identity!", RUBY_METHOD_FUNC(rb_set_identity_bang), -1);
- rb_define_method(rb_klass, "range", RUBY_METHOD_FUNC(rb_range), -1);
- rb_define_method(rb_klass, "range!", RUBY_METHOD_FUNC(rb_range_bang), -1);
- rb_define_method(rb_klass, "reshape", RUBY_METHOD_FUNC(rb_reshape), 1);
- rb_define_method(rb_klass, "repeat", RUBY_METHOD_FUNC(rb_repeat), 1);
- rb_define_method(rb_klass, "flip", RUBY_METHOD_FUNC(rb_flip), -1);
- rb_define_method(rb_klass, "flip!", RUBY_METHOD_FUNC(rb_flip_bang), -1);
- rb_define_method(rb_klass, "split", RUBY_METHOD_FUNC(rb_split), 0);
- rb_define_singleton_method(rb_klass, "merge", RUBY_METHOD_FUNC(rb_merge), -2);
- rb_define_method(rb_klass, "rand_shuffle", RUBY_METHOD_FUNC(rb_rand_shuffle), -1);
- rb_define_method(rb_klass, "rand_shuffle!", RUBY_METHOD_FUNC(rb_rand_shuffle_bang), -1);
- rb_define_method(rb_klass, "lut", RUBY_METHOD_FUNC(rb_lut), 1);
- rb_define_method(rb_klass, "convert_scale", RUBY_METHOD_FUNC(rb_convert_scale), 1);
- rb_define_method(rb_klass, "convert_scale_abs", RUBY_METHOD_FUNC(rb_convert_scale_abs), 1);
- rb_define_method(rb_klass, "add", RUBY_METHOD_FUNC(rb_add), -1);
- rb_define_alias(rb_klass, "+", "add");
- rb_define_method(rb_klass, "sub", RUBY_METHOD_FUNC(rb_sub), -1);
- rb_define_alias(rb_klass, "-", "sub");
- rb_define_method(rb_klass, "mul", RUBY_METHOD_FUNC(rb_mul), -1);
- rb_define_method(rb_klass, "mat_mul", RUBY_METHOD_FUNC(rb_mat_mul), -1);
- rb_define_alias(rb_klass, "*", "mat_mul");
- rb_define_method(rb_klass, "div", RUBY_METHOD_FUNC(rb_div), -1);
- rb_define_alias(rb_klass, "/", "div");
- rb_define_method(rb_klass, "and", RUBY_METHOD_FUNC(rb_and), -1);
- rb_define_alias(rb_klass, "&", "and");
- rb_define_method(rb_klass, "or", RUBY_METHOD_FUNC(rb_or), -1);
- rb_define_alias(rb_klass, "|", "or");
- rb_define_method(rb_klass, "xor", RUBY_METHOD_FUNC(rb_xor), -1);
- rb_define_alias(rb_klass, "^", "xor");
- rb_define_method(rb_klass, "not", RUBY_METHOD_FUNC(rb_not), 0);
- rb_define_method(rb_klass, "not!", RUBY_METHOD_FUNC(rb_not_bang), 0);
- rb_define_method(rb_klass, "eq", RUBY_METHOD_FUNC(rb_eq), 1);
- rb_define_method(rb_klass, "gt", RUBY_METHOD_FUNC(rb_gt), 1);
- rb_define_method(rb_klass, "ge", RUBY_METHOD_FUNC(rb_ge), 1);
- rb_define_method(rb_klass, "lt", RUBY_METHOD_FUNC(rb_lt), 1);
- rb_define_method(rb_klass, "le", RUBY_METHOD_FUNC(rb_le), 1);
- rb_define_method(rb_klass, "ne", RUBY_METHOD_FUNC(rb_ne), 1);
- rb_define_method(rb_klass, "in_range", RUBY_METHOD_FUNC(rb_in_range), 2);
- rb_define_method(rb_klass, "abs_diff", RUBY_METHOD_FUNC(rb_abs_diff), 1);
- rb_define_method(rb_klass, "count_non_zero", RUBY_METHOD_FUNC(rb_count_non_zero), 0);
- rb_define_method(rb_klass, "sum", RUBY_METHOD_FUNC(rb_sum), 0);
- rb_define_method(rb_klass, "avg", RUBY_METHOD_FUNC(rb_avg), -1);
- rb_define_method(rb_klass, "avg_sdv", RUBY_METHOD_FUNC(rb_avg_sdv), -1);
- rb_define_method(rb_klass, "sdv", RUBY_METHOD_FUNC(rb_sdv), -1);
- rb_define_method(rb_klass, "min_max_loc", RUBY_METHOD_FUNC(rb_min_max_loc), -1);
- rb_define_method(rb_klass, "dot_product", RUBY_METHOD_FUNC(rb_dot_product), 1);
- rb_define_method(rb_klass, "cross_product", RUBY_METHOD_FUNC(rb_cross_product), 1);
- rb_define_method(rb_klass, "transform", RUBY_METHOD_FUNC(rb_transform), -1);
- rb_define_method(rb_klass, "perspective_transform", RUBY_METHOD_FUNC(rb_perspective_transform), 1);
- rb_define_method(rb_klass, "mul_transposed", RUBY_METHOD_FUNC(rb_mul_transposed), -2);
- rb_define_method(rb_klass, "trace", RUBY_METHOD_FUNC(rb_trace), 0);
- rb_define_method(rb_klass, "transpose", RUBY_METHOD_FUNC(rb_transpose), 0);
- rb_define_alias(rb_klass, "t", "transpose");
- rb_define_method(rb_klass, "transpose!", RUBY_METHOD_FUNC(rb_transpose_bang), 0);
- rb_define_alias(rb_klass, "t!", "transpose!");
- rb_define_method(rb_klass, "det", RUBY_METHOD_FUNC(rb_det), 0);
- rb_define_alias(rb_klass, "determinant", "det");
- rb_define_method(rb_klass, "invert", RUBY_METHOD_FUNC(rb_invert), -1);
- rb_define_method(rb_klass, "solve", RUBY_METHOD_FUNC(rb_solve), -1);
- rb_define_method(rb_klass, "svd", RUBY_METHOD_FUNC(rb_svd), -1);
- rb_define_method(rb_klass, "svbksb", RUBY_METHOD_FUNC(rb_svbksb), -1);
- rb_define_method(rb_klass, "eigenvv", RUBY_METHOD_FUNC(rb_eigenvv), -1);
- rb_define_method(rb_klass, "calc_covar_matrix", RUBY_METHOD_FUNC(rb_calc_covar_matrix), -1);
- rb_define_method(rb_klass, "mahalonobis", RUBY_METHOD_FUNC(rb_mahalonobis), -1);
- /* drawing function */
- rb_define_method(rb_klass, "line", RUBY_METHOD_FUNC(rb_line), -1);
- rb_define_method(rb_klass, "line!", RUBY_METHOD_FUNC(rb_line_bang), -1);
- rb_define_method(rb_klass, "rectangle", RUBY_METHOD_FUNC(rb_rectangle), -1);
- rb_define_method(rb_klass, "rectangle!", RUBY_METHOD_FUNC(rb_rectangle_bang), -1);
- rb_define_method(rb_klass, "circle", RUBY_METHOD_FUNC(rb_circle), -1);
- rb_define_method(rb_klass, "circle!", RUBY_METHOD_FUNC(rb_circle_bang), -1);
- rb_define_method(rb_klass, "ellipse", RUBY_METHOD_FUNC(rb_ellipse), -1);
- rb_define_method(rb_klass, "ellipse!", RUBY_METHOD_FUNC(rb_ellipse_bang), -1);
- rb_define_method(rb_klass, "ellipse_box", RUBY_METHOD_FUNC(rb_ellipse_box), -1);
- rb_define_method(rb_klass, "ellipse_box!", RUBY_METHOD_FUNC(rb_ellipse_box_bang), -1);
- rb_define_method(rb_klass, "fill_poly", RUBY_METHOD_FUNC(rb_fill_poly), -1);
- rb_define_method(rb_klass, "fill_poly!", RUBY_METHOD_FUNC(rb_fill_poly_bang), -1);
- rb_define_method(rb_klass, "fill_convex_poly", RUBY_METHOD_FUNC(rb_fill_convex_poly), -1);
- rb_define_method(rb_klass, "fill_convex_poly!", RUBY_METHOD_FUNC(rb_fill_convex_poly_bang), -1);
- rb_define_method(rb_klass, "poly_line", RUBY_METHOD_FUNC(rb_poly_line), -1);
- rb_define_method(rb_klass, "poly_line!", RUBY_METHOD_FUNC(rb_poly_line_bang), -1);
- rb_define_method(rb_klass, "put_text", RUBY_METHOD_FUNC(rb_put_text), -1);
- rb_define_method(rb_klass, "put_text!", RUBY_METHOD_FUNC(rb_put_text_bang), -1);
- rb_define_method(rb_klass, "dft", RUBY_METHOD_FUNC(rb_dft), -1);
- rb_define_method(rb_klass, "dct", RUBY_METHOD_FUNC(rb_dct), -1);
- rb_define_method(rb_klass, "sobel", RUBY_METHOD_FUNC(rb_sobel), -1);
- rb_define_method(rb_klass, "laplace", RUBY_METHOD_FUNC(rb_laplace), -1);
- rb_define_method(rb_klass, "canny", RUBY_METHOD_FUNC(rb_canny), -1);
- rb_define_method(rb_klass, "pre_corner_detect", RUBY_METHOD_FUNC(rb_pre_corner_detect), -1);
- rb_define_method(rb_klass, "corner_eigenvv", RUBY_METHOD_FUNC(rb_corner_eigenvv), -1);
- rb_define_method(rb_klass, "corner_min_eigen_val", RUBY_METHOD_FUNC(rb_corner_min_eigen_val), -1);
- rb_define_method(rb_klass, "corner_harris", RUBY_METHOD_FUNC(rb_corner_harris), -1);
- rb_define_private_method(rb_klass, "__find_corner_sub_pix", RUBY_METHOD_FUNC(rbi_find_corner_sub_pix), -1);
- rb_define_method(rb_klass, "good_features_to_track", RUBY_METHOD_FUNC(rb_good_features_to_track), -1);
- rb_define_method(rb_klass, "sample_line", RUBY_METHOD_FUNC(rb_sample_line), 2);
- rb_define_method(rb_klass, "rect_sub_pix", RUBY_METHOD_FUNC(rb_rect_sub_pix), -1);
- rb_define_method(rb_klass, "quadrangle_sub_pix", RUBY_METHOD_FUNC(rb_quadrangle_sub_pix), -1);
- rb_define_method(rb_klass, "resize", RUBY_METHOD_FUNC(rb_resize), -1);
- rb_define_method(rb_klass, "warp_affine", RUBY_METHOD_FUNC(rb_warp_affine), -1);
- rb_define_singleton_method(rb_klass, "rotation_matrix2D", RUBY_METHOD_FUNC(rb_rotation_matrix2D), 3);
- rb_define_method(rb_klass, "warp_perspective", RUBY_METHOD_FUNC(rb_warp_perspective), -1);
- rb_define_singleton_method(rb_klass, "find_homography", RUBY_METHOD_FUNC(rb_find_homograpy), -1);
- //rb_define_method(rb_klass, "get_perspective_transform", RUBY_METHOD_FUNC(rb_get_perspective_transform), -1);
- //rb_define_alias(rb_klass, "warp_perspective_q_matrix", "get_perspective_transform");
- rb_define_method(rb_klass, "remap", RUBY_METHOD_FUNC(rb_remap), -1);
- //rb_define_method(rb_klass, "log_polar", RUBY_METHOD_FUNC(rb_log_polar), -1);
- rb_define_method(rb_klass, "erode", RUBY_METHOD_FUNC(rb_erode), -1);
- rb_define_method(rb_klass, "erode!", RUBY_METHOD_FUNC(rb_erode_bang), -1);
- rb_define_method(rb_klass, "dilate", RUBY_METHOD_FUNC(rb_dilate), -1);
- rb_define_method(rb_klass, "dilate!", RUBY_METHOD_FUNC(rb_dilate_bang), -1);
- rb_define_method(rb_klass, "morphology", RUBY_METHOD_FUNC(rb_morphology), -1);
- rb_define_method(rb_klass, "morphology_open", RUBY_METHOD_FUNC(rb_morphology_open), -1);
- rb_define_method(rb_klass, "morphology_close", RUBY_METHOD_FUNC(rb_morphology_close), -1);
- rb_define_method(rb_klass, "morphology_gradient", RUBY_METHOD_FUNC(rb_morphology_gradient), -1);
- rb_define_method(rb_klass, "morphology_tophat", RUBY_METHOD_FUNC(rb_morphology_tophat), -1);
- rb_define_method(rb_klass, "morphology_blackhat", RUBY_METHOD_FUNC(rb_morphology_blackhat), -1);
- rb_define_method(rb_klass, "smooth", RUBY_METHOD_FUNC(rb_smooth), -1);
- rb_define_method(rb_klass, "smooth_blur_no_scale", RUBY_METHOD_FUNC(rb_smooth_blur_no_scale), -1);
- rb_define_method(rb_klass, "smooth_blur", RUBY_METHOD_FUNC(rb_smooth_blur), -1);
- rb_define_method(rb_klass, "smooth_gaussian", RUBY_METHOD_FUNC(rb_smooth_gaussian), -1);
- rb_define_method(rb_klass, "smooth_median", RUBY_METHOD_FUNC(rb_smooth_median), -1);
- rb_define_method(rb_klass, "smooth_bilateral", RUBY_METHOD_FUNC(rb_smooth_bilateral), -1);
- rb_define_method(rb_klass, "filter2d", RUBY_METHOD_FUNC(rb_filter2d), -1);
- rb_define_method(rb_klass, "copy_make_border_constant", RUBY_METHOD_FUNC(rb_copy_make_border_constant), -1);
- rb_define_method(rb_klass, "copy_make_border_replicate", RUBY_METHOD_FUNC(rb_copy_make_border_replicate), -1);
- rb_define_method(rb_klass, "integral", RUBY_METHOD_FUNC(rb_integral), -1);
- rb_define_method(rb_klass, "threshold", RUBY_METHOD_FUNC(rb_threshold), -1);
- rb_define_method(rb_klass, "threshold_binary", RUBY_METHOD_FUNC(rb_threshold_binary), -1);
- rb_define_method(rb_klass, "threshold_binary_inverse", RUBY_METHOD_FUNC(rb_threshold_binary_inverse), -1);
- rb_define_method(rb_klass, "threshold_trunc", RUBY_METHOD_FUNC(rb_threshold_trunc), -1);
- rb_define_method(rb_klass, "threshold_to_zero", RUBY_METHOD_FUNC(rb_threshold_to_zero), -1);
- rb_define_method(rb_klass, "threshold_to_zero_inverse", RUBY_METHOD_FUNC(rb_threshold_to_zero_inverse), -1);
- rb_define_method(rb_klass, "pyr_down", RUBY_METHOD_FUNC(rb_pyr_down), -1);
- rb_define_method(rb_klass, "pyr_up", RUBY_METHOD_FUNC(rb_pyr_up), -1);
- rb_define_method(rb_klass, "flood_fill", RUBY_METHOD_FUNC(rb_flood_fill), -1);
- rb_define_method(rb_klass, "flood_fill!", RUBY_METHOD_FUNC(rb_flood_fill_bang), -1);
- rb_define_method(rb_klass, "find_contours", RUBY_METHOD_FUNC(rb_find_contours), -1);
- rb_define_method(rb_klass, "find_contours!", RUBY_METHOD_FUNC(rb_find_contours_bang), -1);
- rb_define_method(rb_klass, "pyr_segmentation", RUBY_METHOD_FUNC(rb_pyr_segmentation), -1);
- rb_define_method(rb_klass, "pyr_mean_shift_filtering", RUBY_METHOD_FUNC(rb_pyr_mean_shift_filtering), -1);
- rb_define_method(rb_klass, "watershed", RUBY_METHOD_FUNC(rb_watershed), 1);
- rb_define_method(rb_klass, "moments", RUBY_METHOD_FUNC(rb_moments), -1);
- rb_define_method(rb_klass, "hough_lines", RUBY_METHOD_FUNC(rb_hough_lines), -1);
- rb_define_method(rb_klass, "hough_lines_standard", RUBY_METHOD_FUNC(rb_hough_lines_standard), 3);
- rb_define_method(rb_klass, "hough_lines_probabilistic", RUBY_METHOD_FUNC(rb_hough_lines_probabilistic), 5);
- rb_define_method(rb_klass, "hough_lines_multi_scale", RUBY_METHOD_FUNC(rb_hough_lines_multi_scale), 5);
- rb_define_method(rb_klass, "hough_circles", RUBY_METHOD_FUNC(rb_hough_circles), -1);
- rb_define_method(rb_klass, "hough_circles_gradient", RUBY_METHOD_FUNC(rb_hough_circles_gradient), -1);
- //rb_define_method(rb_klass, "dist_transform", RUBY_METHOD_FUNC(rb_dist_transform), -1);
- rb_define_method(rb_klass, "inpaint", RUBY_METHOD_FUNC(rb_inpaint), 3);
- rb_define_method(rb_klass, "inpaint_ns", RUBY_METHOD_FUNC(rb_inpaint_ns), 2);
- rb_define_method(rb_klass, "inpaint_telea", RUBY_METHOD_FUNC(rb_inpaint_telea), 2);
- rb_define_method(rb_klass, "equalize_hist", RUBY_METHOD_FUNC(rb_equalize_hist), 0);
- rb_define_method(rb_klass, "match_template", RUBY_METHOD_FUNC(rb_match_template), -1);
- rb_define_method(rb_klass, "match_shapes", RUBY_METHOD_FUNC(rb_match_shapes), -1);
- rb_define_method(rb_klass, "match_shapes_i1", RUBY_METHOD_FUNC(rb_match_shapes_i1), -1);
- rb_define_method(rb_klass, "match_shapes_i2", RUBY_METHOD_FUNC(rb_match_shapes_i2), -1);
- rb_define_method(rb_klass, "match_shapes_i3", RUBY_METHOD_FUNC(rb_match_shapes_i3), -1);
- rb_define_method(rb_klass, "mean_shift", RUBY_METHOD_FUNC(rb_mean_shift), 2);
- rb_define_method(rb_klass, "cam_shift", RUBY_METHOD_FUNC(rb_cam_shift), 2);
- rb_define_method(rb_klass, "snake_image", RUBY_METHOD_FUNC(rb_snake_image), -1);
- rb_define_method(rb_klass, "optical_flow_hs", RUBY_METHOD_FUNC(rb_optical_flow_hs), -1);
- rb_define_method(rb_klass, "optical_flow_lk", RUBY_METHOD_FUNC(rb_optical_flow_lk), 2);
- rb_define_method(rb_klass, "optical_flow_bm", RUBY_METHOD_FUNC(rb_optical_flow_bm), -1);
- rb_define_singleton_method(rb_klass, "find_fundamental_mat_7point",
- RUBY_METHOD_FUNC(rb_find_fundamental_mat_7point), 2);
- rb_define_singleton_method(rb_klass, "find_fundamental_mat_8point",
- RUBY_METHOD_FUNC(rb_find_fundamental_mat_8point), 2);
- rb_define_singleton_method(rb_klass, "find_fundamental_mat_ransac",
- RUBY_METHOD_FUNC(rb_find_fundamental_mat_ransac), -1);
- rb_define_singleton_method(rb_klass, "find_fundamental_mat_lmeds",
- RUBY_METHOD_FUNC(rb_find_fundamental_mat_lmeds), -1);
- rb_define_singleton_method(rb_klass, "find_fundamental_mat",
- RUBY_METHOD_FUNC(rb_find_fundamental_mat), -1);
- rb_define_singleton_method(rb_klass, "compute_correspond_epilines",
- RUBY_METHOD_FUNC(rb_compute_correspond_epilines), 3);
- rb_define_method(rb_klass, "save_image", RUBY_METHOD_FUNC(rb_save_image), 1);
- }
- VALUE
- rb_allocate(VALUE klass)
- {
- return OPENCV_OBJECT(klass, 0);
- }
- /*
- * call-seq:
- * CvMat.new(<i>row, col[, depth = CV_8U][, channel = 3]</i>) -> cvmat
- *
- * Create col * row matrix. Each element set 0.
- *
- * Each element possigle range is set by <i>depth</i>. Default is unsigned 8bit.
- *
- * Number of channel is set by <i>channel</i>. <i>channel</i> should be 1..4.
- *
- */
- VALUE
- rb_initialize(int argc, VALUE *argv, VALUE self)
- {
- VALUE row, column, depth, channel;
- rb_scan_args(argc, argv, "22", &row, &column, &depth, &channel);
- DATA_PTR(self) = cvCreateMat(FIX2INT(row), FIX2INT(column),
- CV_MAKETYPE(CVMETHOD("DEPTH", depth, CV_8U), argc < 4 ? 3 : FIX2INT(channel)));
- return self;
- }
- /*
- * call-seq:
- * CvMat::load(<i>filename[,iscolor = CV_LOAD_IMAGE_COLOR]</i>)
- *
- * Load an image from file.
- * iscolor = CV_LOAD_IMAGE_COLOR, the loaded image is forced to be a 3-channel color image
- * iscolor = CV_LOAD_IMAGE_GRAYSCALE, the loaded image is forced to be grayscale
- * iscolor = CV_LOAD_IMAGE_UNCHANGED, the loaded image will be loaded as is.
- * Currently the following file format are supported.
- * * Windows bitmaps - BMP,DIB
- * * JPEG files - JPEG,JPG,JPE
- * * Portable Network Graphics - PNG
- * * Portable image format - PBM,PGM,PPM
- * * Sun rasters - SR,RAS
- * * TIFF files - TIFF,TIF
- */
- VALUE
- rb_load_imageM(int argc, VALUE *argv, VALUE self)
- {
- VALUE filename, iscolor;
- rb_scan_args(argc, argv, "11", &filename, &iscolor);
- Check_Type(filename, T_STRING);
- int _iscolor;
- if (TYPE(iscolor) == T_NIL) {
- _iscolor = CV_LOAD_IMAGE_COLOR;
- }
- else {
- Check_Type(iscolor, T_FIXNUM);
- _iscolor = FIX2INT(iscolor);
- }
- CvMat *mat;
- if ((mat = cvLoadImageM(StringValueCStr(filename), _iscolor)) == NULL) {
- rb_raise(rb_eStandardError, "file does not exist or invalid format image.");
- }
- return OPENCV_OBJECT(rb_klass, mat);
- }
- /*
- * nodoc
- */
- VALUE
- rb_method_missing(int argc, VALUE *argv, VALUE self)
- {
- /*
- const char *to_str = "\\Ato_(\\w+)";
- VALUE name, args, str[3], method;
- rb_scan_args(argc, argv, "1*", &name, &args);
- if (RARRAY_LEN(args) != 0)
- return rb_call_super(argc, argv);
- if(rb_reg_match(rb_reg_new(to_str, strlen(to_str), 0), rb_funcall(name, rb_intern("to_s"), 0)) == Qnil)
- return rb_call_super(argc, argv);
- str[0] = rb_str_new2("%s2%s");
- str[1] = rb_color_model(self);
- str[2] = rb_reg_nth_match(1, rb_backref_get());
- method = rb_f_sprintf(3, str);
- if (rb_respond_to(rb_module_opencv(), rb_intern(StringValuePtr(method))))
- return rb_funcall(rb_module_opencv(), rb_intern(StringValuePtr(method)), 1, self);
- return rb_call_super(argc, argv);
- */
- VALUE name, args, method;
- rb_scan_args(argc, argv, "1*", &name, &args);
- method = rb_funcall(name, rb_intern("to_s"), 0);
- if (RARRAY_LEN(args) != 0 || !rb_respond_to(rb_module_opencv(), rb_intern(StringValuePtr(method))))
- return rb_call_super(argc, argv);
- return rb_funcall(rb_module_opencv(), rb_intern(StringValuePtr(method)), 1, self);
- }
- /*
- * call-seq:
- * to_s -> string
- *
- * Return following string.
- * m = CvMat.new(100, 100, :cv8u, 3)
- * m.to_s # => <CvMat:100x100,depth=cv8u,channel=3>
- */
- VALUE
- rb_to_s(VALUE self)
- {
- const int i = 6;
- VALUE str[i];
- str[0] = rb_str_new2("<%s:%dx%d,depth=%s,channel=%d>");
- str[1] = rb_str_new2(rb_class2name(CLASS_OF(self)));
- str[2] = rb_width(self);
- str[3] = rb_height(self);
- str[4] = rb_depth(self);
- str[5] = rb_channel(self);
- return rb_f_sprintf(i, str);
- }
- /*
- * call-seq:
- * has_parent? -> true or false
- *
- * Return <tt>true</tt> if this matrix has parent object, otherwise <tt>false</tt>.
- */
- VALUE
- rb_has_parent_q(VALUE self)
- {
- return lookup_root_object(CVMAT(self)) ? Qtrue : Qfalse;
- }
- /*
- * call-seq:
- * parent -> obj or nil
- *
- * Return root object that refer this object.
- */
- VALUE
- rb_parent(VALUE self)
- {
- VALUE root = lookup_root_object(CVMAT(self));
- return root ? root : Qnil;
- }
- /*
- * call-seq:
- * inside?(obj) -> true or false
- *
- *
- */
- VALUE
- rb_inside_q(VALUE self, VALUE object)
- {
- if (cCvPoint::rb_compatible_q(cCvPoint::rb_class(), object)) {
- CvMat *mat = CVMAT(self);
- int x = NUM2INT(rb_funcall(object, rb_intern("x"), 0));
- int y = NUM2INT(rb_funcall(object, rb_intern("y"), 0));
- if (cCvRect::rb_compatible_q(cCvRect::rb_class(), object)) {
- int width = NUM2INT(rb_funcall(object, rb_intern("width"), 0));
- int height = NUM2INT(rb_funcall(object, rb_intern("height"), 0));
- return x >= 0 && y >= 0 && x < mat->width && x + width < mat->width && y < mat->height && y + height < mat->height ? Qtrue : Qfalse;
- } else {
- return x >= 0 && y >= 0 && x < mat->width && y < mat->height ? Qtrue : Qfalse;
- }
- }
- rb_raise(rb_eArgError, "argument 1 should have method \"x\", \"y\"");
- }
- /*
- * call-seq:
- * to_IplConvKernel -> iplconvkernel
- *
- * Create IplConvKernel from this matrix.
- */
- VALUE
- 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);
- return DEPEND_OBJECT(cIplConvKernel::rb_class(), kernel, self);
- }
- /*
- * call-seq:
- * create_mask -> cvmat(single-channel 8bit unsinged image)
- *
- * Create single-channel 8bit unsinged image that filled 0.
- */
- VALUE
- rb_create_mask(VALUE self)
- {
- VALUE mask = cCvMat::new_object(cvGetSize(CVARR(self)), CV_8UC1);
- cvZero(CVARR(self));
- return mask;
- }
- /*
- * call-seq:
- * width -> int
- *
- * Return number of columns.
- */
- VALUE
- rb_width(VALUE self)
- {
- return INT2FIX(CVMAT(self)->width);
- }
- /*
- * call-seq:
- * height -> int
- *
- * Return number of rows.
- */
- VALUE
- rb_height(VALUE self)
- {
- return INT2FIX(CVMAT(self)->height);
- }
- /*
- * call-seq:
- * depth -> symbol
- *
- * Return depth symbol. (see OpenCV::DEPTH)
- */
- VALUE
- rb_depth(VALUE self)
- {
- return rb_hash_aref(rb_funcall(rb_const_get(rb_module_opencv(), rb_intern("DEPTH")), rb_intern("invert"), 0), INT2FIX(CV_MAT_DEPTH(CVMAT(self)->type)));
- }
- /*
- * call-seq:
- * channel -> int (1 < channel < 4)
- *
- * Return number of channel.
- */
- VALUE
- rb_channel(VALUE self)
- {
- return INT2FIX(CV_MAT_CN(CVMAT(self)->type));
- }
- /*
- * call-seq:
- * data -> binary (by String class)
- *
- * Return raw data of matrix.
- */
- VALUE
- rb_data(VALUE self)
- {
- IplImage *image = IPLIMAGE(self);
- return rb_str_new((char *)image->imageData, image->imageSize);
- }
- /*
- * call-seq:
- * clone -> cvmat
- *
- * Clone matrix. The parent and child relation is not succeeded.
- * Instance-specific method is succeeded.
- *
- * module M
- * def example
- * true
- * end
- * end
- *
- * mat.extend M
- * mat.example #=> true
- * clone = mat.clone
- * clone.example #=> true
- * copy = mat.copy
- * copy.example #=> raise NoMethodError
- */
- VALUE
- rb_clone(VALUE self)
- {
- VALUE clone = rb_obj_clone(self);
- DATA_PTR(clone) = cvClone(CVARR(self));
- return clone;
- }
- /*
- * call-seq:
- * copy() -> cvmat
- * copy(<i>mat</i>) -> mat
- * copy(<i>val</i>) -> array(include cvmat)
- *
- * Copy matrix. The parent and child relation is not succeeded.
- * Instance-specific method is *NOT* succeeded. see also #clone.
- *
- * There are 3 kind behavior depending on the argument.
- *
- * copy()
- * Return one copied matrix.
- * copy(mat)
- * Copy own elements to target matrix. Return nil.
- * Size (or ROI) and channel and depth should be match.
- * If own width or height does not match target matrix, raise CvUnmatchedSizes
- * If own channel or depth does not match target matrix, raise CvUnmatchedFormats
- * copy(val)
- * The amounts of the specified number are copied. Return Array with copies.
- * If you give the 0 or negative value. Return nil.
- * mat.copy(3) #=> [mat1, mat2, mat3]
- * mat.copy(-1) #=> nil
- *
- * When not apply to any, raise ArgumentError
- */
- VALUE
- rb_copy(int argc, VALUE *argv, VALUE self)
- {
- VALUE value, copied, tmp;
- CvMat *src = CVMAT(self);
- rb_scan_args(argc, argv, "01", &value);
- if (argc == 0) {
- CvSize size = cvGetSize(src);
- copied = new_object(cvGetSize(src), cvGetElemType(src));
- cvCopy(src, CVMAT(copied));
- return copied;
- }else{
- if (rb_obj_is_kind_of(value, rb_klass)) {
- cvCopy(src, CVMAT(value));
- return Qnil;
- }else if (rb_obj_is_kind_of(value, rb_cFixnum)) {
- int n = FIX2INT(value);
- if (n > 0) {
- copied = rb_ary_new2(n);
- for (int i = 0; i < n; i++) {
- tmp = new_object(src->rows, src->cols, cvGetElemType(src));
- cvCopy(src, CVMAT(tmp));
- rb_ary_store(copied, i, tmp);
- }
- return copied;
- }else{
- return Qnil;
- }
- }else
- rb_raise(rb_eArgError, "");
- }
- }
- VALUE
- copy(VALUE mat)
- {
- CvMat *src = CVMAT(mat);
- VALUE copied = new_object(cvGetSize(src), cvGetElemType(src));
- cvCopy(src, CVMAT(copied));
- return copied;
- }
- /*
- * call-seq:
- * to_8u -> cvmat(depth = CV_8U)
- *
- * Return the new matrix that elements is converted to unsigned 8bit.
- */
- VALUE
- rb_to_8u(VALUE self)
- {
- CvMat *src = CVMAT(self);
- VALUE dest = new_object(src->rows, src->cols, CV_MAKETYPE(CV_8U, CV_MAT_CN(src->type)));
- cvConvert(src, CVMAT(dest));
- return dest;
- }
- /*
- * call-seq:
- * to_8s -> cvmat(depth = CV_8S)
- *
- * Return the new matrix that elements is converted to signed 8bit.
- */
- VALUE
- rb_to_8s(VALUE self)
- {
- CvMat *src = CVMAT(self);
- VALUE dest = new_object(src->rows, src->cols, CV_MAKETYPE(CV_8S, CV_MAT_CN(src->type)));
- cvConvert(src, CVMAT(dest));
- return dest;
- }
- /*
- * call-seq:
- * to_16u -> cvmat(depth = CV_16U)
- *
- * Return the new matrix that elements is converted to unsigned 16bit.
- */
- VALUE rb_to_16u(VALUE self)
- {
- CvMat *src = CVMAT(self);
- VALUE dest = new_object(src->rows, src->cols, CV_MAKETYPE(CV_16U, CV_MAT_CN(src->type)));
- cvConvert(src, CVMAT(dest));
- return dest;
- }
- /*
- * call-seq:
- * to_16s -> cvmat(depth = CV_16s)
- *
- * Return the new matrix that elements is converted to signed 16bit.
- */
- VALUE
- rb_to_16s(VALUE self)
- {
- CvMat *src = CVMAT(self);
- VALUE dest = new_object(src->rows, src->cols, CV_MAKETYPE(CV_16S, CV_MAT_CN(src->type)));
- cvConvert(src, CVMAT(dest));
- return dest;
- }
- /*
- * call-seq:
- * to_32s -> cvmat(depth = CV_32S)
- *
- * Return the new matrix that elements is converted to signed 32bit.
- */
- VALUE
- rb_to_32s(VALUE self)
- {
- CvMat *src = CVMAT(self);
- VALUE dest = new_object(src->rows, src->cols, CV_MAKETYPE(CV_32S, CV_MAT_CN(src->type)));
- cvConvert(src, CVMAT(dest));
- return dest;
- }
- /*
- * call-seq:
- * to_32f -> cvmat(depth = CV_32F)
- *
- * Return the new matrix that elements is converted to 32bit floating-point.
- */
- VALUE
- rb_to_32f(VALUE self)
- {
- CvMat *src = CVMAT(self);
- VALUE dest = new_object(src->rows, src->cols, CV_MAKETYPE(CV_32F, CV_MAT_CN(src->type)));
- cvConvert(src, CVMAT(dest));
- return dest;
- }
- /*
- * call-seq:
- * to_64F -> cvmat(depth = CV_64F)
- *
- * Return the new matrix that elements is converted to 64bit floating-point.
- */
- VALUE
- rb_to_64f(VALUE self)
- {
- CvMat *src = CVMAT(self);
- VALUE dest = new_object(src->rows, src->cols, CV_MAKETYPE(CV_64F, CV_MAT_CN(src->type)));
- cvConvert(src, CVMAT(dest));
- return dest;
- }
- /*
- * call-seq:
- * vector? -> true or false
- *
- * If #width or #height is 1, return true. Otherwise return false.
- */
- VALUE
- rb_vector_q(VALUE self)
- {
- CvMat *mat = CVMAT(self);
- return (mat->width == 1|| mat->height == 1) ? Qtrue : Qfalse;
- }
- /*
- * call-seq:
- * square? -> true or false
- *
- * If #width == #height return true. Otherwise return false.
- */
- VALUE
- rb_square_q(VALUE self)
- {
- CvMat *mat = CVMAT(self);
- return mat->width == mat->height ? Qtrue : Qfalse;
- }
- /************************************************************
- cxcore function
- ************************************************************/
- /*
- * Return CvMat object with reference to caller-object.
- *
- * src = CvMat.new(10, 10)
- * src.has_parent? #=> false
- * src.parent #=> nil
- * mat = src.to_CvMat
- * mat.has_parent? #=> true
- * mat.parent #=> CvMat object "src"
- *
- * This case, 'src' is root-object. and 'mat' is child-object refer to 'src'.
- * src <=refer= mat
- * In C, 'src->data' and 'mat->data' is common. Therefore, they cause the change each other.
- * object 'src' don't GC.
- */
- VALUE
- rb_to_CvMat(VALUE self)
- {
- return DEPEND_OBJECT(rb_klass, cvGetMat(CVARR(self), CVALLOC(CvMat)), self);
- }
- /*
- * call-seq:
- * sub_rect(<i>rect</i>) -> cvmat
- * sub_rect(<i>topleft</i>, <i>size</i>) -> cvmat
- * sub_rect(<i>x, y, width, height</i>) -> cvmat
- *
- * Return parts of self as CvMat.
- *
- * <i>p</i> or <i>x</i>,<i>y</i> mean top-left coordinate.
- * <i>size</i> or <i>width</i>,<i>height</i> is size.
- *
- * link:../images/CvMat_sub_rect.png
- */
- VALUE
- rb_sub_rect(VALUE self, VALUE args)
- {
- CvRect area;
- CvPoint topleft;
- CvSize size;
- switch(RARRAY_LEN(args)) {
- case 1:
- area = VALUE_TO_CVRECT(RARRAY_PTR(args)[0]);
- break;
- case 2:
- topleft = VALUE_TO_CVPOINT(RARRAY_PTR(args)[0]);
- size = VALUE_TO_CVSIZE(RARRAY_PTR(args)[1]);
- area.x = topleft.x;
- area.y = topleft.y;
- area.width = size.width;
- area.height = size.height;
- break;
- case 4:
- area.x = NUM2INT(RARRAY_PTR(args)[0]);
- area.y = NUM2INT(RARRAY_PTR(args)[1]);
- area.width = NUM2INT(RARRAY_PTR(args)[2]);
- area.height = NUM2INT(RARRAY_PTR(args)[3]);
- break;
- default:
- rb_raise(rb_eArgError, "wrong number of arguments (%ld of 1 or 2 or 4)", RARRAY_LEN(args));
- }
- return DEPEND_OBJECT(rb_klass,
- cvGetSubRect(CVARR(self), CVALLOC(CvMat), area),
- self);
- }
- /*
- * call-seq:
- * slice_width(<i>n</i>)
- *
- * The matrix is divided into <i>n</i> piece by the width.
- * If it cannot be just divided, warning is displayed.
- *
- * e.g.
- * m = OpenCV::CvMat.new(10, 10) #=> size 10x10 matrix
- * ml, mr = m.slice_width(2) #=> 5x10 and 5x10 matrix
- *
- * ml, mm, mr = m.slice_width(3)#=> 3x10 3x10 3x10 matrix
- * warning : width does not div correctly.
- */
- VALUE
- rb_slice_width(VALUE self, VALUE num)
- {
- int n = NUM2INT(num);
- if (n < 1) {rb_raise(rb_eArgError, "number of piece should be > 0");}
- CvSize size = cvGetSize(CVARR(self));
- if (size.width % n != 0) {rb_warn("width does not div correctly.");}
- int div_x = size.width / n;
- VALUE ary = rb_ary_new2(n);
- for (int i = 0; i < n; i++) {
- CvRect rect = {div_x * i, 0, div_x, size.height};
- rb_ary_push(ary, DEPEND_OBJECT(rb_klass, cvGetSubRect(CVARR(self), CVALLOC(CvMat), rect), self));
- }
- return ary;
- }
- /*
- * call-seq:
- * slice_height(<i>n</i>)
- *
- * The matrix is divided into <i>n</i> piece by the height.
- * If it cannot be just divided, warning is displayed.
- *
- * see also #slice_width.
- */
- VALUE
- rb_slice_height(VALUE self, VALUE num)
- {
- int n = NUM2INT(num);
- if (n < 1) {rb_raise(rb_eArgError, "number of piece should be > 0");}
- CvSize size = cvGetSize(CVARR(self));
- if (size.height % n != 0) {rb_warn("height does not div correctly.");}
- int div_y = size.height / n;
- VALUE ary = rb_ary_new2(n);
- for (int i = 0; i < n; i++) {
- CvRect rect = {0, div_y * i, size.width, div_y};
- rb_ary_push(ary, DEPEND_OBJECT(rb_klass, cvGetSubRect(CVARR(self), CVALLOC(CvMat), rect), self));
- }
- return ary;
- }
- /*
- * call-seq:
- * row(<i>n</i>) -> Return row
- * row(<i>n1, n2, ...</i>) -> Return Array of row
- *
- * Return row(or rows) of matrix.
- * argument should be Fixnum or CvSlice compatible object.
- */
- VALUE
- rb_row(VALUE self, VALUE args)
- {
- int len = RARRAY_LEN(args);
- if (len < 1) {rb_raise(rb_eArgError, "wrong number of argument.(more than 1)");}
- VALUE ary = rb_ary_new2(len);
- for (int i = 0; i < len; i++) {
- VALUE value = rb_ary_entry(args, i);
- if (FIXNUM_P(value)) {
- rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetRow(CVARR(self), CVALLOC(CvMat), FIX2INT(value)), self));
- }else{
- CvSlice slice = VALUE_TO_CVSLICE(value);
- rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetRows(CVARR(self), CVALLOC(CvMat), slice.start_index, slice.end_index), self));
- }
- }
- return RARRAY_LEN(ary) > 1 ? ary : rb_ary_entry(ary, 0);
- }
- /*
- * call-seq:
- * col(<i>n</i>) -> Return column
- * col(<i>n1, n2, ...</i>) -> Return Array of columns
- *
- * Return column(or columns) of matrix.
- * argument should be Fixnum or CvSlice compatible object.
- */
- VALUE
- rb_col(VALUE self, VALUE args)
- {
- int len = RARRAY_LEN(args);
- if (len < 1) {rb_raise(rb_eArgError, "wrong number of argument.(more than 1)");}
- VALUE ary = rb_ary_new2(len);
- for (int i = 0; i < len; i++) {
- VALUE value = rb_ary_entry(args, i);
- if (FIXNUM_P(value)) {
- rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetCol(CVARR(self), CVALLOC(CvMat), FIX2INT(value)), self));
- }else{
- CvSlice slice = VALUE_TO_CVSLICE(value);
- rb_ary_store(ary, i, DEPEND_OBJECT(rb_klass, cvGetCols(CVARR(self), CVALLOC(CvMat), slice.start_index, slice.end_index), self));
- }
- }
- return RARRAY_LEN(ary) > 1 ? ary : rb_ary_entry(ary, 0);
- }
- /*
- * call-seq:
- * each_row{|row| ... } -> self
- *
- * Calls block once for each row in self, passing that element as a parameter.
- *
- * see also CvMat#each_col
- */
- VALUE
- rb_each_row(VALUE self)
- {
- int rows = CVMAT(self)->rows;
- for (int i = 0; i < rows; i++) {
- rb_yield(DEPEND_OBJECT(rb_klass, cvGetRow(CVARR(self), CVALLOC(CvMat), i), self));
- }
- return self;
- }
- /*
- * call-seq:
- * each_col{|col| ... } -> self
- *
- * Calls block once for each column in self, passing that element as a parameter.
- *
- * see also CvMat#each_row
- */
- VALUE
- rb_each_col(VALUE self)
- {
- int cols = CVMAT(self)->cols;
- for (int i = 0; i < cols; i++) {
- rb_yield(DEPEND_OBJECT(rb_klass, cvGetCol(CVARR(self), CVALLOC(CvMat), i), self));
- }
- return self;
- }
- /*
- * call-seq:
- * diag(<i>[val = 0]</i>) -> cvmat
- *
- * Return one of array diagonals.
- * <i>val</i> is zeo corresponds to the main diagonal, -1 corresponds to the diagonal above the main etc, 1 corresponds to the diagonal below the main etc.
- *
- */
- VALUE
- rb_diag(int argc, VALUE *argv, VALUE self)
- {
- VALUE val;
- if (rb_scan_args(argc, argv, "01", &val) < 1) {
- val = INT2FIX(0);
- }
- return DEPEND_OBJECT(rb_klass, cvGetDiag(CVARR(self), CVALLOC(CvMat), NUM2INT(val)), self);
- }
- /*
- * call-seq:
- * size -> cvsize
- *
- * Return size by CvSize
- */
- VALUE
- rb_size(VALUE self)
- {
- return cCvSize::new_object(cvGetSize(CVARR(self)));
- }
- /*
- VALUE rb_elem_type(VALUE self) {
- return INT2FIX(cvGetElemType(CVARR(self)));
- }
- */
- /*
- * call-seq:
- * dims -> array(int, int, ...)
- *
- * Return number of array dimensions and their sizes or the size of particular dimension.
- * In case of CvMat it always returns 2 regardless of number of matrix rows.
- */
- VALUE
- rb_dims(VALUE self)
- {
- int size[CV_MAX_DIM];
- int dims = cvGetDims(CVARR(self), size);
- VALUE ary = rb_ary_new2(dims);
- for (int i = 0; i < dims; i++) {
- rb_ary_store(ary, i, INT2FIX(size[i]));
- }
- return ary;
- }
- /*
- * call-seq:
- * dim_size(<i>index</i>) -> int
- *
- * Return number of dimension.
- * almost same as CvMat#dims[<i>index</i>].
- * If the dimension specified with index doesn't exist, CvStatusOutOfRange raise.
- */
- VALUE
- rb_dim_size(VALUE self, VALUE index)
- {
- return INT2FIX(cvGetDimSize(CVARR(self), FIX2INT(index)));
- }
- /*
- * call-seq:
- * [<i>idx1[,idx2]...</i>]
- *
- * Return value of the particular array element as CvScalar.
- */
- VALUE
- rb_aref(VALUE self, VALUE args)
- {
- int index[CV_MAX_DIM];
- for (int i = 0; i < RARRAY_LEN(args); i++) {
- index[i] = NUM2INT(rb_ary_entry(args, i));
- }
- CvScalar scalar = cvScalarAll(0);
- switch(RARRAY_LEN(args)) {
- case 1:
- scalar = cvGet1D(CVARR(self), index[0]);
- break;
- case 2:
- scalar = cvGet2D(CVARR(self), index[0], index[1]);
- break;
- default:
- scalar = cvGetND(CVARR(self), index);
- }
- return cCvScalar::new_object(scalar);
- }
- /*
- * call-seq:
- * [<i>idx1[,idx2]...</i>] = <i>value</i>
- *
- * Set value of the particular array element to <i>value</i>.
- * <i>value</i> should be CvScalar.
- */
- VALUE
- rb_aset(VALUE self, VALUE args)
- {
- CvScalar scalar = VALUE_TO_CVSCALAR(rb_ary_pop(args));
- int index[CV_MAX_DIM];
- for (int i = 0; i < RARRAY_LEN(args); i++) {
- index[i] = NUM2INT(rb_ary_entry(args, i));
- }
- switch(RARRAY_LEN(args)) {
- case 1:
- cvSet1D(CVARR(self), index[0], scalar);
- break;
- case 2:
- cvSet2D(CVARR(self), index[0], index[1], scalar);
- break;
- default:
- cvSetND(CVARR(self), index, scalar);
- }
- return self;
- }
- /*
- * call-seq:
- * fill(<i>value[, mask]</i>) -> cvmat
- *
- * Return CvMat copied value to every selected element. value should be CvScalar or compatible object.
- * self[I] = value if mask(I)!=0
- *
- * note: This method support ROI on IplImage class. but COI not support. COI should not be set.
- * image = IplImage.new(10, 20) #=> create 3 channel image.
- * image.coi = 1 #=> set COI
- * image.fill(CvScalar.new(10, 20, 30)) #=> raise CvBadCOI error.
- */
- VALUE
- rb_fill(int argc, VALUE *argv, VALUE self)
- {
- return rb_fill_bang(argc, argv, copy(self));
- }
- /*
- * call-seq:
- * fill!(<i>value[, mask]</i>) -> self
- *
- * Copie value to every selected element.
- * self[I] = value if mask(I)!=0
- *
- * see also #fill.
- */
- VALUE
- rb_fill_bang(int argc, VALUE *argv, VALUE self)
- {
- VALUE value, mask;
- rb_scan_args(argc, argv, "11", &value, &mask);
- cvSet(CVARR(self), VALUE_TO_CVSCALAR(value), MASK(mask));
- return self;
- }
- /*
- * call-seq:
- * save_image(<i>filename</i>) -> self
- *
- * Saves an image to file. The image format is chosen depending on the filename extension.
- * Only 8bit single-channel or 3-channel(with 'BGR' channel order) image can be saved.
- *
- * e.g.
- * image = OpenCV::CvMat.new(10, 10, CV_8U, 3)
- * image.save_image("image.jpg") #=> save as JPEG format
- * image.save_image("image.png") #=> save as PNG format
- */
- VALUE
- rb_save_image(VALUE self, VALUE filename)
- {
- Check_Type(filename, T_STRING);
- cvSaveImage(StringValueCStr(filename), CVARR(self));
- return self;
- }
- /*
- * call-seq:
- * clear -> cvmat
- *
- * Return new matrix all element-value cleared.
- */
- VALUE
- rb_clear(VALUE self)
- {
- return rb_clear_bang(copy(self));
- }
- /*
- * call-seq:
- * clear! -> self
- *
- * Clear all element-value. Return self.
- */
- VALUE
- rb_clear_bang(VALUE self)
- {
- cvSetZero(CVARR(self));
- return self;
- }
- /*
- * call-seq:
- * identity(<i>[val = [1]]</i>) -> cvmat
- *
- * Return initializes scaled identity matrix.
- * <i>val</i> should be CvScalar.
- *
- * arr(i, j) = val if i = j, 0 otherwise
- */
- VALUE
- rb_set_identity(int argc, VALUE *argv, VALUE self)
- {
- return rb_set_identity_bang(argc, argv, copy(self));
- }
- /*
- * call-seq:
- * identity!(<i>[val = [1]]</i>) -> self
- *
- * Initialize scaled identity matrix.
- * <i>val</i> should be CvScalar.
- *
- * arr(i, j) = val if i = j, 0 otherwise
- */
- VALUE
- rb_set_identity_bang(int argc, VALUE *argv, VALUE self)
- {
- VALUE val;
- CvScalar value;
- if (rb_scan_args(argc, argv, "01", &val) < 1) {
- value = cvRealScalar(1);
- }else{
- value = VALUE_TO_CVSCALAR(val);
- }
- cvSetIdentity(CVARR(self), value);
- return self;
- }
- /*
- * call-seq:
- * range(start, end) -> cvmat
- *
- * Create and return filled matrix with given range of numbers.
- *
- * see range!
- */
- VALUE
- rb_range(int argc, VALUE *argv, VALUE self)
- {
- return rb_range_bang(argc, argv, copy(self));
- }
- /*
- * call-seq:
- * range!(start, end) -> self
- *
- * Fills matrix with given range of numbers.
- *
- * in…