Skip to content

Commit 335b68b

Browse files
committed
Merge branch 'dev'
2 parents caf9cad + b26e754 commit 335b68b

File tree

5 files changed

+214
-20
lines changed

5 files changed

+214
-20
lines changed

opencv.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@ const zend_function_entry opencv_functions[] = {
234234
ZEND_NS_NAMED_FE(OPENCV_NS, LUT, ZEND_FN(opencv_lut), opencv_lut_arginfo)
235235
ZEND_NS_NAMED_FE(OPENCV_NS, getTickCount, ZEND_FN(opencv_get_tick_count), NULL)
236236
ZEND_NS_NAMED_FE(OPENCV_NS, getTickFrequency, ZEND_FN(opencv_get_tick_frequency), NULL)
237+
ZEND_NS_NAMED_FE(OPENCV_NS, floodFill, ZEND_FN(opencv_flood_fill), opencv_flood_fill_arginfo)
238+
ZEND_NS_NAMED_FE(OPENCV_NS, setMouseCallback, ZEND_FN(opencv_set_mouse_callback), NULL)
237239
PHP_FE_END /* Must be the last line in opencv_functions[] */
238240
};
239241
/* }}} */

source/opencv2/opencv_highgui.cc

Lines changed: 93 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ opencv_fcall_info_cb * opencv_fcall_info_cb_create(zend_fcall_info *fci_ptr, zen
128128
opencv_fcall_info_cb *cb = new opencv_fcall_info_cb;
129129
cb->fci = new zend_fcall_info;
130130
cb->fci_cache = new zend_fcall_info_cache;
131-
132131
memcpy(cb->fci, fci_ptr, sizeof(zend_fcall_info));
133132
memcpy(cb->fci_cache, fci_cache_ptr, sizeof(zend_fcall_info_cache));
134133
Z_TRY_ADDREF(cb->fci->function_name);//todo 滑动调或窗口销毁是释放内存
@@ -140,17 +139,19 @@ opencv_fcall_info_cb * opencv_fcall_info_cb_create(zend_fcall_info *fci_ptr, zen
140139
}
141140

142141
void opencv_create_trackbar_callback(int pos, void* userdata){
143-
opencv_fcall_info_cb *fci_s=(opencv_fcall_info_cb*)userdata;
144-
145-
zval retval;
146-
zval args[1];
147-
ZVAL_LONG(&args[0], (long)pos);//将滑动条滑动的值传入到闭包参数中
148-
fci_s->fci->param_count = 1;
149-
fci_s->fci->params = args;
150-
fci_s->fci->retval = &retval;
151-
152-
zend_call_function(fci_s->fci, fci_s->fci_cache);
153-
zval_ptr_dtor(&args[0]);
142+
if(userdata != 0){
143+
opencv_fcall_info_cb *fci_s=(opencv_fcall_info_cb*)userdata;
144+
145+
zval retval;
146+
zval args[1];
147+
ZVAL_LONG(&args[0], (long)pos);//将滑动条滑动的值传入到闭包参数中
148+
fci_s->fci->param_count = 1;
149+
fci_s->fci->params = args;
150+
fci_s->fci->retval = &retval;
151+
152+
zend_call_function(fci_s->fci, fci_s->fci_cache);
153+
zval_ptr_dtor(&args[0]);
154+
}
154155
}
155156

156157

@@ -168,15 +169,18 @@ PHP_FUNCTION(opencv_create_trackbar){
168169

169170
zend_fcall_info fci;
170171
zend_fcall_info_cache fci_cache;
171-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssll|f",
172+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssll|f!",
172173
&trackbarname, &trackbarname_len,
173174
&winname,&winname_len,
174175
&value,&count,
175176
&fci, &fci_cache) == FAILURE) {
176177
return;
177178
}
179+
opencv_fcall_info_cb *cb = 0;
180+
if (fci.size > 0 && ZEND_NUM_ARGS() > 4) {//check callback param is valid
181+
cb = opencv_fcall_info_cb_create(&fci, &fci_cache);
182+
}
178183
int *trackbar_value_ptr = new int(value);
179-
opencv_fcall_info_cb *cb = opencv_fcall_info_cb_create(&fci, &fci_cache);
180184
createTrackbar(trackbarname, winname, trackbar_value_ptr, (int)count,opencv_create_trackbar_callback,cb);
181185
RETURN_NULL();
182186
}
@@ -209,6 +213,53 @@ PHP_FUNCTION(opencv_get_track_bar_pos){
209213
}
210214

211215

216+
void opencv_on_mouse_callback(int event, int x, int y, int flags, void* userdata){
217+
if(userdata != 0){
218+
opencv_fcall_info_cb *fci_s=(opencv_fcall_info_cb*)userdata;
219+
zval retval;
220+
zval args[4];
221+
ZVAL_LONG(&args[0], (long)event);
222+
ZVAL_LONG(&args[1], (long)x);
223+
ZVAL_LONG(&args[2], (long)y);
224+
ZVAL_LONG(&args[3], (long)flags);
225+
fci_s->fci->param_count = 4;
226+
fci_s->fci->params = args;
227+
fci_s->fci->retval = &retval;
228+
229+
zend_call_function(fci_s->fci, fci_s->fci_cache);
230+
zval_ptr_dtor(&args[0]);
231+
zval_ptr_dtor(&args[1]);
232+
zval_ptr_dtor(&args[2]);
233+
zval_ptr_dtor(&args[3]);
234+
}
235+
}
236+
237+
/**
238+
* CV\setMouseCallback
239+
* @param execute_data
240+
* @param return_value
241+
*/
242+
PHP_FUNCTION(opencv_set_mouse_callback){
243+
char *winname;
244+
long winname_len;
245+
246+
zend_fcall_info fci;
247+
zend_fcall_info_cache fci_cache;
248+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|f!",
249+
&winname,&winname_len,
250+
&fci, &fci_cache) == FAILURE) {
251+
return;
252+
}
253+
opencv_fcall_info_cb *cb = 0;
254+
if (fci.size > 0 && ZEND_NUM_ARGS() > 1) {//check callback param is valid
255+
cb = opencv_fcall_info_cb_create(&fci, &fci_cache);
256+
}
257+
setMouseCallback(winname, opencv_on_mouse_callback, cb);
258+
RETURN_NULL();
259+
}
260+
261+
262+
212263
void opencv_highgui_init(int module_number)
213264
{
214265
/**
@@ -221,4 +272,32 @@ void opencv_highgui_init(int module_number)
221272
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "WINDOW_FREERATIO", 5, CONST_CS | CONST_PERSISTENT);
222273
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "WINDOW_GUI_EXPANDED", 6, CONST_CS | CONST_PERSISTENT);
223274
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "WINDOW_GUI_NORMAL", 7, CONST_CS | CONST_PERSISTENT);
275+
opencv_highgui_mouse_event_types_init(module_number);
276+
opencv_highgui_mouse_event_flags_init(module_number);
277+
}
278+
279+
//! Mouse Events see cv::MouseCallback
280+
void opencv_highgui_mouse_event_types_init(int module_number){
281+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_MOUSEMOVE", EVENT_MOUSEMOVE, CONST_CS | CONST_PERSISTENT);
282+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_LBUTTONDOWN", EVENT_LBUTTONDOWN, CONST_CS | CONST_PERSISTENT);
283+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_RBUTTONDOWN", EVENT_RBUTTONDOWN, CONST_CS | CONST_PERSISTENT);
284+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_MBUTTONDOWN", EVENT_MBUTTONDOWN, CONST_CS | CONST_PERSISTENT);
285+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_LBUTTONUP", EVENT_LBUTTONUP, CONST_CS | CONST_PERSISTENT);
286+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_RBUTTONUP", EVENT_RBUTTONUP, CONST_CS | CONST_PERSISTENT);
287+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_MBUTTONUP", EVENT_MBUTTONUP, CONST_CS | CONST_PERSISTENT);
288+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_LBUTTONDBLCLK", EVENT_LBUTTONDBLCLK, CONST_CS | CONST_PERSISTENT);
289+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_RBUTTONDBLCLK", EVENT_RBUTTONDBLCLK, CONST_CS | CONST_PERSISTENT);
290+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_MBUTTONDBLCLK", EVENT_MBUTTONDBLCLK, CONST_CS | CONST_PERSISTENT);
291+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_MOUSEWHEEL", EVENT_MOUSEWHEEL, CONST_CS | CONST_PERSISTENT);
292+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_MOUSEHWHEEL", EVENT_MOUSEHWHEEL, CONST_CS | CONST_PERSISTENT);
293+
}
294+
295+
//! Mouse Event Flags see cv::MouseCallback
296+
void opencv_highgui_mouse_event_flags_init(int module_number){
297+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_FLAG_LBUTTON", EVENT_FLAG_LBUTTON, CONST_CS | CONST_PERSISTENT);
298+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_FLAG_RBUTTON", EVENT_FLAG_RBUTTON, CONST_CS | CONST_PERSISTENT);
299+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_FLAG_MBUTTON", EVENT_FLAG_MBUTTON, CONST_CS | CONST_PERSISTENT);
300+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_FLAG_CTRLKEY", EVENT_FLAG_CTRLKEY, CONST_CS | CONST_PERSISTENT);
301+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_FLAG_SHIFTKEY", EVENT_FLAG_SHIFTKEY, CONST_CS | CONST_PERSISTENT);
302+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "EVENT_FLAG_ALTKEY", EVENT_FLAG_ALTKEY, CONST_CS | CONST_PERSISTENT);
224303
}

source/opencv2/opencv_highgui.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#define PHP_OPENCV_HIGHGUI_H
2020

2121
extern void opencv_highgui_init(int module_number);
22+
extern void opencv_highgui_mouse_event_types_init(int module_number);
23+
extern void opencv_highgui_mouse_event_flags_init(int module_number);
2224

2325
PHP_FUNCTION(opencv_imshow);
2426
PHP_FUNCTION(opencv_wait_key);
@@ -34,5 +36,6 @@ ZEND_END_ARG_INFO()
3436
PHP_FUNCTION(opencv_create_trackbar);
3537
PHP_FUNCTION(opencv_destroy_window);
3638
PHP_FUNCTION(opencv_get_track_bar_pos);
39+
PHP_FUNCTION(opencv_set_mouse_callback);
3740

3841
#endif //OPENCV_OPENCV_HIGHGUI_H

source/opencv2/opencv_imgproc.cc

Lines changed: 99 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ void opencv_imgproc_init(int module_number)
2626
{
2727
opencv_color_conversion_code_init(module_number);
2828
opencv_line_type_init(module_number);
29-
opencv_morph_shapes(module_number);
29+
opencv_morph_shapes_init(module_number);
30+
opencv_morph_types_init(module_number);
31+
opencv_flood_fill_flags_init(module_number);
32+
opencv_threshold_types_init(module_number);
3033
}
3134

3235
/**
@@ -35,15 +38,15 @@ void opencv_imgproc_init(int module_number)
3538
* @param return_value
3639
*/
3740
PHP_FUNCTION(opencv_cv_t_color){
38-
long code;
41+
long code, dstCn = 0;
3942
Mat dstImg;
4043
zval *mat_zval;
41-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &mat_zval,opencv_mat_ce, &code) == FAILURE) {
44+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol|l", &mat_zval,opencv_mat_ce, &code, &dstCn) == FAILURE) {
4245
RETURN_NULL();
4346
}
4447
//get src mat object from mat_zval
4548
opencv_mat_object *src_obj = Z_PHP_MAT_OBJ_P(mat_zval);
46-
cvtColor(*(src_obj->mat), dstImg, (int)code);
49+
cvtColor(*(src_obj->mat), dstImg, (int)code, (int)dstCn);
4750

4851
//new PHP Mat bing cv::cvtColor dstImg.
4952
zval instance;
@@ -983,6 +986,67 @@ PHP_FUNCTION(opencv_morphology_ex){
983986
RETURN_NULL();
984987
}
985988

989+
990+
PHP_FUNCTION(opencv_flood_fill){
991+
zval *image_zval, *seed_point_zval, *new_val_zval, *mask_zval = NULL, *rect_zval = NULL, *lo_diff_zval = NULL, *up_diff_zval = NULL;
992+
long flags = 4;
993+
994+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "OOOO!|O!OOl",
995+
&image_zval, opencv_mat_ce,
996+
&seed_point_zval, opencv_point_ce,
997+
&new_val_zval, opencv_scalar_ce,
998+
&mask_zval, opencv_mat_ce,
999+
&rect_zval, opencv_rect_ce,
1000+
&lo_diff_zval, opencv_scalar_ce,
1001+
&up_diff_zval, opencv_scalar_ce,
1002+
&flags) == FAILURE) {
1003+
RETURN_NULL();
1004+
}
1005+
opencv_mat_object *image_object;
1006+
opencv_point_object *seed_point_object;
1007+
opencv_scalar_object *new_value_object;
1008+
1009+
image_object = Z_PHP_MAT_OBJ_P(image_zval);
1010+
seed_point_object = Z_PHP_POINT_OBJ_P(seed_point_zval);
1011+
new_value_object = Z_PHP_SCALAR_OBJ_P(new_val_zval);
1012+
1013+
Rect *rect = 0 ;
1014+
Scalar lo_diff = Scalar(), up_diff = Scalar();
1015+
opencv_rect_object *rect_object;
1016+
if(rect_zval != NULL){
1017+
rect_object = Z_PHP_RECT_OBJ_P(rect_zval);
1018+
rect = rect_object->rect;
1019+
}
1020+
if(lo_diff_zval != NULL){
1021+
opencv_scalar_object *lo_diff_object = Z_PHP_SCALAR_OBJ_P(lo_diff_zval);
1022+
lo_diff = *lo_diff_object->scalar;
1023+
}
1024+
1025+
if(up_diff_zval != NULL){
1026+
opencv_scalar_object *up_diff_object = Z_PHP_SCALAR_OBJ_P(up_diff_zval);
1027+
up_diff = *up_diff_object->scalar;
1028+
}
1029+
1030+
int result;
1031+
try {
1032+
if(mask_zval == NULL){
1033+
result = floodFill(*image_object->mat, *seed_point_object->point, *new_value_object->scalar, rect, lo_diff, up_diff, (int)flags);
1034+
}else{
1035+
opencv_mat_object *mask_object = Z_PHP_MAT_OBJ_P(mask_zval);
1036+
result= floodFill(*image_object->mat, *mask_object->mat, *seed_point_object->point, *new_value_object->scalar, rect, lo_diff, up_diff, (int)flags);
1037+
}
1038+
1039+
if(rect_zval != NULL){
1040+
opencv_rect_update_property_by_c_rect(rect_zval,rect_object->rect);
1041+
}
1042+
1043+
}catch (Exception e){
1044+
opencv_throw_exception(e.what());
1045+
RETURN_NULL();
1046+
}
1047+
RETURN_LONG(result);
1048+
}
1049+
9861050
/**
9871051
* color conversion code in CV\cvtColor,opencv enum ColorConversionCodes
9881052
* @param module_number
@@ -1249,8 +1313,38 @@ void opencv_line_type_init(int module_number){
12491313
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "LINE_AA", LINE_AA, CONST_CS | CONST_PERSISTENT);
12501314
}
12511315

1252-
void opencv_morph_shapes(int module_number){
1316+
void opencv_morph_shapes_init(int module_number){
12531317
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "MORPH_RECT", MORPH_RECT, CONST_CS | CONST_PERSISTENT);
12541318
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "MORPH_CROSS", MORPH_CROSS, CONST_CS | CONST_PERSISTENT);
12551319
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "MORPH_ELLIPSE", MORPH_ELLIPSE, CONST_CS | CONST_PERSISTENT);
1320+
}
1321+
1322+
void opencv_morph_types_init(int module_number){
1323+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "MORPH_ERODE", MORPH_ERODE, CONST_CS | CONST_PERSISTENT);
1324+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "MORPH_DILATE", MORPH_DILATE, CONST_CS | CONST_PERSISTENT);
1325+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "MORPH_OPEN", MORPH_OPEN, CONST_CS | CONST_PERSISTENT);
1326+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "MORPH_CLOSE", MORPH_CLOSE, CONST_CS | CONST_PERSISTENT);
1327+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "MORPH_GRADIENT", MORPH_GRADIENT, CONST_CS | CONST_PERSISTENT);
1328+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "MORPH_TOPHAT", MORPH_TOPHAT, CONST_CS | CONST_PERSISTENT);
1329+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "MORPH_BLACKHAT", MORPH_BLACKHAT, CONST_CS | CONST_PERSISTENT);
1330+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "MORPH_HITMISS", MORPH_HITMISS, CONST_CS | CONST_PERSISTENT);
1331+
}
1332+
1333+
//! floodfill algorithm flags
1334+
void opencv_flood_fill_flags_init(int module_number){
1335+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "FLOODFILL_FIXED_RANGE", FLOODFILL_FIXED_RANGE, CONST_CS | CONST_PERSISTENT);
1336+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "FLOODFILL_MASK_ONLY", FLOODFILL_MASK_ONLY, CONST_CS | CONST_PERSISTENT);
1337+
}
1338+
1339+
//! type of the threshold operation
1340+
//! ![threshold types](pics/threshold.png)
1341+
void opencv_threshold_types_init(int module_number){
1342+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "THRESH_BINARY", THRESH_BINARY, CONST_CS | CONST_PERSISTENT);
1343+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "THRESH_BINARY_INV", THRESH_BINARY_INV, CONST_CS | CONST_PERSISTENT);
1344+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "THRESH_TRUNC", THRESH_TRUNC, CONST_CS | CONST_PERSISTENT);
1345+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "THRESH_TOZERO", THRESH_TOZERO, CONST_CS | CONST_PERSISTENT);
1346+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "THRESH_TOZERO_INV", THRESH_TOZERO_INV, CONST_CS | CONST_PERSISTENT);
1347+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "THRESH_MASK", THRESH_MASK, CONST_CS | CONST_PERSISTENT);
1348+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "THRESH_OTSU", THRESH_OTSU, CONST_CS | CONST_PERSISTENT);
1349+
REGISTER_NS_LONG_CONSTANT(OPENCV_NS, "THRESH_TRIANGLE", THRESH_TRIANGLE, CONST_CS | CONST_PERSISTENT);
12561350
}

source/opencv2/opencv_imgproc.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@
2020
void opencv_imgproc_init(int module_number);
2121
void opencv_color_conversion_code_init(int module_number);
2222
void opencv_line_type_init(int module_number);
23-
void opencv_morph_shapes(int module_number);
23+
void opencv_morph_shapes_init(int module_number);
24+
void opencv_morph_types_init(int module_number);
25+
void opencv_flood_fill_flags_init(int module_number);
26+
void opencv_threshold_types_init(int module_number);
27+
2428
PHP_FUNCTION(opencv_cv_t_color);
2529
PHP_FUNCTION(opencv_ellipse);
2630
PHP_FUNCTION(opencv_circle);
@@ -195,4 +199,16 @@ ZEND_BEGIN_ARG_INFO_EX(opencv_morphology_ex_arginfo, 0, 0, 8)
195199
ZEND_END_ARG_INFO()
196200
PHP_FUNCTION(opencv_morphology_ex);
197201

202+
ZEND_BEGIN_ARG_INFO_EX(opencv_flood_fill_arginfo, 0, 0, 8)
203+
ZEND_ARG_INFO(0, image)
204+
ZEND_ARG_INFO(0, seedPoint)
205+
ZEND_ARG_INFO(0, newVal)
206+
ZEND_ARG_INFO(0, mask)
207+
ZEND_ARG_INFO(0, rect)
208+
ZEND_ARG_INFO(0, loDiff)
209+
ZEND_ARG_INFO(0, upDiff)
210+
ZEND_ARG_INFO(0, flags)
211+
ZEND_END_ARG_INFO()
212+
PHP_FUNCTION(opencv_flood_fill);
213+
198214
#endif //OPENCV_OPENCV_IMGPROC_H

0 commit comments

Comments
 (0)