Skip to content

Commit 9311e01

Browse files
authored
Merge pull request #3 from MaleicAcid/master
* Add CV\absdiff function
2 parents ec2e0ee + d83ba78 commit 9311e01

File tree

3 files changed

+114
-1
lines changed

3 files changed

+114
-1
lines changed

opencv.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ const zend_function_entry opencv_functions[] = {
212212
ZEND_NS_NAMED_FE(OPENCV_NS, equalizeHist, ZEND_FN(opencv_equalize_hist), opencv_equalize_hist_arginfo)
213213
ZEND_NS_NAMED_FE(OPENCV_NS, resize, ZEND_FN(opencv_resize), opencv_resize_arginfo)
214214
ZEND_NS_NAMED_FE(OPENCV_NS, putText, ZEND_FN(opencv_put_text), NULL)
215+
ZEND_NS_NAMED_FE(OPENCV_NS, absdiff, ZEND_FN(opencv_absdiff), opencv_absdiff_arginfo)
215216
PHP_FE_END /* Must be the last line in opencv_functions[] */
216217
};
217218
/* }}} */

source/opencv2/opencv_core.cc

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
}

source/opencv2/opencv_core.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,5 +92,11 @@ ZEND_BEGIN_ARG_INFO_EX(opencv_normalize_arginfo, 0, 0, 6)
9292
ZEND_ARG_INFO(0, dtype)
9393
ZEND_END_ARG_INFO()
9494
PHP_FUNCTION(opencv_normalize);
95+
ZEND_BEGIN_ARG_INFO_EX(opencv_absdiff_arginfo, 0, 0, 3)
96+
ZEND_ARG_INFO(0, src1)
97+
ZEND_ARG_INFO(0, src2)
98+
ZEND_ARG_INFO(1, dst)
99+
ZEND_END_ARG_INFO()
100+
PHP_FUNCTION(opencv_absdiff);
95101

96102
#endif //OPENCV_CORE_H

0 commit comments

Comments
 (0)