diff --git a/.gitignore b/.gitignore index 54983d3..2f6ab2a 100644 --- a/.gitignore +++ b/.gitignore @@ -28,12 +28,11 @@ missing mkinstalldirs modules run-tests.php -tests/*/*.diff -tests/*/*.out -tests/*/*.php -tests/*/*.exp -tests/*/*.log -tests/*/*.sh - +tests/*.diff +tests/*.out +tests/*.php +tests/*.exp +tests/*.log +tests/*.sh .idea cmake-build-debug diff --git a/README.md b/README.md index 81ca51b..f2a800e 100644 --- a/README.md +++ b/README.md @@ -100,9 +100,8 @@ If you want to use HOG based approach: #include #include #include @@ -14,19 +15,41 @@ PHP_FUNCTION(dlib_face_detection) { char *img_path; size_t img_path_len; + long upsample_num = 0; - if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &img_path, &img_path_len) == FAILURE){ + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", &img_path, &img_path_len, &upsample_num) == FAILURE) { + zend_throw_exception_ex(zend_ce_exception, 0 TSRMLS_CC, "Unable to parse dlib_face_detection arguments"); RETURN_FALSE; } try { frontal_face_detector detector = get_frontal_face_detector(); + pyramid_down<2> pyr; array2d img; load_image(img, img_path); - pyramid_up(img); + unsigned int levels = upsample_num; + while (levels > 0) { + levels--; + pyramid_up(img, pyr); + } + + array_init(return_value); + std::vector dets = detector(img); - RETURN_LONG(dets.size()); + for (unsigned long i = 0; i < dets.size(); ++i) { + rectangle rect = pyr.rect_down(dets[i], upsample_num); + + zval rect_arr; + array_init(&rect_arr); + add_assoc_long(&rect_arr, "left", rect.left()); + add_assoc_long(&rect_arr, "top", rect.top()); + add_assoc_long(&rect_arr, "right", rect.right()); + add_assoc_long(&rect_arr, "bottom", rect.bottom()); + // Add this assoc array to returned array + // + add_next_index_zval(return_value, &rect_arr); + } } catch (exception& e) { diff --git a/src/face_detection.h b/src/face_detection.h index aaeb2fd..a95667e 100644 --- a/src/face_detection.h +++ b/src/face_detection.h @@ -7,6 +7,7 @@ ZEND_BEGIN_ARG_INFO_EX(dlib_face_detection_arginfo, 0, 0, 1) ZEND_ARG_INFO(0, img_path) + ZEND_ARG_INFO(0, upsample_num) ZEND_END_ARG_INFO() PHP_FUNCTION(dlib_face_detection); diff --git a/tests/dlib_face_detection.phpt b/tests/dlib_face_detection.phpt new file mode 100644 index 0000000..75fb99f --- /dev/null +++ b/tests/dlib_face_detection.phpt @@ -0,0 +1,28 @@ +--TEST-- +Frontal face detection. +--SKIPIF-- + +--FILE-- + $detected_face) { + printf("Face[%d] in bounding box (left=%d, top=%d, right=%d, bottom=%d)\n", $index, + $detected_face["left"], $detected_face["top"], $detected_face["right"], $detected_face["bottom"]); +} +printf("Detection with upsampling\n"); +$detected_faces = dlib_face_detection(__DIR__ . "/lenna.jpg", 1); +printf("Faces found = %d\n", count($detected_faces)); +foreach($detected_faces as $index => $detected_face) { + printf("Face[%d] in bounding box (left=%d, top=%d, right=%d, bottom=%d)\n", $index, + $detected_face["left"], $detected_face["top"], $detected_face["right"], $detected_face["bottom"]); +} +?> +--EXPECT-- +Simple detection +Faces found = 1 +Face[0] in bounding box (left=214, top=194, right=393, bottom=373) +Detection with upsampling +Faces found = 1 +Face[0] in bounding box (left=201, top=180, right=386, bottom=366) \ No newline at end of file