CV\add function and opencv_scalar_update_property_by_c_scalar

Esse commit está contido em:
hihozhou
2017-07-10 16:09:51 +08:00
commit 18b9287de9
7 arquivos alterados com 193 adições e 21 exclusões
+1
Ver Arquivo
@@ -198,6 +198,7 @@ const zend_function_entry opencv_functions[] = {
ZEND_NS_NAMED_FE(OPENCV_NS, copyMakeBorder, ZEND_FN(opencv_copy_make_border), opencv_copy_make_border_arginfo)
ZEND_NS_NAMED_FE(OPENCV_NS, dft, ZEND_FN(opencv_dft), opencv_dft_arginfo)
ZEND_NS_NAMED_FE(OPENCV_NS, magnitude, ZEND_FN(opencv_magnitude), opencv_magnitude_arginfo)
ZEND_NS_NAMED_FE(OPENCV_NS, add, ZEND_FN(opencv_add), opencv_add_arginfo)
PHP_FE_END /* Must be the last line in opencv_functions[] */
};
/* }}} */
+20 -15
Ver Arquivo
@@ -153,6 +153,23 @@ void opencv_scalar_free_obj(zend_object *object)
}
void opencv_scalar_update_property_by_c_scalar(zval *z,Scalar *scalar){
zval val;
array_init(&val);
add_next_index_double(&val,scalar->val[0]);
add_next_index_double(&val,scalar->val[1]);
add_next_index_double(&val,scalar->val[2]);
add_next_index_double(&val,scalar->val[3]);
zend_update_property(opencv_scalar_ce, z, "val", sizeof("val")-1, &val);
/**
* 数组val在array_init()后refcount=1
* 插入成员属性zend_update_property()会自动加一次,变为2
* 对象销毁后只会减1,需要要在zend_update_property()后主动减一次引用
*/
Z_DELREF(val);
}
/**
* Scalar __construct
* @param execute_data
@@ -160,26 +177,14 @@ void opencv_scalar_free_obj(zend_object *object)
*/
PHP_METHOD(opencv_scalar, __construct)
{
long value1 = 0, value2 = 0, value3 = 0, value4 = 0;//value: 8bit=0~255 16bit=0~65535...
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|llll", &value1, &value2, &value3, &value4) == FAILURE) {
double value1 = 0, value2 = 0, value3 = 0, value4 = 0;//value: 8bit=0~255 16bit=0~65535...
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|dddd", &value1, &value2, &value3, &value4) == FAILURE) {
RETURN_NULL();
}
opencv_scalar_object *obj = Z_PHP_SCALAR_OBJ_P(getThis());
Scalar scalar = Scalar((int)value1, (int)value2, (int)value3, (int)value4);
obj->scalar = new Scalar(scalar);
zval val;
array_init(&val);
add_next_index_long(&val,value1);
add_next_index_long(&val,value2);
add_next_index_long(&val,value3);
add_next_index_long(&val,value4);
zend_update_property(opencv_scalar_ce, getThis(), "val", sizeof("val")-1, &val);
/**
* 数组val在array_init()后refcount=1
* 插入成员属性zend_update_property()会自动加一次,变为2
* 对象销毁后只会减1,需要要在zend_update_property()后主动减一次引用
*/
Z_DELREF(val);
opencv_scalar_update_property_by_c_scalar(getThis(), obj->scalar);
}
+1 -1
Ver Arquivo
@@ -59,5 +59,5 @@ static inline opencv_rect_object* get_rect_obj(zend_object *obj) {
return (opencv_rect_object*)((char*)(obj) - XtOffsetOf(opencv_rect_object, std));
}
void opencv_scalar_update_property_by_c_scalar(zval *z,Scalar *scalar);
#endif //OPENCV_OPENCV_TYPE_H
+105
Ver Arquivo
@@ -340,3 +340,108 @@ PHP_FUNCTION(opencv_magnitude){
RETURN_NULL();
}
/**
* CV\add
* @param execute_data
* @param return_value
*/
PHP_FUNCTION(opencv_add){
zval *src1_zval, *src2_zval, *dst_zval, *mask_zval;
long dtype = -1;
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;
if(Z_TYPE_P(src1_zval) == IS_OBJECT && (Z_OBJCE_P(src1_zval) == opencv_mat_ce || Z_OBJCE_P(src1_zval) == opencv_scalar_ce)){
if(Z_OBJCE_P(src1_zval) == opencv_mat_ce){
src1_mat_object = Z_PHP_MAT_OBJ_P(src1_zval);
}else{
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 && (Z_OBJCE_P(src2_zval) == opencv_mat_ce || Z_OBJCE_P(src2_zval) == opencv_scalar_ce)){
if(Z_OBJCE_P(src2_zval) == opencv_mat_ce){
src2_mat_object = Z_PHP_MAT_OBJ_P(src2_zval);
}else{
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);
//dst is Mat object
if(src1_mat_object != NULL && src2_mat_object != NULL){
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);
}
add(*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);
}else if(src1_mat_object != NULL && src2_mat_object == NULL){
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);
}
add(*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);
}else if(src1_mat_object==NULL && src2_mat_object != NULL){
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);
}
add(*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);
}else{
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);
}
add(*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);
}
RETURN_NULL();
}
+8
Ver Arquivo
@@ -57,5 +57,13 @@ ZEND_BEGIN_ARG_INFO_EX(opencv_magnitude_arginfo, 0, 0, 3)
ZEND_ARG_INFO(1, magnitude)
ZEND_END_ARG_INFO()
PHP_FUNCTION(opencv_magnitude);
ZEND_BEGIN_ARG_INFO_EX(opencv_add_arginfo, 0, 0, 5)
ZEND_ARG_INFO(0, src1)
ZEND_ARG_INFO(0, src2)
ZEND_ARG_INFO(1, dst)
ZEND_ARG_INFO(0, mask)
ZEND_ARG_INFO(0, dtype)
ZEND_END_ARG_INFO()
PHP_FUNCTION(opencv_add);
#endif //OPENCV_CORE_H
+53
Ver Arquivo
@@ -0,0 +1,53 @@
--TEST--
CV add function test
--SKIPIF--
<?php if (!extension_loaded("opencv")) print "skip"; ?>
--FILE--
<?php
use function CV\{add};
use const CV\{CV_8UC1};
use CV\{Mat,Scalar};
$mat1 = new Mat(5,5,CV_8UC1,new Scalar(3));
$mat3 = null;
$mat1->print();
add($mat1,new Scalar(1,1,1,1),$mat1);
$mat1->print();
add(new Scalar(1,1,1,1),$mat1,$mat1);
$mat1->print();
$scalar=null;
add(new Scalar(1,1,1,1),new Scalar(1,1,1,1),$scalar);
$scalar->print();
var_dump($scalar);
?>
--EXPECT--
[ 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]
[ 4, 4, 4, 4, 4;
4, 4, 4, 4, 4;
4, 4, 4, 4, 4;
4, 4, 4, 4, 4;
4, 4, 4, 4, 4]
[ 5, 5, 5, 5, 5;
5, 5, 5, 5, 5;
5, 5, 5, 5, 5;
5, 5, 5, 5, 5;
5, 5, 5, 5, 5]
[2, 2, 2, 2]
object(CV\Scalar)#4 (1) {
["val"]=>
array(4) {
[0]=>
float(2)
[1]=>
float(2)
[2]=>
float(2)
[3]=>
float(2)
}
}
+5 -5
Ver Arquivo
@@ -1,5 +1,5 @@
--TEST--
Point test
Type test
--SKIPIF--
<?php if (!extension_loaded("opencv")) print "skip"; ?>
--FILE--
@@ -43,13 +43,13 @@ object(CV\Scalar)#2 (1) {
["val"]=>
array(4) {
[0]=>
int(2500)
float(2500)
[1]=>
int(0)
float(0)
[2]=>
int(0)
float(0)
[3]=>
int(0)
float(0)
}
}
[2500, 0, 0, 0]