Skip to content

Commit b1bb67a

Browse files
committed
Merge branch 'dev'
2 parents 9311e01 + c849f56 commit b1bb67a

File tree

6 files changed

+211
-110
lines changed

6 files changed

+211
-110
lines changed

source/opencv2/face/opencv_facerec.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ zend_object_handlers opencv_lbph_face_recognizer_object_handlers;
2424

2525
zend_class_entry *opencv_lbph_face_recognizer_ce;
2626

27+
zend_class_entry *opencv_base_face_recognizer_ce;
28+
2729
PHP_METHOD(opencv_lbph_face_recognizer, create)
2830
{
2931
zval instance;
@@ -145,4 +147,24 @@ extern void opencv_lbph_face_recognizer_init(int module_number){
145147
zend_get_std_object_handlers(), sizeof(zend_object_handlers));
146148
opencv_lbph_face_recognizer_object_handlers.clone_obj = NULL;
147149
opencv_lbph_face_recognizer_object_handlers.free_obj = opencv_lbph_face_recognizer_free_obj;
150+
}
151+
152+
/**
153+
* -----------------------------------【CV\BaseFaceRecognizer】--------------------------------------
154+
*
155+
* -------------------------------------------------------------------------------------
156+
*/
157+
158+
/**
159+
* opencv_lbph_face_recognizer_methods[]
160+
*/
161+
const zend_function_entry opencv_base_face_recognizer_methods[] = {
162+
PHP_FE_END
163+
};
164+
/* }}} */
165+
166+
void opencv_base_face_recognizer_init(int module_number){
167+
zend_class_entry ce;
168+
INIT_NS_CLASS_ENTRY(ce,OPENCV_FACE_NS, "BaseFaceRecognizer", opencv_base_face_recognizer_methods);
169+
opencv_base_face_recognizer_ce = zend_register_internal_class_ex(&ce, opencv_face_recognizer_ce);
148170
}

source/opencv2/face/opencv_facerec.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@
2323
#include <opencv2/face.hpp>
2424
using namespace cv::face;
2525

26+
27+
/**
28+
* -----------------------------------【CV\LBPHFaceRecognizer】-------------------------
29+
*
30+
* -------------------------------------------------------------------------------------
31+
*/
2632
extern void opencv_lbph_face_recognizer_init(int module_number);
2733

2834
#define Z_PHP_LBPH_FACE_RECOGNIZER_OBJ_P(zv) get_lbph_face_recognizer_obj(Z_OBJ_P(zv))
@@ -41,4 +47,13 @@ static inline opencv_lbph_face_recognizer_object* get_lbph_face_recognizer_obj(z
4147
return (opencv_lbph_face_recognizer_object*)((char*)(obj) - XtOffsetOf(opencv_lbph_face_recognizer_object, std));
4248
}
4349

50+
51+
/**
52+
* -----------------------------------【CV\BaseFaceRecognizer】-------------------------
53+
*
54+
* -------------------------------------------------------------------------------------
55+
*/
56+
extern void opencv_base_face_recognizer_init(int module_number);
57+
58+
4459
#endif //PHP_OPENCV_FACEREC_H

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
/**

source/opencv2/opencv_face.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,5 @@ void opencv_face_recognizer_init(int module_number){
3737
void opencv_face_init(int module_number){
3838
opencv_face_recognizer_init(module_number);
3939
opencv_lbph_face_recognizer_init(module_number);
40+
opencv_base_face_recognizer_init(module_number);
4041
}

source/opencv2/opencv_highgui.cc

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -102,29 +102,45 @@ PHP_FUNCTION(opencv_named_window){
102102
RETURN_NULL();
103103
}
104104

105-
struct opencv_fcall_info_struct{
105+
struct opencv_fcall_info_cb{
106106
zend_fcall_info *fci;
107107
zend_fcall_info_cache *fci_cache;
108108
};
109109

110+
111+
opencv_fcall_info_cb * opencv_fcall_info_cb_create(zend_fcall_info *fci_ptr, zend_fcall_info_cache *fci_cache_ptr) {
112+
opencv_fcall_info_cb *cb = new opencv_fcall_info_cb;
113+
cb->fci = new zend_fcall_info;
114+
cb->fci_cache = new zend_fcall_info_cache;
115+
116+
memcpy(cb->fci, fci_ptr, sizeof(zend_fcall_info));
117+
memcpy(cb->fci_cache, fci_cache_ptr, sizeof(zend_fcall_info_cache));
118+
Z_TRY_ADDREF(cb->fci->function_name);
119+
cb->fci->param_count = 0;
120+
cb->fci->no_separation = 1;
121+
cb->fci->retval = NULL;
122+
123+
return cb;
124+
}
125+
110126
void opencv_create_trackbar_callback(int pos, void* userdata){
111-
opencv_fcall_info_struct *fci_s=(opencv_fcall_info_struct*)userdata;
127+
opencv_fcall_info_cb *fci_s=(opencv_fcall_info_cb*)userdata;
112128

113129
zval retval;
114130
zval args[1];
115-
ZVAL_LONG(&args[0], (long)pos);
131+
ZVAL_LONG(&args[0], (long)pos);//将滑动条滑动的值传入到闭包参数中
116132
fci_s->fci->param_count = 1;
117133
fci_s->fci->params = args;
118134
fci_s->fci->retval = &retval;
119135

120-
//todo zend_call_function: Assertion `((zend_object*)func->op_array.prototype)->gc.u.v.type == 8' failed.
121136
zend_call_function(fci_s->fci, fci_s->fci_cache);
122137
zval_ptr_dtor(&args[0]);
123138
}
124139

125140

141+
126142
/**
127-
* //todo c++ createTrackbar 跳转事件调用php传入的闭包:1php全局变量,2c++闭包
143+
* todo Total 1 memory leaks detected
128144
* CV\createTrackbar
129145
* @param execute_data
130146
* @param return_value
@@ -134,35 +150,21 @@ PHP_FUNCTION(opencv_create_trackbar){
134150
long value, count, trackbarname_len,winname_len;
135151
zval retval;
136152

137-
zend_fcall_info *fci = new zend_fcall_info;
138-
zend_fcall_info_cache *fci_cache = new zend_fcall_info_cache;
153+
zend_fcall_info fci;
154+
zend_fcall_info_cache fci_cache;
139155
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssll|f",
140156
&trackbarname, &trackbarname_len,
141157
&winname,&winname_len,
142158
&value,&count,
143-
fci, fci_cache) == FAILURE) {
159+
&fci, &fci_cache) == FAILURE) {
144160
return;
145161
}
146162

147163
int *trackbar_value_ptr = new int(value);
148164

149-
opencv_fcall_info_struct *fci_s = new opencv_fcall_info_struct;
150-
fci_s->fci=fci;
151-
fci_s->fci_cache = fci_cache;
152-
createTrackbar(trackbarname, winname, trackbar_value_ptr, (int)count,opencv_create_trackbar_callback,fci_s);
153-
opencv_create_trackbar_callback(*trackbar_value_ptr,fci_s);
154-
// createTrackbar(trackbarname, winname, trackbar_value_ptr, (int)count);
155-
// zend_call_function(fci_s->fci, fci_s->fci_cache);
165+
opencv_fcall_info_cb *cb = opencv_fcall_info_cb_create(&fci, &fci_cache);
166+
createTrackbar(trackbarname, winname, trackbar_value_ptr, (int)count,opencv_create_trackbar_callback,cb);
156167
RETURN_NULL();
157-
158-
// if (zend_call_function(fci, fci_cache) == SUCCESS && Z_TYPE(retval) != IS_UNDEF) {
159-
// zval_ptr_dtor(&args[0]);
160-
// RETURN_ZVAL(&retval,1,1);
161-
// ZVAL_COPY_VALUE(return_value, &retval);
162-
// } else {
163-
// RETURN_FALSE;
164-
// }
165-
166168
}
167169

168170
PHP_FUNCTION(opencv_destroy_window){

0 commit comments

Comments
 (0)