Skip to content

Commit 3a5c7f7

Browse files
committed
fix CV\fillPoly and change opencv_type function
1 parent 05da542 commit 3a5c7f7

File tree

5 files changed

+81
-40
lines changed

5 files changed

+81
-40
lines changed

opencv.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ const zend_function_entry opencv_functions[] = {
193193
ZEND_NS_NAMED_FE(OPENCV_NS, cvtColor, ZEND_FN(opencv_cv_t_color), NULL)
194194
ZEND_NS_NAMED_FE(OPENCV_NS, ellipse, ZEND_FN(opencv_ellipse), NULL)
195195
ZEND_NS_NAMED_FE(OPENCV_NS, circle, ZEND_FN(opencv_circle), NULL)
196-
ZEND_NS_NAMED_FE(OPENCV_NS, fillPoly, ZEND_FN(opencv_fill_poly), NULL)//TODO fillPoly
196+
ZEND_NS_NAMED_FE(OPENCV_NS, fillPoly, ZEND_FN(opencv_fill_poly), opencv_fill_poly_arginfo)
197197
ZEND_NS_NAMED_FE(OPENCV_NS, line, ZEND_FN(opencv_line), NULL)
198198
ZEND_NS_NAMED_FE(OPENCV_NS, rectangle, ZEND_FN(opencv_rectangle), NULL)
199199
ZEND_NS_NAMED_FE(OPENCV_NS, rectangleByPoint, ZEND_FN(opencv_rectangle_by_point), NULL)

source/opencv2/core/opencv_type.cc

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,15 @@ PHP_METHOD(opencv_point, __construct)
4949
Point point = Point((int)x, (int)y);
5050
obj->point = new Point(point);
5151

52-
zend_update_property_long(opencv_point_ce, getThis(), "x", sizeof("x")-1, x);
53-
zend_update_property_long(opencv_point_ce, getThis(), "y", sizeof("y")-1, y);
52+
opencv_point_update_property_by_c_point(getThis(),obj->point);
5453
}
5554

55+
void opencv_point_update_property_by_c_point(zval *z, Point *point){
56+
zend_update_property_long(opencv_point_ce, z, "x", sizeof("x")-1, point->x);
57+
zend_update_property_long(opencv_point_ce, z, "y", sizeof("y")-1, point->y);
58+
}
59+
60+
5661
/**
5762
* print Point data
5863
* @param execute_data
@@ -440,8 +445,7 @@ PHP_METHOD(opencv_rect, tl)
440445
opencv_point_object *point_obj = Z_PHP_POINT_OBJ_P(&point_zval);
441446
point_obj->point = new Point(rect_obj->rect->tl());
442447

443-
zend_update_property_long(opencv_point_ce, &point_zval, "x", sizeof("x")-1, point_obj->point->x);
444-
zend_update_property_long(opencv_point_ce, &point_zval, "y", sizeof("y")-1, point_obj->point->y);
448+
opencv_point_update_property_by_c_point(&point_zval,point_obj->point);
445449

446450
RETURN_ZVAL(&point_zval,0,0); //return php Point object
447451
}
@@ -460,8 +464,7 @@ PHP_METHOD(opencv_rect, br)
460464
opencv_point_object *point_obj = Z_PHP_POINT_OBJ_P(&point_zval);
461465
point_obj->point = new Point(rect_obj->rect->br());
462466

463-
zend_update_property_long(opencv_point_ce, &point_zval, "x", sizeof("x")-1, point_obj->point->x);
464-
zend_update_property_long(opencv_point_ce, &point_zval, "y", sizeof("y")-1, point_obj->point->y);
467+
opencv_point_update_property_by_c_point(&point_zval,point_obj->point);
465468

466469
RETURN_ZVAL(&point_zval,0,0); //return php Point object
467470
}
@@ -480,8 +483,7 @@ PHP_METHOD(opencv_rect, size)
480483
opencv_size_object *size_obj = Z_PHP_SIZE_OBJ_P(&size_zval);
481484
size_obj->size = new Size(rect_obj->rect->size());
482485

483-
zend_update_property_long(opencv_size_ce, &size_zval, "width", sizeof("width")-1, size_obj->size->width);
484-
zend_update_property_long(opencv_size_ce, &size_zval, "height", sizeof("height")-1, size_obj->size->height);
486+
opencv_size_update_property_by_c_size(&size_zval,size_obj->size);
485487

486488
RETURN_ZVAL(&size_zval,0,0); //return php Point object
487489
}

source/opencv2/core/opencv_type.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,7 @@ void opencv_size_update_property_by_c_size(zval *z, Size *size);
8080
void opencv_rect_update_property_by_c_rect(zval *z, Rect *rect);
8181

8282
void opencv_scalar_update_property_by_c_scalar(zval *z,Scalar *scalar);
83+
84+
void opencv_point_update_property_by_c_point(zval *z, Point *point);
85+
8386
#endif //OPENCV_OPENCV_TYPE_H

source/opencv2/opencv_imgproc.cc

Lines changed: 56 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -124,48 +124,74 @@ PHP_FUNCTION(opencv_circle){
124124
*/
125125
PHP_FUNCTION(opencv_fill_poly){
126126

127-
long thickness = 1, lineType = LINE_8, shift = 0;
128-
long *number_points;
129-
long ncoutours;
130-
zval *mat_zval, *scalar_zval, *offset_point_zval;
131-
zval *start_point_zval;
127+
//define parameters
128+
long ncontours, lineType = LINE_8, shift = 0;
129+
zval *img_zval, *color_zval, *offset_point_zval = NULL;
130+
zval *points_zval;
132131
opencv_point_object *offset_object;
133-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "OOllO|llO",
134-
&mat_zval, opencv_mat_ce,
135-
&start_point_zval, opencv_point_ce,
136-
&number_points,
137-
&ncoutours,
138-
&scalar_zval, opencv_scalar_ce,
139-
&thickness, &lineType,
140-
&offset_point_zval, opencv_point_ce) == FAILURE) {
132+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "OalO|llz",
133+
&img_zval, opencv_mat_ce,
134+
&points_zval, &ncontours,
135+
&color_zval, opencv_scalar_ce,
136+
&lineType, &shift,
137+
&offset_point_zval) == FAILURE) {
141138
RETURN_NULL();
142139
}
143140

144-
zval *offset_point_real_zval = Z_REFVAL_P(offset_point_zval);
145-
if(Z_TYPE_P(offset_point_real_zval) == IS_OBJECT && Z_OBJCE_P(offset_point_real_zval)==opencv_point_ce){
146-
// is Point object
147-
offset_object = Z_PHP_POINT_OBJ_P(offset_point_real_zval);
141+
unsigned long point_count = zend_hash_num_elements(Z_ARRVAL_P(points_zval));
142+
Point root_points[1][point_count];
143+
opencv_point_object *point_object;
144+
zend_ulong _h;
145+
zval *array_val_zval;
146+
ZEND_HASH_FOREACH_NUM_KEY_VAL(Z_ARRVAL_P(points_zval),_h,array_val_zval){
147+
again1:
148+
if(Z_TYPE_P(array_val_zval) == IS_OBJECT && Z_OBJCE_P(array_val_zval) == opencv_point_ce){
149+
point_object = Z_PHP_POINT_OBJ_P(array_val_zval);
150+
root_points[0][_h] = *point_object->point;
151+
}else if(Z_TYPE_P(array_val_zval) == IS_REFERENCE){
152+
array_val_zval = Z_REFVAL_P(array_val_zval);
153+
goto again1;
154+
} else {
155+
opencv_throw_exception("points array value just Point object.");
156+
RETURN_NULL();
157+
}
158+
}ZEND_HASH_FOREACH_END();
159+
160+
const Point* pts[1] = {root_points[0]};
161+
int npts[] = {(int)point_count};
162+
Point offset;
163+
zval *offset_point_real_zval;
164+
165+
if(offset_point_zval != NULL){
166+
offset_point_real_zval = Z_REFVAL_P(offset_point_zval);
167+
if(Z_TYPE_P(offset_point_real_zval) == IS_OBJECT && Z_OBJCE_P(offset_point_real_zval) == opencv_point_ce){
168+
// is Point object
169+
offset_object = Z_PHP_POINT_OBJ_P(offset_point_real_zval);
170+
} else{
171+
// isn't Point object
172+
zval_ptr_dtor(offset_point_real_zval);
173+
zval instance;
174+
object_init_ex(&instance,opencv_point_ce);
175+
ZVAL_COPY_VALUE(offset_point_real_zval, &instance);// Cover dst_real_zval by Point object
176+
offset_object = Z_PHP_POINT_OBJ_P(offset_point_real_zval);
177+
}
148178
} else{
149-
// isn't Point object
150-
zval instance;
151-
Point dst;
152-
object_init_ex(&instance,opencv_point_ce);
153-
ZVAL_COPY_VALUE(offset_point_real_zval, &instance);// Cover dst_real_zval by Point object
154-
offset_object = Z_PHP_POINT_OBJ_P(offset_point_real_zval);
155-
offset_object->point = new Point(dst);
179+
offset = Point();
156180
}
157181

158-
opencv_mat_object *mat_obj = Z_PHP_MAT_OBJ_P(mat_zval);
159-
opencv_point_object *start_point_obj = Z_PHP_POINT_OBJ_P(start_point_zval);
160-
opencv_scalar_object *scalar_obj = Z_PHP_SCALAR_OBJ_P(scalar_zval);
182+
opencv_mat_object *mat_obj = Z_PHP_MAT_OBJ_P(img_zval);
183+
opencv_scalar_object *scalar_obj = Z_PHP_SCALAR_OBJ_P(color_zval);
161184

162-
const Point *pts = (start_point_obj->point);
163-
const int *npts = (int*)(number_points);
164-
fillPoly(*(mat_obj->mat), &pts, npts, ncoutours, *(scalar_obj->scalar), thickness, lineType, *offset_object->point);
185+
fillPoly(*(mat_obj->mat), pts, npts, (int)ncontours, *(scalar_obj->scalar), (int)lineType, (int)shift, offset);
186+
if(offset_point_zval != NULL){
187+
offset_object->point = new Point(offset);
188+
opencv_point_update_property_by_c_point(offset_point_real_zval, offset_object->point);
189+
}
165190

166191
RETURN_NULL();
167192
}
168193

194+
169195
/**
170196
* CV\line
171197
* @param execute_data

source/opencv2/opencv_imgproc.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,17 @@ void opencv_line_type_init(int module_number);
2323
PHP_FUNCTION(opencv_cv_t_color);
2424
PHP_FUNCTION(opencv_ellipse);
2525
PHP_FUNCTION(opencv_circle);
26-
PHP_FUNCTION(opencv_fill_poly);//TODO fillPoly
26+
ZEND_BEGIN_ARG_INFO_EX(opencv_fill_poly_arginfo, 0, 0, 7)
27+
ZEND_ARG_INFO(0, img)
28+
ZEND_ARG_INFO(0, pts)//point array
29+
ZEND_ARG_INFO(0, ncontours)
30+
ZEND_ARG_INFO(0, color)
31+
ZEND_ARG_INFO(0, lineType)
32+
ZEND_ARG_INFO(0, shift)
33+
ZEND_ARG_INFO(1, offset)
34+
ZEND_END_ARG_INFO()
35+
PHP_FUNCTION(opencv_fill_poly);
36+
2737
PHP_FUNCTION(opencv_line);
2838
PHP_FUNCTION(opencv_rectangle);
2939
PHP_FUNCTION(opencv_rectangle_by_point);

0 commit comments

Comments
 (0)