@@ -374,6 +374,112 @@ PHP_FUNCTION(opencv_magnitude){
374374
375375}
376376
377+ /* *
378+ * CV\absdiff
379+ * @param execute_data
380+ * @param return_value
381+ */
382+ PHP_FUNCTION (opencv_absdiff){
383+ zval *src1_zval, *src2_zval, *dst_zval;
384+
385+ if (zend_parse_parameters (ZEND_NUM_ARGS (), " zzz" ,
386+ &src1_zval,
387+ &src2_zval,
388+ &dst_zval) == FAILURE) {
389+ RETURN_NULL ();
390+ }
391+ opencv_mat_object *src1_mat_object = NULL , *src2_mat_object = NULL , *dst_mat_object = NULL ;
392+ opencv_scalar_object *src1_scalar_object = NULL , *src2_scalar_object = NULL , *dst_scalar_object = NULL ;
393+
394+ int flag = 0 ;// 1 mat,0 scalar
395+
396+ if (Z_TYPE_P (src1_zval) != IS_OBJECT){
397+ char *error_message = (char *)malloc (strlen (" src1 parameter must be Mat or Scalar object." ) + 1 );
398+ strcpy (error_message," src1 parameter must be Mat or Scalar object." );
399+ opencv_throw_exception (error_message);// throw exception
400+ free (error_message);
401+ }
402+
403+ if (Z_OBJCE_P (src1_zval) == opencv_mat_ce){
404+ src1_mat_object = Z_PHP_MAT_OBJ_P (src1_zval);
405+ flag |= (1 <<1 );
406+ }else if (Z_OBJCE_P (src1_zval) == opencv_scalar_ce){
407+ src1_scalar_object = Z_PHP_SCALAR_OBJ_P (src1_zval);
408+ }else {
409+ char *error_message = (char *)malloc (strlen (" src1 parameter must be Mat or Scalar object." ) + 1 );
410+ strcpy (error_message," src1 parameter must be Mat or Scalar object." );
411+ opencv_throw_exception (error_message);// throw exception
412+ free (error_message);
413+ }
414+
415+ if (Z_TYPE_P (src2_zval) != IS_OBJECT){
416+ char *error_message = (char *)malloc (strlen (" src2 parameter must be Mat or Scalar object." ) + 1 );
417+ strcpy (error_message," src2 parameter must be Mat or Scalar object." );
418+ opencv_throw_exception (error_message);// throw exception
419+ free (error_message);
420+ }
421+
422+ if (Z_OBJCE_P (src2_zval) == opencv_mat_ce){
423+ src2_mat_object = Z_PHP_MAT_OBJ_P (src2_zval);
424+ flag |= (1 <<0 );
425+ }else if (Z_OBJCE_P (src2_zval) == opencv_scalar_ce){
426+ src2_scalar_object = Z_PHP_SCALAR_OBJ_P (src2_zval);
427+ }else {
428+ char *error_message = (char *)malloc (strlen (" src2 parameter must be Mat or Scalar object." ) + 1 );
429+ strcpy (error_message," src2 parameter must be Mat or Scalar object." );
430+ opencv_throw_exception (error_message);// throw exception
431+ free (error_message);
432+ }
433+
434+ zval *dst_real_zval = Z_REFVAL_P (dst_zval);
435+
436+ if (flag == 0 ){ // both scalar
437+ if (Z_TYPE_P (dst_real_zval) == IS_OBJECT && Z_OBJCE_P (dst_real_zval)==opencv_scalar_ce){
438+ dst_scalar_object = Z_PHP_SCALAR_OBJ_P (dst_real_zval);
439+ } else {
440+ zval instance;
441+ Scalar dst;
442+ object_init_ex (&instance,opencv_scalar_ce);
443+ ZVAL_COPY_VALUE (dst_real_zval, &instance);
444+ dst_scalar_object = Z_PHP_SCALAR_OBJ_P (dst_real_zval);
445+ dst_scalar_object->scalar = new Scalar (dst);
446+ }
447+
448+ absdiff (*src1_scalar_object->scalar ,*src2_scalar_object->scalar , *dst_scalar_object->scalar );
449+ opencv_scalar_update_property_by_c_scalar (dst_real_zval, dst_scalar_object->scalar );
450+ }else {
451+ if (Z_TYPE_P (dst_real_zval) == IS_OBJECT && Z_OBJCE_P (dst_real_zval)==opencv_mat_ce){
452+ dst_mat_object = Z_PHP_MAT_OBJ_P (dst_real_zval);
453+ } else {
454+ zval instance;
455+ Mat dst;
456+ object_init_ex (&instance,opencv_mat_ce);
457+ ZVAL_COPY_VALUE (dst_real_zval, &instance);
458+
459+ dst_mat_object = Z_PHP_MAT_OBJ_P (dst_real_zval);
460+ dst_mat_object->mat = new Mat (dst);
461+ }
462+ switch (flag){
463+ case 1 :
464+ absdiff (*src1_scalar_object->scalar ,*src2_mat_object->mat , *dst_mat_object->mat );
465+ opencv_mat_update_property_by_c_mat (dst_real_zval, dst_mat_object->mat );
466+ break ;
467+ case 10 :
468+ absdiff (*src1_mat_object->mat ,*src2_scalar_object->scalar , *dst_mat_object->mat );
469+ opencv_mat_update_property_by_c_mat (dst_real_zval, dst_mat_object->mat );
470+ break ;
471+ case 11 :
472+ absdiff (*src1_mat_object->mat ,*src2_mat_object->mat , *dst_mat_object->mat );
473+ opencv_mat_update_property_by_c_mat (dst_real_zval, dst_mat_object->mat );
474+ break ;
475+ default :
476+ break ;
477+ }
478+ }
479+
480+ RETURN_NULL ();
481+ }
482+
377483/* *
378484 * //todo mask and dtype params
379485 * CV\add
@@ -548,4 +654,4 @@ PHP_FUNCTION(opencv_normalize){
548654 opencv_mat_update_property_by_c_mat (dst_real_zval, dst_object->mat );
549655 RETURN_NULL ();
550656
551- }
657+ }
0 commit comments