CV\add function and opencv_scalar_update_property_by_c_scalar
Esse commit está contido em:
@@ -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[] */
|
||||
};
|
||||
/* }}} */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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]
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário