diff --git a/opencv.cc b/opencv.cc index 122493b..37d5a7f 100644 --- a/opencv.cc +++ b/opencv.cc @@ -222,6 +222,11 @@ const zend_function_entry opencv_functions[] = { ZEND_NS_NAMED_FE(OPENCV_NS, bilateralFilter, ZEND_FN(opencv_bilateral_filter), opencv_bilateral_filter_arginfo) ZEND_NS_NAMED_FE(OPENCV_NS, dilate, ZEND_FN(opencv_dilate), opencv_dilate_arginfo) ZEND_NS_NAMED_FE(OPENCV_NS, erode, ZEND_FN(opencv_erode), opencv_erode_arginfo) + ZEND_NS_NAMED_FE(OPENCV_NS, filter2D, ZEND_FN(opencv_filter2D), opencv_filter2D_arginfo) + ZEND_NS_NAMED_FE(OPENCV_NS, Sobel, ZEND_FN(opencv_sobel), opencv_sobel_arginfo) + ZEND_NS_NAMED_FE(OPENCV_NS, Scharr, ZEND_FN(opencv_scharr), opencv_scharr_arginfo) + ZEND_NS_NAMED_FE(OPENCV_NS, Laplacian, ZEND_FN(opencv_laplacian), opencv_laplacian_arginfo) + ZEND_NS_NAMED_FE(OPENCV_NS, convertScaleAbs, ZEND_FN(opencv_convert_scale_abs), opencv_convert_scale_abs_arginfo) ZEND_NS_NAMED_FE(OPENCV_NS, getStructuringElement, ZEND_FN(opencv_get_structuring_element), opencv_get_structuring_element_arginfo) ZEND_NS_NAMED_FE(OPENCV_NS, threshold, ZEND_FN(opencv_threshold), opencv_threshold_arginfo) PHP_FE_END /* Must be the last line in opencv_functions[] */ diff --git a/source/opencv2/core/opencv_mat.cc b/source/opencv2/core/opencv_mat.cc index 8044247..93f095b 100644 --- a/source/opencv2/core/opencv_mat.cc +++ b/source/opencv2/core/opencv_mat.cc @@ -450,6 +450,53 @@ PHP_METHOD(opencv_mat, size) RETURN_ZVAL(&instance,0,0); } +/** + * Mat->plus() + * @param execute_data + * @param return_value + */ +PHP_METHOD(opencv_mat, plus) +{ + zval instance; + double number=1; + if (zend_parse_parameters(ZEND_NUM_ARGS(), "d", &number) == FAILURE) { + RETURN_NULL(); + } + + object_init_ex(&instance, opencv_mat_ce); + + opencv_mat_object *new_obj = Z_PHP_MAT_OBJ_P(&instance); + opencv_mat_object *obj = Z_PHP_MAT_OBJ_P(getThis()); + new_obj->mat=new Mat(*(obj->mat)*number); + + opencv_mat_update_property_by_c_mat(&instance, new_obj->mat); + + RETURN_ZVAL(&instance,0,0); //return php Mat object +} + +/** + * Mat->divide() + * @param execute_data + * @param return_value + */ +PHP_METHOD(opencv_mat, divide) +{ + zval instance; + double number=1; + if (zend_parse_parameters(ZEND_NUM_ARGS(), "d", &number) == FAILURE) { + RETURN_NULL(); + } + + object_init_ex(&instance, opencv_mat_ce); + + opencv_mat_object *new_obj = Z_PHP_MAT_OBJ_P(&instance); + opencv_mat_object *obj = Z_PHP_MAT_OBJ_P(getThis()); + new_obj->mat=new Mat(*(obj->mat)/number); + + opencv_mat_update_property_by_c_mat(&instance, new_obj->mat); + + RETURN_ZVAL(&instance,0,0); //return php Mat object +} /** * opencv_mat_methods[] @@ -474,6 +521,8 @@ const zend_function_entry opencv_mat_methods[] = { PHP_MALIAS(opencv_mat, getImageROI ,get_image_roi, NULL, ZEND_ACC_PUBLIC) PHP_MALIAS(opencv_mat, copyTo ,copy_to, opencv_mat_copy_to_arginfo, ZEND_ACC_PUBLIC) PHP_MALIAS(opencv_mat, convertTo ,convert_to, opencv_mat_convert_to_arginfo, ZEND_ACC_PUBLIC) + PHP_ME(opencv_mat, plus, NULL, ZEND_ACC_PUBLIC) + PHP_ME(opencv_mat, divide, NULL, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ diff --git a/source/opencv2/opencv_imgproc.cc b/source/opencv2/opencv_imgproc.cc index 728f2e2..0047d08 100644 --- a/source/opencv2/opencv_imgproc.cc +++ b/source/opencv2/opencv_imgproc.cc @@ -463,7 +463,7 @@ PHP_FUNCTION(opencv_gaussian_blur){ &src_zval, opencv_mat_ce, &dst_zval, &ksize_zval, opencv_size_ce, - &sigma_x, sigma_y, + &sigma_x, &sigma_y, &border_type) == FAILURE) { RETURN_NULL(); } @@ -677,6 +677,227 @@ PHP_FUNCTION(opencv_threshold){ RETURN_DOUBLE(threshold(*src_object->mat, *dst_object->mat, thresh, maxval, (int)type)); } +/** + * CV\sobel + * @param execute_data + * @param return_value + */ +PHP_FUNCTION(opencv_sobel){ + + zval *src_zval, *dst_zval; + long ddepth,dx,dy; + long ksize=3; + + double delta = 0.0,scale=1.0; + long border_type = BORDER_DEFAULT; + opencv_mat_object *dst_object; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ozlll|lddl", + &src_zval, opencv_mat_ce, + &dst_zval, + &ddepth, + &dx, + &dy, + &ksize, + &scale, + &delta, + &border_type) == FAILURE) { + RETURN_NULL(); + } + + opencv_mat_object *src_object = Z_PHP_MAT_OBJ_P(src_zval); + + zval *dst_real_zval = Z_REFVAL_P(dst_zval); + if(Z_TYPE_P(dst_real_zval) == IS_OBJECT && Z_OBJCE_P(dst_real_zval) == opencv_mat_ce){ + dst_object = Z_PHP_MAT_OBJ_P(dst_real_zval); + } else{ + zval_ptr_dtor(dst_real_zval); + zval instance; + Mat dst; + object_init_ex(&instance,opencv_mat_ce); + ZVAL_COPY_VALUE(dst_real_zval, &instance); + dst_object = Z_PHP_MAT_OBJ_P(dst_real_zval); + dst_object->mat = new Mat(dst); + } + Sobel(*src_object->mat, *dst_object->mat, (int)ddepth, (int)dx, (int)dy, (int)ksize, (double)scale, (double)delta, (int)border_type); + RETURN_NULL(); +} + +/** + * CV\Scharr + * @param execute_data + * @param return_value + */ +PHP_FUNCTION(opencv_scharr){ + + zval *src_zval, *dst_zval; + long ddepth,dx,dy; + + double delta = 0.0,scale=1.0; + long border_type = BORDER_DEFAULT; + opencv_mat_object *dst_object; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ozlll|ddl", + &src_zval, opencv_mat_ce, + &dst_zval, + &ddepth, + &dx, + &dy, + &scale, + &delta, + &border_type) == FAILURE) { + RETURN_NULL(); + } + + opencv_mat_object *src_object = Z_PHP_MAT_OBJ_P(src_zval); + + zval *dst_real_zval = Z_REFVAL_P(dst_zval); + if(Z_TYPE_P(dst_real_zval) == IS_OBJECT && Z_OBJCE_P(dst_real_zval) == opencv_mat_ce){ + dst_object = Z_PHP_MAT_OBJ_P(dst_real_zval); + } else{ + zval_ptr_dtor(dst_real_zval); + zval instance; + Mat dst; + object_init_ex(&instance,opencv_mat_ce); + ZVAL_COPY_VALUE(dst_real_zval, &instance); + dst_object = Z_PHP_MAT_OBJ_P(dst_real_zval); + dst_object->mat = new Mat(dst); + } + Scharr(*src_object->mat, *dst_object->mat, (int)ddepth, (int)dx, (int)dy, (double)scale, (double)delta, (int)border_type); + RETURN_NULL(); +} + +/** + * CV\laplacian + * @param execute_data + * @param return_value + */ +PHP_FUNCTION(opencv_laplacian){ + + zval *src_zval, *dst_zval; + long ddepth; + long ksize=3; + + double delta = 0.0,scale=1.0; + long border_type = BORDER_DEFAULT; + opencv_mat_object *dst_object; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ozl|lddl", + &src_zval, opencv_mat_ce, + &dst_zval, + &ddepth, + &ksize, + &scale, + &delta, + &border_type) == FAILURE) { + RETURN_NULL(); + } + + opencv_mat_object *src_object = Z_PHP_MAT_OBJ_P(src_zval); + + zval *dst_real_zval = Z_REFVAL_P(dst_zval); + if(Z_TYPE_P(dst_real_zval) == IS_OBJECT && Z_OBJCE_P(dst_real_zval) == opencv_mat_ce){ + dst_object = Z_PHP_MAT_OBJ_P(dst_real_zval); + } else{ + zval_ptr_dtor(dst_real_zval); + zval instance; + Mat dst; + object_init_ex(&instance,opencv_mat_ce); + ZVAL_COPY_VALUE(dst_real_zval, &instance); + dst_object = Z_PHP_MAT_OBJ_P(dst_real_zval); + dst_object->mat = new Mat(dst); + } + Laplacian(*src_object->mat, *dst_object->mat, (int)ddepth, (int)ksize, (double)scale, (double)delta, (int)border_type); + RETURN_NULL(); +} + +/** + * CV\filter2D + * @param execute_data + * @param return_value + */ +PHP_FUNCTION(opencv_filter2D){ + + zval *src_zval, *dst_zval, *kernel_zval, *anchor_zval = NULL; + long ddepth; + Point anchor = Point(-1,-1); + double delta = 0.0; + long border_type = BORDER_DEFAULT; + opencv_mat_object *dst_object; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "OzlO|Odl", + &src_zval, opencv_mat_ce, + &dst_zval, + &ddepth, + &kernel_zval, opencv_mat_ce, + &anchor_zval, opencv_point_ce, + &delta, + &border_type) == FAILURE) { + RETURN_NULL(); + } + + opencv_mat_object *src_object = Z_PHP_MAT_OBJ_P(src_zval); + opencv_mat_object *kernel_object = Z_PHP_MAT_OBJ_P(kernel_zval); + if(anchor_zval != NULL){ + opencv_point_object *anchor_object = Z_PHP_POINT_OBJ_P(anchor_zval); + anchor = *anchor_object->point; + } + + zval *dst_real_zval = Z_REFVAL_P(dst_zval); + if(Z_TYPE_P(dst_real_zval) == IS_OBJECT && Z_OBJCE_P(dst_real_zval) == opencv_mat_ce){ + dst_object = Z_PHP_MAT_OBJ_P(dst_real_zval); + } else{ + zval_ptr_dtor(dst_real_zval); + zval instance; + Mat dst; + object_init_ex(&instance,opencv_mat_ce); + ZVAL_COPY_VALUE(dst_real_zval, &instance); + dst_object = Z_PHP_MAT_OBJ_P(dst_real_zval); + dst_object->mat = new Mat(dst); + } + filter2D(*src_object->mat, *dst_object->mat, (int)ddepth, *kernel_object->mat, anchor, delta, (int)border_type); + RETURN_NULL(); +} + +/** + * CV\convertScaleAbs + * @param execute_data + * @param return_value + */ +PHP_FUNCTION(opencv_convert_scale_abs){ + + zval *src_zval, *dst_zval; + double alpha = 1.0; + double beta = 0.0; + + opencv_mat_object *dst_object; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oz|dd", + &src_zval, opencv_mat_ce, + &dst_zval, + &alpha, + &beta) == FAILURE) { + RETURN_NULL(); + } + + opencv_mat_object *src_object = Z_PHP_MAT_OBJ_P(src_zval); + + zval *dst_real_zval = Z_REFVAL_P(dst_zval); + if(Z_TYPE_P(dst_real_zval) == IS_OBJECT && Z_OBJCE_P(dst_real_zval) == opencv_mat_ce){ + dst_object = Z_PHP_MAT_OBJ_P(dst_real_zval); + } else{ + zval_ptr_dtor(dst_real_zval); + zval instance; + Mat dst; + object_init_ex(&instance,opencv_mat_ce); + ZVAL_COPY_VALUE(dst_real_zval, &instance); + dst_object = Z_PHP_MAT_OBJ_P(dst_real_zval); + dst_object->mat = new Mat(dst); + } + convertScaleAbs(*src_object->mat, *dst_object->mat, (double)alpha, (double)beta); + RETURN_NULL(); +} + /** * CV\getStructuringElement * @param execute_data diff --git a/source/opencv2/opencv_imgproc.h b/source/opencv2/opencv_imgproc.h index a783d29..57e5ecb 100644 --- a/source/opencv2/opencv_imgproc.h +++ b/source/opencv2/opencv_imgproc.h @@ -111,6 +111,61 @@ ZEND_BEGIN_ARG_INFO_EX(opencv_erode_arginfo, 0, 0, 7) ZEND_END_ARG_INFO() PHP_FUNCTION(opencv_erode); +ZEND_BEGIN_ARG_INFO_EX(opencv_filter2D_arginfo, 0, 0, 7) + ZEND_ARG_INFO(0, src) + ZEND_ARG_INFO(1, dst) + ZEND_ARG_INFO(0, ddepth) + ZEND_ARG_INFO(0, kernel) + ZEND_ARG_INFO(0, anchor) + ZEND_ARG_INFO(0, delta) + ZEND_ARG_INFO(0, border_type) +ZEND_END_ARG_INFO() +PHP_FUNCTION(opencv_filter2D); + +ZEND_BEGIN_ARG_INFO_EX(opencv_sobel_arginfo, 0, 0, 9) + ZEND_ARG_INFO(0, src) + ZEND_ARG_INFO(1, dst) + ZEND_ARG_INFO(0, ddepth) + ZEND_ARG_INFO(0, dx) + ZEND_ARG_INFO(0, dy) + ZEND_ARG_INFO(0, ksize) + ZEND_ARG_INFO(0, scale) + ZEND_ARG_INFO(0, delta) + ZEND_ARG_INFO(0, border_type) +ZEND_END_ARG_INFO() +PHP_FUNCTION(opencv_sobel); + +ZEND_BEGIN_ARG_INFO_EX(opencv_scharr_arginfo, 0, 0, 8) + ZEND_ARG_INFO(0, src) + ZEND_ARG_INFO(1, dst) + ZEND_ARG_INFO(0, ddepth) + ZEND_ARG_INFO(0, dx) + ZEND_ARG_INFO(0, dy) + ZEND_ARG_INFO(0, scale) + ZEND_ARG_INFO(0, delta) + ZEND_ARG_INFO(0, border_type) +ZEND_END_ARG_INFO() +PHP_FUNCTION(opencv_scharr); + +ZEND_BEGIN_ARG_INFO_EX(opencv_laplacian_arginfo, 0, 0, 7) + ZEND_ARG_INFO(0, src) + ZEND_ARG_INFO(1, dst) + ZEND_ARG_INFO(0, ddepth) + ZEND_ARG_INFO(0, ksize) + ZEND_ARG_INFO(0, scale) + ZEND_ARG_INFO(0, delta) + ZEND_ARG_INFO(0, border_type) +ZEND_END_ARG_INFO() +PHP_FUNCTION(opencv_laplacian); + +ZEND_BEGIN_ARG_INFO_EX(opencv_convert_scale_abs_arginfo, 0, 0, 4) + ZEND_ARG_INFO(0, src) + ZEND_ARG_INFO(1, dst) + ZEND_ARG_INFO(0, alpha) + ZEND_ARG_INFO(0, beta) +ZEND_END_ARG_INFO() +PHP_FUNCTION(opencv_convert_scale_abs); + ZEND_BEGIN_ARG_INFO_EX(opencv_get_structuring_element_arginfo, 0, 0, 3) ZEND_ARG_INFO(0, shape) ZEND_ARG_INFO(0, ksize) diff --git a/tests/mat.phpt b/tests/mat.phpt index 6f70802..2ca12d8 100644 --- a/tests/mat.phpt +++ b/tests/mat.phpt @@ -18,6 +18,10 @@ $zeros->print(Formatter::FMT_PYTHON); $ones = Mat::ones(10,10,CV_8UC1); var_dump($ones); $ones->print(Formatter::FMT_PYTHON); +$ones = $ones->plus(3); +$ones->print(Formatter::FMT_PYTHON); +$ones = $ones->divide(1/9); +$ones->print(Formatter::FMT_PYTHON); ?> --EXPECT-- object(CV\Mat)#2 (4) { @@ -74,4 +78,24 @@ object(CV\Mat)#4 (4) { [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]] \ No newline at end of file + [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]] +[[ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]] +[[ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27], + [ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27], + [ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27], + [ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27], + [ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27], + [ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27], + [ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27], + [ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27], + [ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27], + [ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27]] \ No newline at end of file