From 779677d399d9c8865f91f27b19772e06454c335f Mon Sep 17 00:00:00 2001 From: Vladimir Goncharov Date: Wed, 3 Jan 2018 22:57:26 +0200 Subject: [PATCH] Update opencv_facerec.cc 'update' function --- source/opencv2/face/opencv_facerec.cc | 47 +++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/source/opencv2/face/opencv_facerec.cc b/source/opencv2/face/opencv_facerec.cc index 4d67570..93f25a4 100644 --- a/source/opencv2/face/opencv_facerec.cc +++ b/source/opencv2/face/opencv_facerec.cc @@ -152,6 +152,52 @@ PHP_METHOD(opencv_lbph_face_recognizer, write) RETURN_NULL(); } +PHP_METHOD(opencv_lbph_face_recognizer, update) +{ + zval *src_zval, *labels_zval; + zend_ulong _h; + zval *array_val_zval; + if (zend_parse_parameters(ZEND_NUM_ARGS(), "aa", &src_zval, &labels_zval) == FAILURE) { + RETURN_NULL(); + } + std::vector src; + std::vector labels; + //check + opencv_lbph_face_recognizer_object *obj = Z_PHP_LBPH_FACE_RECOGNIZER_OBJ_P(getThis()); + unsigned long src_count = zend_hash_num_elements(Z_ARRVAL_P(src_zval)); + src.reserve(src_count);//指定长度 + opencv_mat_object *mat_obj; + + ZEND_HASH_FOREACH_NUM_KEY_VAL(Z_ARRVAL_P(src_zval),_h,array_val_zval){ + //check array_val_zval is Mat object + again1: + if(Z_TYPE_P(array_val_zval) == IS_OBJECT && Z_OBJCE_P(array_val_zval)==opencv_mat_ce){ + mat_obj = Z_PHP_MAT_OBJ_P(array_val_zval); + src.push_back(*mat_obj->mat); + }else if(Z_TYPE_P(array_val_zval) == IS_REFERENCE){ + array_val_zval = Z_REFVAL_P(array_val_zval); + goto again1; + } else { + opencv_throw_exception("array value just Mat object."); + RETURN_NULL(); + } + }ZEND_HASH_FOREACH_END(); + ZEND_HASH_FOREACH_NUM_KEY_VAL(Z_ARRVAL_P(labels_zval),_h,array_val_zval){ + again2: + if(Z_TYPE_P(array_val_zval) == IS_LONG){ + labels.push_back((int)zval_get_long(array_val_zval)); + }else if(Z_TYPE_P(array_val_zval) == IS_REFERENCE){ + array_val_zval = Z_REFVAL_P(array_val_zval); + goto again2; + } else { + opencv_throw_exception("array value just number."); + RETURN_NULL(); + } + }ZEND_HASH_FOREACH_END(); + obj->faceRecognizer->update(src,labels); + RETURN_NULL(); +} + /** * opencv_lbph_face_recognizer_methods[] */ @@ -163,6 +209,7 @@ const zend_function_entry opencv_lbph_face_recognizer_methods[] = { PHP_ME(opencv_lbph_face_recognizer, predictConfidence, NULL, ZEND_ACC_PUBLIC) PHP_ME(opencv_lbph_face_recognizer, read, NULL, ZEND_ACC_PUBLIC) PHP_ME(opencv_lbph_face_recognizer, write, NULL, ZEND_ACC_PUBLIC) + PHP_ME(opencv_lbph_face_recognizer, update, NULL, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */