1+
2+ #include " ../../php_opencv.h"
3+ #include < opencv2/objdetect.hpp>
4+ #include " opencv_objdetect.h"
5+ #include " core/opencv_type.h"
6+ #include " core/opencv_mat.h"
7+
8+ zend_class_entry *opencv_cascade_classifier_ce;
9+
10+ zend_object_handlers opencv_cascade_classifier_object_handlers;
11+
12+ /* *
13+ * @param type
14+ * @return
15+ */
16+ zend_object* opencv_cascade_classifier_create_handler (zend_class_entry *type)
17+ {
18+ int size = sizeof (opencv_cascade_classifier_object);
19+ opencv_cascade_classifier_object *obj = (opencv_cascade_classifier_object *)ecalloc (1 ,size);
20+ memset (obj, 0 , sizeof (opencv_cascade_classifier_object));
21+ zend_object_std_init (&obj->std , type);
22+ object_properties_init (&obj->std , type);
23+ obj->std .ce = type;
24+ obj->std .handlers = &opencv_cascade_classifier_object_handlers;
25+ return &obj->std ;
26+ }
27+
28+ /* *
29+ * CascadeClassifier __construct
30+ * @param execute_data
31+ * @param return_value
32+ */
33+ PHP_METHOD (opencv_cascade_classifier, __construct)
34+ {
35+ opencv_cascade_classifier_object *obj = Z_PHP_CASCADE_CLASSIFIER_OBJ_P (getThis ());
36+ obj->cascadeClassifier = new CascadeClassifier ();
37+ }
38+
39+ PHP_METHOD (opencv_cascade_classifier, load)
40+ {
41+ char *filename;
42+ long filename_len;
43+ if (zend_parse_parameters (ZEND_NUM_ARGS (), " s" , &filename, &filename_len) == FAILURE) {
44+ RETURN_NULL ();
45+ }
46+ opencv_cascade_classifier_object *this_obj = Z_PHP_CASCADE_CLASSIFIER_OBJ_P (getThis ());
47+ bool result = this_obj->cascadeClassifier ->load (filename);
48+ RETURN_BOOL (result);
49+ }
50+
51+ ZEND_BEGIN_ARG_INFO_EX (opencv_cascade_classifier_detect_multi_scale_arginfo, 0 , 0 , 7 )
52+ ZEND_ARG_INFO(0 , image)
53+ ZEND_ARG_INFO(1 , objects)
54+ ZEND_ARG_INFO(0 , scaleFactor)
55+ ZEND_ARG_INFO(0 , minNeighbors)
56+ ZEND_ARG_INFO(0 , flags)
57+ ZEND_ARG_INFO(0 , minSize)
58+ ZEND_ARG_INFO(0 , maxSize)
59+ ZEND_END_ARG_INFO()
60+
61+ /* *
62+ * CascadeClassifier->detectMultiScale function
63+ * @param execute_data
64+ * @param return_value
65+ */
66+ PHP_METHOD(opencv_cascade_classifier, detect_multi_scale)
67+ {
68+ zval *image_zval, *objects_zval, *min_size_zval = NULL , *max_size_zval = NULL ;
69+ double scale_factor = 1.1 ;
70+ long min_neighbors = 3 , flags = 0 ;
71+ Size min_size = Size (), max_size = Size ();
72+ if (zend_parse_parameters (ZEND_NUM_ARGS (), " Oz|dllOO" ,
73+ &image_zval, opencv_mat_ce,
74+ &objects_zval, &scale_factor, &min_neighbors, &flags,
75+ &min_size_zval, opencv_size_ce,
76+ &max_size_zval, opencv_size_ce
77+
78+ ) == FAILURE) {
79+ RETURN_NULL ();
80+ }
81+ std::vector<Rect> objects;
82+ opencv_mat_object *image_object = Z_PHP_MAT_OBJ_P (image_zval);
83+ opencv_cascade_classifier_object *this_obj = Z_PHP_CASCADE_CLASSIFIER_OBJ_P (getThis ());
84+ if (min_size_zval != NULL ){
85+ opencv_size_object *min_size_object = Z_PHP_SIZE_OBJ_P (min_size_zval);
86+ min_size = *min_size_object->size ;
87+ }
88+
89+ if (max_size_zval != NULL ){
90+ opencv_size_object *max_size_object = Z_PHP_SIZE_OBJ_P (max_size_zval);
91+ max_size = *max_size_object->size ;
92+ }
93+
94+ this_obj->cascadeClassifier ->detectMultiScale (
95+ *(image_object->mat ), objects, scale_factor,
96+ (int )min_neighbors, (int )flags,
97+ min_size, max_size);
98+
99+ zval *objects_real_zval = Z_REFVAL_P (objects_zval);
100+ zval instance;
101+ array_init (&instance);
102+ for (unsigned long i=0 ; i < objects.size (); i++){
103+ zval OPENCV_CONNECT (zval,i);
104+ Rect OPENCV_CONNECT (rect,i);
105+ opencv_rect_object *OPENCV_CONNECT (rect_object,i);
106+ object_init_ex (&OPENCV_CONNECT (zval,i), opencv_rect_ce);
107+ OPENCV_CONNECT (rect_object,i) = Z_PHP_RECT_OBJ_P (&OPENCV_CONNECT (zval,i));
108+ OPENCV_CONNECT (rect,i) = objects.at (i);
109+ OPENCV_CONNECT (rect_object,i)->rect = new Rect (OPENCV_CONNECT (rect,i));
110+ opencv_rect_update_property_by_c_rect (&OPENCV_CONNECT (zval,i), OPENCV_CONNECT (rect_object,i)->rect );
111+ add_next_index_zval (&instance,&OPENCV_CONNECT (zval,i));
112+
113+ }
114+ ZVAL_COPY_VALUE (objects_real_zval, &instance);
115+ RETURN_NULL ();
116+ }
117+
118+ /* *
119+ * opencv_cascade_classifier_methods[]
120+ */
121+ const zend_function_entry opencv_cascade_classifier_methods[] = {
122+ PHP_ME (opencv_cascade_classifier, __construct, NULL , ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
123+ PHP_ME (opencv_cascade_classifier, load, NULL , ZEND_ACC_PUBLIC)
124+ PHP_MALIAS (opencv_cascade_classifier, detectMultiScale ,detect_multi_scale, opencv_cascade_classifier_detect_multi_scale_arginfo, ZEND_ACC_PUBLIC)
125+ PHP_FE_END
126+ };
127+ /* }}} */
128+
129+ void opencv_cascade_classifier_free_obj (zend_object *object)
130+ {
131+ opencv_cascade_classifier_object *obj;
132+ obj = get_cascade_classifier_obj (object);
133+ delete obj->cascadeClassifier ;
134+ zend_object_std_dtor (object);
135+ }
136+
137+
138+ /* *
139+ * opencv_cascade_classifier_init
140+ * @param module_number
141+ */
142+ void opencv_cascade_classifier_init (int module_number){
143+ zend_class_entry ce;
144+ INIT_NS_CLASS_ENTRY (ce,OPENCV_NS, " CascadeClassifier" , opencv_cascade_classifier_methods);
145+ opencv_cascade_classifier_ce = zend_register_internal_class (&ce);
146+
147+ opencv_cascade_classifier_ce->create_object = opencv_cascade_classifier_create_handler;
148+ memcpy (&opencv_cascade_classifier_object_handlers,
149+ zend_get_std_object_handlers (), sizeof (zend_object_handlers));
150+ opencv_cascade_classifier_object_handlers.clone_obj = NULL ;
151+ // opencv_cascade_classifier_object_handlers.write_property = opencv_mat_write_property;
152+ opencv_cascade_classifier_object_handlers.free_obj = opencv_cascade_classifier_free_obj;
153+ }
154+
155+ void opencv_objdetect_init (int module_number){
156+ opencv_cascade_classifier_init (module_number);
157+ }
0 commit comments