Skip to content

Commit c849f56

Browse files
committed
fix CV\absdiff function bug and add copyright
1 parent 27c3d8c commit c849f56

File tree

2 files changed

+147
-86
lines changed

2 files changed

+147
-86
lines changed

source/opencv2/opencv_core.cc

Lines changed: 87 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -375,109 +375,110 @@ PHP_FUNCTION(opencv_magnitude){
375375
}
376376

377377
/**
378+
* Copyright (c) MaleicAcid
378379
* CV\absdiff
379380
* @param execute_data
380381
* @param return_value
381382
*/
382383
PHP_FUNCTION(opencv_absdiff){
383-
zval *src1_zval, *src2_zval, *dst_zval;
384+
zval *src1_zval, *src2_zval, *dst_zval;
384385

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;
386+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "zzz",
387+
&src1_zval,
388+
&src2_zval,
389+
&dst_zval) == FAILURE) {
390+
RETURN_NULL();
391+
}
392+
opencv_mat_object *src1_mat_object = NULL, *src2_mat_object = NULL, *dst_mat_object = NULL;
393+
opencv_scalar_object *src1_scalar_object = NULL, *src2_scalar_object = NULL, *dst_scalar_object = NULL;
393394

394-
int flag = 0;//1 mat,0 scalar
395+
int flag = 0;//dst 1 mat,0 scalar
395396

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-
}
397+
if(Z_TYPE_P(src1_zval) != IS_OBJECT || Z_TYPE_P(src2_zval) != IS_OBJECT){
398+
char *error_message = (char*)malloc(strlen("src1 and src1 parameter must be Mat or Scalar object.") + 1);
399+
strcpy(error_message,"src1 parameter must be Mat or Scalar object.");
400+
opencv_throw_exception(error_message);//throw exception
401+
free(error_message);
402+
}
402403

404+
if(Z_OBJCE_P(src1_zval) == opencv_mat_ce){
405+
src1_mat_object = Z_PHP_MAT_OBJ_P(src1_zval);
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_OBJCE_P(src2_zval) == opencv_mat_ce){
416+
src2_mat_object = Z_PHP_MAT_OBJ_P(src2_zval);
403417
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);
418+
flag = 3;
408419
}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);
420+
flag = 1;
413421
}
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);
422+
}else if(Z_OBJCE_P(src2_zval) == opencv_scalar_ce){
423+
src2_scalar_object = Z_PHP_SCALAR_OBJ_P(src2_zval);
424+
if(Z_OBJCE_P(src1_zval) == opencv_mat_ce){
425+
flag = 2;
420426
}
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+
}
421433

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-
}
434+
zval *dst_real_zval = Z_REFVAL_P(dst_zval);
433435

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-
}
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_ptr_dtor(dst_real_zval);
441+
zval instance;
442+
Scalar dst;
443+
object_init_ex(&instance,opencv_scalar_ce);
444+
ZVAL_COPY_VALUE(dst_real_zval, &instance);
445+
dst_scalar_object = Z_PHP_SCALAR_OBJ_P(dst_real_zval);
446+
dst_scalar_object->scalar = new Scalar(dst);
478447
}
479448

480-
RETURN_NULL();
449+
absdiff(*src1_scalar_object->scalar,*src2_scalar_object->scalar, *dst_scalar_object->scalar);
450+
opencv_scalar_update_property_by_c_scalar(dst_real_zval, dst_scalar_object->scalar);
451+
}else{
452+
if(Z_TYPE_P(dst_real_zval) == IS_OBJECT && Z_OBJCE_P(dst_real_zval)==opencv_mat_ce){
453+
dst_mat_object = Z_PHP_MAT_OBJ_P(dst_real_zval);
454+
} else{
455+
zval_ptr_dtor(dst_real_zval);
456+
zval instance;
457+
Mat dst;
458+
object_init_ex(&instance,opencv_mat_ce);
459+
ZVAL_COPY_VALUE(dst_real_zval, &instance);
460+
461+
dst_mat_object = Z_PHP_MAT_OBJ_P(dst_real_zval);
462+
dst_mat_object->mat = new Mat(dst);
463+
}
464+
switch (flag){
465+
case 1:
466+
absdiff(*src1_scalar_object->scalar,*src2_mat_object->mat, *dst_mat_object->mat);
467+
opencv_mat_update_property_by_c_mat(dst_real_zval, dst_mat_object->mat);
468+
break;
469+
case 2:
470+
absdiff(*src1_mat_object->mat,*src2_scalar_object->scalar, *dst_mat_object->mat);
471+
opencv_mat_update_property_by_c_mat(dst_real_zval, dst_mat_object->mat);
472+
break;
473+
case 3:
474+
absdiff(*src1_mat_object->mat,*src2_mat_object->mat, *dst_mat_object->mat);
475+
opencv_mat_update_property_by_c_mat(dst_real_zval, dst_mat_object->mat);
476+
break;
477+
default:
478+
break;
479+
}
480+
}
481+
RETURN_NULL();
481482
}
482483

483484
/**

tests/absdiff.phpt

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
--TEST--
2+
absdiff function test
3+
--SKIPIF--
4+
<?php if (!extension_loaded("opencv")) print "skip"; ?>
5+
--FILE--
6+
<?php
7+
use CV\{Mat, Scalar};
8+
use function CV\{absdiff};
9+
use const CV\{CV_8UC1,CV_8UC3};
10+
11+
$mat1 = new Mat(3,3,CV_8UC1,new Scalar(0));
12+
$mat2 = new Mat(3,3,CV_8UC1,new Scalar(10));
13+
$dst = null;
14+
absdiff($mat1, $mat2, $dst);
15+
var_dump($dst);
16+
$dst->print();
17+
absdiff(new Scalar(0), new Scalar(0), $dst);
18+
var_dump($dst);
19+
$dst->print();
20+
absdiff(new Mat(3,3,CV_8UC3,new Scalar(0)), new Scalar(0), $dst);
21+
var_dump($dst);
22+
$dst->print();
23+
24+
--EXPECT--
25+
object(CV\Mat)#3 (3) {
26+
["type":"CV\Mat":private]=>
27+
int(0)
28+
["rows"]=>
29+
int(3)
30+
["cols"]=>
31+
int(3)
32+
}
33+
[ 10, 10, 10;
34+
10, 10, 10;
35+
10, 10, 10]
36+
object(CV\Scalar)#3 (1) {
37+
["val"]=>
38+
array(4) {
39+
[0]=>
40+
float(0)
41+
[1]=>
42+
float(0)
43+
[2]=>
44+
float(0)
45+
[3]=>
46+
float(0)
47+
}
48+
}
49+
[0, 0, 0, 0]
50+
object(CV\Mat)#3 (3) {
51+
["type":"CV\Mat":private]=>
52+
int(16)
53+
["rows"]=>
54+
int(3)
55+
["cols"]=>
56+
int(3)
57+
}
58+
[ 0, 0, 0, 0, 0, 0, 0, 0, 0;
59+
0, 0, 0, 0, 0, 0, 0, 0, 0;
60+
0, 0, 0, 0, 0, 0, 0, 0, 0]

0 commit comments

Comments
 (0)