@@ -31,6 +31,8 @@ void opencv_imgproc_init(int module_number)
3131 opencv_flood_fill_flags_init (module_number);
3232 opencv_threshold_types_init (module_number);
3333 opencv_adaptive_threshold_types_init (module_number);
34+ opencv_retrieval_modes_init (module_number);
35+ opencv_contour_approximation_modes_init (module_number);
3436}
3537
3638/* *
@@ -1084,6 +1086,69 @@ PHP_FUNCTION(opencv_flood_fill){
10841086 RETURN_LONG (result);
10851087}
10861088
1089+ // todo
1090+ PHP_FUNCTION (opencv_find_contours_without_hierarchy){
1091+ zval *image_zval, *contours_zval, *offset_zval = NULL ;
1092+ long mode, method;
1093+
1094+ if (zend_parse_parameters (ZEND_NUM_ARGS (), " Ozll|z" ,
1095+ &image_zval, opencv_mat_ce,
1096+ &contours_zval,
1097+ &mode, &method,
1098+ &offset_zval) == FAILURE) {
1099+ RETURN_NULL ();
1100+ }
1101+
1102+ opencv_mat_object *image_object = Z_PHP_MAT_OBJ_P (image_zval);
1103+ zval *contours_real_zval = Z_REFVAL_P (contours_zval);
1104+ zval *offset_real_zval;
1105+
1106+ Point offset;
1107+ opencv_point_object *offset_object;
1108+ if (offset_zval != NULL ){
1109+ offset_real_zval = Z_REFVAL_P (offset_zval);
1110+ if (Z_TYPE_P (offset_real_zval) == IS_OBJECT && Z_OBJCE_P (offset_real_zval) == opencv_point_ce){
1111+ // is Point object
1112+ offset_object = Z_PHP_POINT_OBJ_P (offset_real_zval);
1113+ } else {
1114+ // isn't Point object
1115+ zval_ptr_dtor (offset_real_zval);
1116+ zval instance;
1117+ object_init_ex (&instance,opencv_point_ce);
1118+ ZVAL_COPY_VALUE (offset_real_zval, &instance);// Cover dst_real_zval by Point object
1119+ offset_object = Z_PHP_POINT_OBJ_P (offset_real_zval);
1120+ }
1121+ } else {
1122+ offset = Point ();
1123+ }
1124+
1125+ std::vector<std::vector<cv::Point> > contours;
1126+ findContours (*image_object->mat , contours, (int )mode, (int )method, offset);
1127+
1128+ if (offset_zval != NULL ){
1129+ offset_object->point = new Point (offset);
1130+ opencv_point_update_property_by_c_point (offset_real_zval, offset_object->point );
1131+ }
1132+ zval_dtor (contours_real_zval);// if contours_real_zval value not eq null ,free contours_real_zval to avoid memory leaks detected
1133+ array_init (contours_real_zval);
1134+ int point_count = 0 ;
1135+ for (unsigned long i=0 ; i < contours.size (); i++){
1136+ zval *OPENCV_CONNECT (zval_arr,i);
1137+ array_init (OPENCV_CONNECT (zval_arr,i));
1138+ for (unsigned long j=0 ; j < contours.at (i).size (); j++){
1139+ zval OPENCV_CONNECT (zval_point,point_count);
1140+ object_init_ex (&OPENCV_CONNECT (zval_point,point_count), opencv_point_ce);
1141+ Z_PHP_POINT_OBJ_P (&OPENCV_CONNECT (zval_point,point_count))->point =new Point (contours.at (i).at (j));
1142+ opencv_point_update_property_by_c_point (&OPENCV_CONNECT (zval_point,point_count), Z_PHP_POINT_OBJ_P (&OPENCV_CONNECT (zval_point,point_count))->point );
1143+ add_next_index_zval (OPENCV_CONNECT (zval_arr,i),&OPENCV_CONNECT (zval_point,point_count));
1144+ point_count++;
1145+ }
1146+ add_next_index_zval (contours_real_zval,OPENCV_CONNECT (zval_arr,i));
1147+
1148+ }
1149+ RETURN_NULL ();
1150+ }
1151+
10871152/* *
10881153 * color conversion code in CV\cvtColor,opencv enum ColorConversionCodes
10891154 * @param module_number
@@ -1391,3 +1456,18 @@ void opencv_adaptive_threshold_types_init(int module_number){
13911456 REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " ADAPTIVE_THRESH_MEAN_C" , ADAPTIVE_THRESH_MEAN_C, CONST_CS | CONST_PERSISTENT);
13921457 REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " ADAPTIVE_THRESH_GAUSSIAN_C" , ADAPTIVE_THRESH_GAUSSIAN_C, CONST_CS | CONST_PERSISTENT);
13931458}
1459+
1460+ void opencv_retrieval_modes_init (int module_number){
1461+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " RETR_EXTERNAL" , RETR_EXTERNAL, CONST_CS | CONST_PERSISTENT);
1462+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " RETR_LIST" , RETR_LIST, CONST_CS | CONST_PERSISTENT);
1463+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " RETR_CCOMP" , RETR_CCOMP, CONST_CS | CONST_PERSISTENT);
1464+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " RETR_TREE" , RETR_TREE, CONST_CS | CONST_PERSISTENT);
1465+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " RETR_FLOODFILL" , RETR_FLOODFILL, CONST_CS | CONST_PERSISTENT);
1466+ }
1467+
1468+ void opencv_contour_approximation_modes_init (int module_number){
1469+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " CHAIN_APPROX_NONE" , CHAIN_APPROX_NONE, CONST_CS | CONST_PERSISTENT);
1470+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " CHAIN_APPROX_SIMPLE" , CHAIN_APPROX_SIMPLE, CONST_CS | CONST_PERSISTENT);
1471+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " CHAIN_APPROX_TC89_L1" , CHAIN_APPROX_TC89_L1, CONST_CS | CONST_PERSISTENT);
1472+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " CHAIN_APPROX_TC89_KCOS" , CHAIN_APPROX_TC89_KCOS, CONST_CS | CONST_PERSISTENT);
1473+ }
0 commit comments