Add option to enable/disable camera feed window

By default, camera feed will not be shown to the user.
This commit is contained in:
Epicalert 2021-07-03 17:53:57 +08:00
parent 160e9a02f2
commit bb82a0ddd5
No known key found for this signature in database
GPG key ID: CAA46F858D0979BD
5 changed files with 20 additions and 4 deletions

View file

@ -12,6 +12,7 @@ const char* argp_program_version =
const struct argp_option options[] = { const struct argp_option options[] = {
//name, key, arg, flags, doc, group //name, key, arg, flags, doc, group
{"haar-cascade", 0x00, 0, 0, "Use Haar Cascades for faster (but less accurate) face detection.", 0}, {"haar-cascade", 0x00, 0, 0, "Use Haar Cascades for faster (but less accurate) face detection.", 0},
{"show-camera", 0x01, 0, 0, "Show the camera feed in another window", 0},
{"model", 'm', "model", 0, "Name of the model file to use. (not including '.fma')", 0}, {"model", 'm', "model", 0, "Name of the model file to use. (not including '.fma')", 0},
{0} {0}
}; };
@ -25,6 +26,7 @@ struct argp argp = {
#endif #endif
struct optData optData = { struct optData optData = {
false,
false, false,
"test", "test",
}; };
@ -36,6 +38,10 @@ error_t parseOptions(int key, char* arg, struct argp_state* state) {
optData.useHaar = true; optData.useHaar = true;
break; break;
case 0x01: //--show-camera
optData.showCamera = true;
break;
case 'm': case 'm':
optData.model = std::string(arg); optData.model = std::string(arg);
break; break;

View file

@ -10,8 +10,9 @@ error_t parseOptions(int key, char* arg, struct argp_state* state);
#endif #endif
struct optData { struct optData {
bool useHaar; //use haar cascades (0x00) bool useHaar; // use haar cascades (0x00)
std::string model; //model to open (0x6d "m") bool showCamera; // show camera feed (0x01)
std::string model; // model to open (0x6d 'm')
}; };
extern const char* argp_program_version; extern const char* argp_program_version;

View file

@ -16,6 +16,10 @@ bool configFileOpen(struct optData* data) {
if (useHaarResult.first) { if (useHaarResult.first) {
data->useHaar = useHaarResult.second; data->useHaar = useHaarResult.second;
} }
auto showCameraResult = configFile.table->getBool("show_camera");
if (showCameraResult.first) {
data->showCamera = showCameraResult.second;
}
auto modelNameResult = configFile.table->getString("model"); auto modelNameResult = configFile.table->getString("model");
if (modelNameResult.first) { if (modelNameResult.first) {
data->model = modelNameResult.second; data->model = modelNameResult.second;

View file

@ -209,7 +209,7 @@ void cvFrame() {
} }
void cvShowFrame() { void cvShowFrame() {
if(frame.empty()) return; if(frame.empty() || !optData.showCamera) return;
cv::imshow("Video Input", frame); cv::imshow("Video Input", frame);
cv::waitKey(1); cv::waitKey(1);

View file

@ -22,6 +22,7 @@ class ConfigurationFrame : public wxFrame {
private: private:
std::vector<std::string> modelVec; std::vector<std::string> modelVec;
wxCheckBox* useHaarCheckBox; wxCheckBox* useHaarCheckBox;
wxCheckBox* showCameraCheckBox;
wxChoice* modelNameChoice; wxChoice* modelNameChoice;
void loadExistingConfig(); // loads existing config file and populates controls void loadExistingConfig(); // loads existing config file and populates controls
void OnApply(wxCommandEvent& event); void OnApply(wxCommandEvent& event);
@ -52,6 +53,7 @@ ConfigurationFrame::ConfigurationFrame() : wxFrame(NULL, wxID_ANY, "Configure "
// define all controls and labels // define all controls and labels
useHaarCheckBox = new wxCheckBox(panel, wxID_ANY, "Disable DNN face detection"); useHaarCheckBox = new wxCheckBox(panel, wxID_ANY, "Disable DNN face detection");
showCameraCheckBox = new wxCheckBox(panel, wxID_ANY, "Show camera feed");
wxStaticText* modelNameText = new wxStaticText(panel, wxID_ANY, "Model name:"); wxStaticText* modelNameText = new wxStaticText(panel, wxID_ANY, "Model name:");
modelNameChoice = new wxChoice(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, modelVec.size(), modelArray); modelNameChoice = new wxChoice(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, modelVec.size(), modelArray);
@ -61,6 +63,7 @@ ConfigurationFrame::ConfigurationFrame() : wxFrame(NULL, wxID_ANY, "Configure "
wxStaticBoxSizer* generalBoxSizer = new wxStaticBoxSizer(new wxStaticBox(panel, wxID_ANY, "General"), wxVERTICAL); wxStaticBoxSizer* generalBoxSizer = new wxStaticBoxSizer(new wxStaticBox(panel, wxID_ANY, "General"), wxVERTICAL);
generalBoxSizer->Add(modelSizer, 0, wxALL, 5); generalBoxSizer->Add(modelSizer, 0, wxALL, 5);
generalBoxSizer->Add(showCameraCheckBox, 0, wxALL, 5);
wxStaticBoxSizer* performanceBoxSizer = new wxStaticBoxSizer(new wxStaticBox(panel, wxID_ANY, "Performance"), wxVERTICAL); wxStaticBoxSizer* performanceBoxSizer = new wxStaticBoxSizer(new wxStaticBox(panel, wxID_ANY, "Performance"), wxVERTICAL);
performanceBoxSizer->Add(useHaarCheckBox, 0, wxALL, 5); performanceBoxSizer->Add(useHaarCheckBox, 0, wxALL, 5);
@ -92,6 +95,7 @@ void ConfigurationFrame::loadExistingConfig() {
configFileOpen(&configData); configFileOpen(&configData);
useHaarCheckBox->SetValue(configData.useHaar); useHaarCheckBox->SetValue(configData.useHaar);
showCameraCheckBox->SetValue(configData.showCamera);
for (int i = 0; i < modelVec.size(); i++) { for (int i = 0; i < modelVec.size(); i++) {
if (modelVec[i] == configData.model) { if (modelVec[i] == configData.model) {
modelNameChoice->SetSelection(i); modelNameChoice->SetSelection(i);
@ -105,6 +109,7 @@ void ConfigurationFrame::OnApply(wxCommandEvent& event) {
std::ofstream configFile; std::ofstream configFile;
configFile.open(prefixConfig + "config.toml"); configFile.open(prefixConfig + "config.toml");
configFile << "use_haar = " << (useHaarCheckBox->GetValue() ? "true" : "false") << std::endl; configFile << "use_haar = " << (useHaarCheckBox->GetValue() ? "true" : "false") << std::endl;
configFile << "show_camera = " << (showCameraCheckBox->GetValue() ? "true" : "false") << std::endl;
// janky edge case lmao // janky edge case lmao
// if user did not select any model, don't write the line in the config file! // if user did not select any model, don't write the line in the config file!
if (modelNameChoice->GetSelection() != wxNOT_FOUND) { if (modelNameChoice->GetSelection() != wxNOT_FOUND) {