From 82edd492c01e7422e15649196b5e0d1a30d1ec22 Mon Sep 17 00:00:00 2001 From: Epicalert Date: Tue, 26 Jan 2021 23:36:22 +0800 Subject: [PATCH] Add proper command line argument parsing with argp --- CMakeLists.txt | 9 ++++++++- src/args.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/args.hpp | 17 +++++++++++++++++ src/cv.cpp | 10 ++++------ src/cv.hpp | 2 +- src/main.cpp | 6 ++++-- 6 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 src/args.cpp create mode 100644 src/args.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 9dc2f35..2babe84 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,5 +30,12 @@ if (APPLE) DESTINATION $ {PROJECT_BINARY_DIR} ) endif (APPLE) -add_executable( fc2d src/main.cpp src/graphics.cpp src/modelpart.cpp src/cv.cpp src/paths.cpp ) +add_executable( fc2d + src/main.cpp + src/graphics.cpp + src/modelpart.cpp + src/cv.cpp + src/paths.cpp + src/args.cpp +) target_link_libraries( fc2d ${OpenCV_LIBS} ${OPENGL_LIBRARIES} FreeGLUT::freeglut GLEW::glew ) diff --git a/src/args.cpp b/src/args.cpp new file mode 100644 index 0000000..2773f80 --- /dev/null +++ b/src/args.cpp @@ -0,0 +1,37 @@ +#include + +const char* argp_program_version = + "Facecam2D 0.1.0\n" + "License: GPLv3 \n" + "If you did not receive a copy of the source code, it is\n" + "available at ."; + +const struct argp_option options[] = { + //name, key, arg, flags, doc, group + {"haar-cascade", 0x00, 0, 0, "Use Haar Cascades for faster (but less accurate) face detection.", 0}, + {0} +}; + +struct argp argp = { + options, + parseOptions, + 0, + 0 +}; + +struct optData optData = { + false +}; + +error_t parseOptions(int key, char* arg, struct argp_state* state) { + switch (key) { + case 0x00: //--haar-cascade + optData.useHaar = true; + break; + + default: + return ARGP_ERR_UNKNOWN; + } + + return 0; +} diff --git a/src/args.hpp b/src/args.hpp new file mode 100644 index 0000000..5166102 --- /dev/null +++ b/src/args.hpp @@ -0,0 +1,17 @@ +#ifndef ARGS_HPP +#define ARGS_HPP + +#include + +error_t parseOptions(int key, char* arg, struct argp_state* state); + +struct optData { + bool useHaar; //use haar cascades (0x00) +}; + +extern const char* argp_program_version; +extern const struct argp_option options[]; +extern struct argp argp; +extern struct optData optData; + +#endif diff --git a/src/cv.cpp b/src/cv.cpp index 2d3ecb6..9722f72 100644 --- a/src/cv.cpp +++ b/src/cv.cpp @@ -5,17 +5,15 @@ #include #include +#include cv::Ptr facemark; cv::CascadeClassifier haarFaceDetector; cv::dnn::Net dnnFaceDetector; cv::VideoCapture vid; cv::Mat frame, gray, small; -bool useHaar; - -void initCV(bool haar) { - useHaar = haar; +void initCV() { haarFaceDetector = cv::CascadeClassifier (resolvePath("cvdata/haarcascade_frontalface_alt2.xml")); dnnFaceDetector = cv::dnn::readNetFromCaffe( resolvePath("cvdata/deploy.prototxt"), @@ -59,7 +57,7 @@ void cvFrame() { std::vector faces; - if (useHaar) { + if (optData.useHaar) { //downsample image for face detection, works too slow on full res cv::pyrDown (gray, small); cv::pyrDown (small, small); @@ -74,7 +72,7 @@ void cvFrame() { int biggestArea = 0; for (int i = 0; i < faces.size(); i++) { //convert face region to full res, because we perform facemark on full res - if (useHaar) { + if (optData.useHaar) { faces[i] = cv::Rect (faces[i].x * 4, faces[i].y * 4, faces[i].width * 4, faces[i].height * 4); } diff --git a/src/cv.hpp b/src/cv.hpp index bd0e1b7..adf1146 100644 --- a/src/cv.hpp +++ b/src/cv.hpp @@ -1,7 +1,7 @@ #ifndef CV_HPP #define CV_HPP -void initCV(bool haar); +void initCV(); void cvFrame(); diff --git a/src/main.cpp b/src/main.cpp index 90e7de2..e3c7376 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,11 +1,14 @@ #include #include #include +#include #include #include int main (int argc, char** argv) { + argp_parse(&argp, argc, argv, 0, 0, 0); + std::cout << "Facecam2D is starting..." << std::endl; initPrefixes(); @@ -13,8 +16,7 @@ int main (int argc, char** argv) { std::cout << "Default asset prefix: " << prefixDefault << std::endl; initGraphics(); - //TODO: real argument parsing - initCV(argc > 1 && strcmp(argv[1], "--haar-cascade") == 0); + initCV(); while (true) { cvFrame();