Add proper command line argument parsing with argp
This commit is contained in:
parent
625e9680d3
commit
82edd492c0
|
@ -30,5 +30,12 @@ if (APPLE)
|
||||||
DESTINATION
|
DESTINATION
|
||||||
$ {PROJECT_BINARY_DIR} )
|
$ {PROJECT_BINARY_DIR} )
|
||||||
endif (APPLE)
|
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 )
|
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 <graphics.hpp>
|
||||||
#include <paths.hpp>
|
#include <paths.hpp>
|
||||||
|
#include <args.hpp>
|
||||||
|
|
||||||
cv::Ptr<cv::face::Facemark> facemark;
|
cv::Ptr<cv::face::Facemark> facemark;
|
||||||
cv::CascadeClassifier haarFaceDetector;
|
cv::CascadeClassifier haarFaceDetector;
|
||||||
cv::dnn::Net dnnFaceDetector;
|
cv::dnn::Net dnnFaceDetector;
|
||||||
cv::VideoCapture vid;
|
cv::VideoCapture vid;
|
||||||
cv::Mat frame, gray, small;
|
cv::Mat frame, gray, small;
|
||||||
bool useHaar;
|
|
||||||
|
|
||||||
void initCV(bool haar) {
|
|
||||||
useHaar = haar;
|
|
||||||
|
|
||||||
|
void initCV() {
|
||||||
haarFaceDetector = cv::CascadeClassifier (resolvePath("cvdata/haarcascade_frontalface_alt2.xml"));
|
haarFaceDetector = cv::CascadeClassifier (resolvePath("cvdata/haarcascade_frontalface_alt2.xml"));
|
||||||
dnnFaceDetector = cv::dnn::readNetFromCaffe(
|
dnnFaceDetector = cv::dnn::readNetFromCaffe(
|
||||||
resolvePath("cvdata/deploy.prototxt"),
|
resolvePath("cvdata/deploy.prototxt"),
|
||||||
|
@ -59,7 +57,7 @@ void cvFrame() {
|
||||||
|
|
||||||
std::vector<cv::Rect> faces;
|
std::vector<cv::Rect> faces;
|
||||||
|
|
||||||
if (useHaar) {
|
if (optData.useHaar) {
|
||||||
//downsample image for face detection, works too slow on full res
|
//downsample image for face detection, works too slow on full res
|
||||||
cv::pyrDown (gray, small);
|
cv::pyrDown (gray, small);
|
||||||
cv::pyrDown (small, small);
|
cv::pyrDown (small, small);
|
||||||
|
@ -74,7 +72,7 @@ void cvFrame() {
|
||||||
int biggestArea = 0;
|
int biggestArea = 0;
|
||||||
for (int i = 0; i < faces.size(); i++) {
|
for (int i = 0; i < faces.size(); i++) {
|
||||||
//convert face region to full res, because we perform facemark on full res
|
//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);
|
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
|
#ifndef CV_HPP
|
||||||
#define CV_HPP
|
#define CV_HPP
|
||||||
|
|
||||||
void initCV(bool haar);
|
void initCV();
|
||||||
|
|
||||||
void cvFrame();
|
void cvFrame();
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
#include <graphics.hpp>
|
#include <graphics.hpp>
|
||||||
#include <cv.hpp>
|
#include <cv.hpp>
|
||||||
#include <paths.hpp>
|
#include <paths.hpp>
|
||||||
|
#include <args.hpp>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
int main (int argc, char** argv) {
|
int main (int argc, char** argv) {
|
||||||
|
argp_parse(&argp, argc, argv, 0, 0, 0);
|
||||||
|
|
||||||
std::cout << "Facecam2D is starting..." << std::endl;
|
std::cout << "Facecam2D is starting..." << std::endl;
|
||||||
|
|
||||||
initPrefixes();
|
initPrefixes();
|
||||||
|
@ -13,8 +16,7 @@ int main (int argc, char** argv) {
|
||||||
std::cout << "Default asset prefix: " << prefixDefault << std::endl;
|
std::cout << "Default asset prefix: " << prefixDefault << std::endl;
|
||||||
|
|
||||||
initGraphics();
|
initGraphics();
|
||||||
//TODO: real argument parsing
|
initCV();
|
||||||
initCV(argc > 1 && strcmp(argv[1], "--haar-cascade") == 0);
|
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
cvFrame();
|
cvFrame();
|
||||||
|
|
Loading…
Reference in a new issue