diff --git a/opencv.cc b/opencv.cc index 6d12eb8..5bc1d63 100644 --- a/opencv.cc +++ b/opencv.cc @@ -258,6 +258,7 @@ const zend_function_entry opencv_functions[] = { ZEND_NS_NAMED_FE(OPENCV_NS, getPerspectiveTransform, ZEND_FN(opencv_get_perspective_transform), opencv_get_perspective_transform_arginfo) ZEND_NS_NAMED_FE(OPENCV_NS, warpPerspective, ZEND_FN(opencv_warp_perspective), opencv_warp_perspective_arginfo) ZEND_NS_NAMED_FE(OPENCV_DNN_NS, blobFromImage, ZEND_FN(opencv_dnn_blob_from_image), arginfo_void) + ZEND_NS_NAMED_FE(OPENCV_DNN_NS, blobFromImages, ZEND_FN(opencv_dnn_blob_from_images), arginfo_void) ZEND_NS_NAMED_FE(OPENCV_DNN_NS, readNetFromCaffe, ZEND_FN(opencv_dnn_read_net_from_caffe), arginfo_void) ZEND_NS_NAMED_FE(OPENCV_DNN_NS, readNetFromTorch, ZEND_FN(opencv_dnn_read_net_from_torch), arginfo_void) ZEND_NS_NAMED_FE(OPENCV_DNN_NS, readNetFromTensorflow, ZEND_FN(opencv_dnn_read_net_from_tensorflow), arginfo_void) diff --git a/source/opencv2/dnn/opencv_dnn.cc b/source/opencv2/dnn/opencv_dnn.cc index ac3dfa4..881d03d 100644 --- a/source/opencv2/dnn/opencv_dnn.cc +++ b/source/opencv2/dnn/opencv_dnn.cc @@ -78,6 +78,48 @@ PHP_FUNCTION(opencv_dnn_blob_from_image) RETURN_ZVAL(&instance,0,0); //return php Mat object } +PHP_FUNCTION(opencv_dnn_blob_from_images) +{ + zval *images_zval, *size_zval, *mean_zval; + double scalefactor = 1.; + bool swapRB = false, crop = false; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "adOO|bb", + &images_zval, + &scalefactor, + &size_zval, opencv_size_ce, + &mean_zval, opencv_scalar_ce, + &swapRB, + &crop + ) == FAILURE) { + RETURN_NULL(); + } + + opencv_size_object *size_object = Z_PHP_SIZE_OBJ_P(size_zval); + opencv_scalar_object *mean_object = Z_PHP_SCALAR_OBJ_P(mean_zval); + + HashTable *images_ht = Z_ARRVAL_P(images_zval); + std::vector images_vec; + + zval *image_zval; + ZEND_HASH_FOREACH_VAL(images_ht, image_zval) { + if(Z_TYPE_P(image_zval) == IS_OBJECT && Z_OBJCE_P(image_zval)==opencv_mat_ce) + images_vec.push_back(*Z_PHP_MAT_OBJ_P(image_zval)->mat); + } + ZEND_HASH_FOREACH_END(); + + + Mat im = blobFromImages(images_vec, scalefactor, *size_object->size, *mean_object->scalar, swapRB, crop); + + zval instance; + object_init_ex(&instance, opencv_mat_ce); + opencv_mat_object *new_obj = Z_PHP_MAT_OBJ_P(&instance); + new_obj->mat=new Mat(im); + opencv_mat_update_property_by_c_mat(&instance, new_obj->mat); + RETURN_ZVAL(&instance,0,0); //return php Mat object +} + + PHP_FUNCTION(opencv_dnn_read_net_from_torch) { char *filename; diff --git a/source/opencv2/dnn/opencv_dnn.h b/source/opencv2/dnn/opencv_dnn.h index 98c66e6..965fa93 100644 --- a/source/opencv2/dnn/opencv_dnn.h +++ b/source/opencv2/dnn/opencv_dnn.h @@ -28,6 +28,7 @@ extern void opencv_dnn_init(int module_number); #endif PHP_FUNCTION(opencv_dnn_blob_from_image); +PHP_FUNCTION(opencv_dnn_blob_from_images); PHP_FUNCTION(opencv_dnn_read_net_from_torch); PHP_FUNCTION(opencv_dnn_read_net_from_caffe); PHP_FUNCTION(opencv_dnn_read_net_from_tensorflow); diff --git a/tests/dnn.phpt b/tests/dnn.phpt index 78d5c39..92fabd1 100644 --- a/tests/dnn.phpt +++ b/tests/dnn.phpt @@ -1,5 +1,5 @@ --TEST-- -DNN::blobFromImage +DNN::blobFromImage, DNN:blobFromImages --SKIPIF-- --FILE-- @@ -11,8 +11,24 @@ $src = imread("./tests/Obama_gray.png"); $blob = \CV\DNN\blobFromImage($src, 1, new \CV\Size(48, 48), new Scalar(104, 177, 123)); var_export($blob); +print PHP_EOL; +$blob = \CV\DNN\blobFromImages([$src], 1, new \CV\Size(48, 48), new Scalar(104, 177, 123)); +var_export($blob); ?> --EXPECT-- +CV\Mat::__set_state(array( + 'type' => 5, + 'rows' => -1, + 'cols' => -1, + 'dims' => 4, + 'shape' => + array ( + 0 => 1, + 1 => 3, + 2 => 48, + 3 => 48, + ), +)) CV\Mat::__set_state(array( 'type' => 5, 'rows' => -1,