#include #include #include #include using namespace std; using namespace cv; int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "test_sample_face_track [alignment point size(21 or 106)] [detect face cont limit]\n"); fprintf(stderr, "for example: \"test_sample_face_track 21 1\"\n"); return -1; } VideoCapture capture; capture.open(0); // open the camera if (!capture.isOpened()) { fprintf(stderr, "can not open camera!\n"); return -1; } namedWindow("TrackingTest"); int frame_width = capture.get(CV_CAP_PROP_FRAME_WIDTH); int frame_height = capture.get(CV_CAP_PROP_FRAME_HEIGHT); int point_size = atoi(argv[1]); int config; if (point_size == 21) { config = CV_DETECT_ENABLE_ALIGN_21; } else if (point_size == 106) { config = CV_DETECT_ENABLE_ALIGN_106; } else { fprintf(stderr, "alignment point size must be 21 or 106\n"); return -1; } cv_handle_t handle_track = NULL; cv_result_t cv_result = CV_OK; do { // init handle cv_result = cv_face_create_tracker(&handle_track, NULL, config | CV_FACE_TRACKING_TWO_THREAD); if (cv_result != CV_OK) { fprintf(stderr, "cv_face_create_tracker failed, error code %d\n", cv_result); break; } if (argc == 3) { int detect_face_cnt_limit = atoi(argv[2]); if (detect_face_cnt_limit < -1) { detect_face_cnt_limit = -1; } int val = 0; cv_result = cv_face_track_set_detect_face_cnt_limit(handle_track, detect_face_cnt_limit, &val); if (cv_result != CV_OK) { fprintf(stderr, "cv_face_track_set_detect_face_cnt_limit failed, error : %d\n", cv_result); break; } else { fprintf(stderr, "detect face count limit : %d\n", val); } } Mat bgr_frame; cv_face_t *p_face = NULL; int face_count = 0; while (capture.read(bgr_frame)) { // CV_PIX_FMT_BGR888 resize(bgr_frame, bgr_frame, Size(frame_width, frame_height), 0, 0, INTER_LINEAR); // realtime track face_count = 0; cv_result = cv_face_track(handle_track, bgr_frame.data, CV_PIX_FMT_BGR888, bgr_frame.cols, bgr_frame.rows, bgr_frame.step, CV_FACE_UP, &p_face, &face_count); if (cv_result != CV_OK) { fprintf(stderr, "cv_face_track failed, error : %d\n", cv_result); cv_face_release_tracker_result(p_face, face_count); break; } for (int i = 0; i < face_count; i++) { fprintf(stderr, "face: %d-----[%d, %d, %d, %d]-----id: %d\n", i, p_face[i].rect.left, p_face[i].rect.top, p_face[i].rect.right, p_face[i].rect.bottom, p_face[i].ID); fprintf(stderr, "face pose: [yaw: %.2f, pitch: %.2f, roll: %.2f, eye distance: %.2f]\n", p_face[i].yaw, p_face[i].pitch, p_face[i].roll, p_face[i].eye_dist); // draw the video Scalar scalar_color = CV_RGB(p_face[i].ID * 53 % 256, p_face[i].ID * 93 % 256, p_face[i].ID * 143 % 256); rectangle(bgr_frame, Point2f(static_cast(p_face[i].rect.left), static_cast(p_face[i].rect.top)), Point2f(static_cast(p_face[i].rect.right), static_cast(p_face[i].rect.bottom)), scalar_color, 2); for (int j = 0; j < p_face[i].points_count; j++) { circle(bgr_frame, Point2f(p_face[i].points_array[j].x, p_face[i].points_array[j].y), 1, Scalar(0, 255, 0)); } } // release the memory of face cv_face_release_tracker_result(p_face, face_count); imshow("TrackingTest", bgr_frame); if (waitKey(1) != -1) break; } } while (0); // destroy track handle cv_face_destroy_tracker(handle_track); return 0; }