diff --git a/opencv.cc b/opencv.cc index 0d0a1f1..88e6f23 100644 --- a/opencv.cc +++ b/opencv.cc @@ -212,6 +212,7 @@ const zend_function_entry opencv_functions[] = { ZEND_NS_NAMED_FE(OPENCV_NS, equalizeHist, ZEND_FN(opencv_equalize_hist), opencv_equalize_hist_arginfo) ZEND_NS_NAMED_FE(OPENCV_NS, resize, ZEND_FN(opencv_resize), opencv_resize_arginfo) ZEND_NS_NAMED_FE(OPENCV_NS, putText, ZEND_FN(opencv_put_text), NULL) + ZEND_NS_NAMED_FE(OPENCV_NS, absdiff, ZEND_FN(opencv_absdiff), opencv_absdiff_arginfo) PHP_FE_END /* Must be the last line in opencv_functions[] */ }; /* }}} */ diff --git a/source/opencv2/opencv_core.cc b/source/opencv2/opencv_core.cc index 6c2b496..9ebedac 100644 --- a/source/opencv2/opencv_core.cc +++ b/source/opencv2/opencv_core.cc @@ -374,6 +374,112 @@ PHP_FUNCTION(opencv_magnitude){ } +/** + * CV\absdiff + * @param execute_data + * @param return_value + */ +PHP_FUNCTION(opencv_absdiff){ + zval *src1_zval, *src2_zval, *dst_zval; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zzz", + &src1_zval, + &src2_zval, + &dst_zval) == FAILURE) { + RETURN_NULL(); + } + opencv_mat_object *src1_mat_object = NULL, *src2_mat_object = NULL, *dst_mat_object = NULL; + opencv_scalar_object *src1_scalar_object = NULL, *src2_scalar_object = NULL, *dst_scalar_object = NULL; + + int flag = 0;//1 mat,0 scalar + + if(Z_TYPE_P(src1_zval) != IS_OBJECT){ + char *error_message = (char*)malloc(strlen("src1 parameter must be Mat or Scalar object.") + 1); + strcpy(error_message,"src1 parameter must be Mat or Scalar object."); + opencv_throw_exception(error_message);//throw exception + free(error_message); + } + + if(Z_OBJCE_P(src1_zval) == opencv_mat_ce){ + src1_mat_object = Z_PHP_MAT_OBJ_P(src1_zval); + flag |= (1<<1); + }else if(Z_OBJCE_P(src1_zval) == opencv_scalar_ce){ + src1_scalar_object = Z_PHP_SCALAR_OBJ_P(src1_zval); + }else{ + char *error_message = (char*)malloc(strlen("src1 parameter must be Mat or Scalar object.") + 1); + strcpy(error_message,"src1 parameter must be Mat or Scalar object."); + opencv_throw_exception(error_message);//throw exception + free(error_message); + } + + if(Z_TYPE_P(src2_zval) != IS_OBJECT){ + char *error_message = (char*)malloc(strlen("src2 parameter must be Mat or Scalar object.") + 1); + strcpy(error_message,"src2 parameter must be Mat or Scalar object."); + opencv_throw_exception(error_message);//throw exception + free(error_message); + } + + if(Z_OBJCE_P(src2_zval) == opencv_mat_ce){ + src2_mat_object = Z_PHP_MAT_OBJ_P(src2_zval); + flag |= (1<<0); + }else if(Z_OBJCE_P(src2_zval) == opencv_scalar_ce){ + src2_scalar_object = Z_PHP_SCALAR_OBJ_P(src2_zval); + }else{ + char *error_message = (char*)malloc(strlen("src2 parameter must be Mat or Scalar object.") + 1); + strcpy(error_message,"src2 parameter must be Mat or Scalar object."); + opencv_throw_exception(error_message);//throw exception + free(error_message); + } + + zval *dst_real_zval = Z_REFVAL_P(dst_zval); + + if(flag == 0){ //both scalar + if(Z_TYPE_P(dst_real_zval) == IS_OBJECT && Z_OBJCE_P(dst_real_zval)==opencv_scalar_ce){ + dst_scalar_object = Z_PHP_SCALAR_OBJ_P(dst_real_zval); + } else{ + zval instance; + Scalar dst; + object_init_ex(&instance,opencv_scalar_ce); + ZVAL_COPY_VALUE(dst_real_zval, &instance); + dst_scalar_object = Z_PHP_SCALAR_OBJ_P(dst_real_zval); + dst_scalar_object->scalar = new Scalar(dst); + } + + absdiff(*src1_scalar_object->scalar,*src2_scalar_object->scalar, *dst_scalar_object->scalar); + opencv_scalar_update_property_by_c_scalar(dst_real_zval, dst_scalar_object->scalar); + }else{ + if(Z_TYPE_P(dst_real_zval) == IS_OBJECT && Z_OBJCE_P(dst_real_zval)==opencv_mat_ce){ + dst_mat_object = Z_PHP_MAT_OBJ_P(dst_real_zval); + } else{ + zval instance; + Mat dst; + object_init_ex(&instance,opencv_mat_ce); + ZVAL_COPY_VALUE(dst_real_zval, &instance); + + dst_mat_object = Z_PHP_MAT_OBJ_P(dst_real_zval); + dst_mat_object->mat = new Mat(dst); + } + switch (flag){ + case 1: + absdiff(*src1_scalar_object->scalar,*src2_mat_object->mat, *dst_mat_object->mat); + opencv_mat_update_property_by_c_mat(dst_real_zval, dst_mat_object->mat); + break; + case 10: + absdiff(*src1_mat_object->mat,*src2_scalar_object->scalar, *dst_mat_object->mat); + opencv_mat_update_property_by_c_mat(dst_real_zval, dst_mat_object->mat); + break; + case 11: + absdiff(*src1_mat_object->mat,*src2_mat_object->mat, *dst_mat_object->mat); + opencv_mat_update_property_by_c_mat(dst_real_zval, dst_mat_object->mat); + break; + default: + break; + } + } + + RETURN_NULL(); +} + /** * //todo mask and dtype params * CV\add @@ -548,4 +654,4 @@ PHP_FUNCTION(opencv_normalize){ opencv_mat_update_property_by_c_mat(dst_real_zval, dst_object->mat); RETURN_NULL(); -} \ No newline at end of file +} diff --git a/source/opencv2/opencv_core.h b/source/opencv2/opencv_core.h index 2443c6d..0007ea1 100644 --- a/source/opencv2/opencv_core.h +++ b/source/opencv2/opencv_core.h @@ -92,5 +92,11 @@ ZEND_BEGIN_ARG_INFO_EX(opencv_normalize_arginfo, 0, 0, 6) ZEND_ARG_INFO(0, dtype) ZEND_END_ARG_INFO() PHP_FUNCTION(opencv_normalize); +ZEND_BEGIN_ARG_INFO_EX(opencv_absdiff_arginfo, 0, 0, 3) + ZEND_ARG_INFO(0, src1) + ZEND_ARG_INFO(0, src2) + ZEND_ARG_INFO(1, dst) +ZEND_END_ARG_INFO() +PHP_FUNCTION(opencv_absdiff); #endif //OPENCV_CORE_H