Add proper command line argument parsing with argp
This commit is contained in:
parent
625e9680d3
commit
82edd492c0
|
@ -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 )
|
||||
|
|
37
src/args.cpp
Normal file
37
src/args.cpp
Normal file
|
@ -0,0 +1,37 @@
|
|||
#include <args.hpp>
|
||||
|
||||
const char* argp_program_version =
|
||||
"Facecam2D 0.1.0\n"
|
||||
"License: GPLv3 <https://www.gnu.org/licenses/gpl-3.0.html>\n"
|
||||
"If you did not receive a copy of the source code, it is\n"
|
||||
"available at <https://gitlab.com/epicalert/facecam2d.git>.";
|
||||
|
||||
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;
|
||||
}
|
17
src/args.hpp
Normal file
17
src/args.hpp
Normal file
|
@ -0,0 +1,17 @@
|
|||
#ifndef ARGS_HPP
|
||||
#define ARGS_HPP
|
||||
|
||||
#include <argp.h>
|
||||
|
||||
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
|
10
src/cv.cpp
10
src/cv.cpp
|
@ -5,17 +5,15 @@
|
|||
|
||||
#include <graphics.hpp>
|
||||
#include <paths.hpp>
|
||||
#include <args.hpp>
|
||||
|
||||
cv::Ptr<cv::face::Facemark> 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<cv::Rect> 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);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef CV_HPP
|
||||
#define CV_HPP
|
||||
|
||||
void initCV(bool haar);
|
||||
void initCV();
|
||||
|
||||
void cvFrame();
|
||||
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
#include <graphics.hpp>
|
||||
#include <cv.hpp>
|
||||
#include <paths.hpp>
|
||||
#include <args.hpp>
|
||||
|
||||
#include <iostream>
|
||||
#include <cstring>
|
||||
|
||||
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();
|
||||
|
|
Loading…
Reference in a new issue