Skip to content
Snippets Groups Projects
ofApp.cpp 12.2 KiB
Newer Older
Louis James's avatar
Louis James committed
#include "ofApp.h"

using namespace ofxCv;
using namespace cv;

// Destructor
ofApp::~ofApp(){
Louis James's avatar
Louis James committed
    cam.close();
Louis James's avatar
Louis James committed
//--------------------------------------------------------------
void ofApp::setup() {
Louis James's avatar
Louis James committed
    // Welcome message
    cout << "------------------------------------------------------------------------------" << endl;
Louis James's avatar
Louis James committed
    cout << "--------------------------- Welcome ------------------------------------------" << endl;
    cout << "------------------------------------------------------------------------------" << endl;

Louis James's avatar
Louis James committed
    // camera and window setup
Louis James's avatar
Louis James committed
    int camId = 0; // 1 = primary, 2 secondary
Louis James's avatar
Louis James committed
    int wwidth = 1920;
    int wheight = 1080;
Louis James's avatar
Louis James committed
    zoom=false;
Louis James's avatar
Louis James committed
    ofSetWindowShape(wwidth, wheight);
Louis James's avatar
Louis James committed
    cam.setDeviceID(camId);
    // Alternative camera settings for different cams
Louis James's avatar
Louis James committed
    if(camId==2){
        cam.setup(1920, 1080);
        ss->rectPos.x = 20, ss->rectPos.y = 20, ss->width_height.x = 1800, ss->width_height.y = 900;
Louis James's avatar
Louis James committed
    } else if(camId==0){
Louis James's avatar
Louis James committed
        // cam.setup(640, 480);
        cam.setup(1920, 1080);
        ss->rectPos.x = 20, ss->rectPos.y = 20, ss->width_height.x = 300, ss->width_height.y = 200;
Louis James's avatar
Louis James committed
    }
Louis James's avatar
Louis James committed

    // Initialise gui and parameters
Louis James's avatar
Louis James committed
    gui.setup();
Louis James's avatar
Louis James committed
    gui.setPosition(50,50);
    ss->settings.loadFile("settings.xml");
    ss->settings.pushTag("contourFinders");
Louis James's avatar
Louis James committed

Louis James's avatar
Louis James committed
    // For each tracked colour:
    /* - Initialise tracking objects and parameters
       - Grab settings from disk */
Louis James's avatar
Louis James committed
    for(int i = 0; i < num_colours; i++){
Louis James's avatar
Louis James committed
        // create gui subgroup for each colour
Louis James's avatar
Louis James committed
        ofParameterGroup colour_params;
        string group_name = "Colour " + to_string(i) + " params:";
        colour_params.setName(group_name);
Louis James's avatar
Louis James committed
        ofParameter<float> t;
        ofParameter<bool> b;
        ofParameter<bool> cc;
        ofParameter<int> minArea_;
        ofParameter<int> maxArea_;
Louis James's avatar
Louis James committed
        ofxCv::ContourFinder cf;
        thresholds.push_back(t);
        trackHues.push_back(b);
        changeColours.push_back(cc);
Louis James's avatar
Louis James committed
        minareas.push_back(minArea_);
        maxareas.push_back(maxArea_);
        ofParameter<int> minarearad;
        ofParameter<int> maxarearad;
        minAreaRadi.push_back(minarearad);
        maxAreaRadi.push_back(maxarearad);
        // Load values from settings.xml and set values
        ss->settings.pushTag("contourFinder", i);
        ss->contourFinders.push_back(cf);
        ss->settings.pushTag("threshold");
        int r = ss->settings.getValue("r", 0);
        int g = ss->settings.getValue("g", 0);
        int b_ = ss->settings.getValue("b", 0);
        ss->settings.popTag();
        targetColours.push_back(ofColor(r, g, b_));
        bool trackHue = ss->settings.getValue("trackHue", 0);
Louis James's avatar
Louis James committed
        colour_params.add(thresholds[i].set("Threshold " + to_string(i), 255,0,255));
        colour_params.add(trackHues[i].set("Track Hue/Sat colour "+to_string(i), trackHue));
        colour_params.add(changeColours[i].set("Change colour "+to_string(i), false));
        // update from settings
Louis James's avatar
Louis James committed
        minareas[i] = ss->settings.getValue("minArea", 0);
        maxareas[i] = ss->settings.getValue("maxArea", 0);
Louis James's avatar
Louis James committed
        minAreaRadi[i] = ss->settings.getValue("minAreaRadius", 0);
        maxAreaRadi[i] = ss->settings.getValue("maxAreaRadius", 0);
        thresholds[i]=ss->settings.getValue("thresh", 0);
Louis James's avatar
Louis James committed

        // Add gui parameters
Louis James's avatar
Louis James committed
        // colour_params.add(minareas[i].set("minArea: " + to_string(i), minareas[i], 0, 400));
        // colour_params.add(maxareas[i].set("maxArea: " + to_string(i), maxareas[i], 0, 400));
Louis James's avatar
Louis James committed
        colour_params.add(minAreaRadi[i].set("minAreaRadius: " + to_string(i), minAreaRadi[i], 0, 50));
        colour_params.add(maxAreaRadi[i].set("maxAreaRadius: " + to_string(i), maxAreaRadi[i], 0, 100));
Louis James's avatar
Louis James committed
        // update contour finders with variables
Louis James's avatar
Louis James committed
        ss->contourFinders[i].setMinArea(minareas[i]);
        ss->contourFinders[i].setMaxArea(maxareas[i]);
        ss->contourFinders[i].setMinAreaRadius(minAreaRadi[i]);
        ss->contourFinders[i].setMaxAreaRadius(maxAreaRadi[i]);
        ss->settings.popTag();
Louis James's avatar
Louis James committed

        // add colour group to gui
        gui.add(colour_params);
Louis James's avatar
Louis James committed
    }
Louis James's avatar
Louis James committed
    ss->settings.popTag(); // pop tag

    // set camera crop / projector position
    ss->settings.pushTag("projectPositions");
    ss->set_rectPos(ss->settings.getValue("x", 0), ss->settings.getValue("y", 0));
    ss->set_width_height(ss->settings.getValue("w", 0), ss->settings.getValue("h", 0));
    ss->settings.popTag();

Louis James's avatar
Louis James committed
    // Bools for ???
    for(int i = 0; i < 4; i++){
        vn.push_back(false);
    }
    // corner booleans initialise to false
Louis James's avatar
Louis James committed

    // Save Settings
    // ss->settings.saveFile("settings.xml");

    // run camera setup commands at the beginning
    run_v4l2_commands();
Louis James's avatar
Louis James committed
//--------------------------------------------------------------
void ofApp::update() {
Louis James's avatar
Louis James committed
    // update camera and crop to area
Louis James's avatar
Louis James committed
    cam.update();
    camPix = cam.getPixels();
    camPix.cropTo(camPix, ss->rectPos.x, ss->rectPos.y, ss->width_height.x, ss->width_height.y);
Louis James's avatar
Louis James committed
    // check new frame
Louis James's avatar
Louis James committed
    // cout << camPix.getWidth() << endl;
    // cout << camPix.getHeight() << endl;
Louis James's avatar
Louis James committed

    // Check new frame  and ...
Louis James's avatar
Louis James committed
    if(cam.isFrameNew()) {
        // Loop for number of colours and track target colours
        for(int i = 0; i < num_colours; i++){
Louis James's avatar
Louis James committed
            // Set contour finders with params
            ss->contourFinders[i].setTargetColor(targetColours[i], trackHues[i] ? TRACK_COLOR_HS : TRACK_COLOR_RGB);
            ss->contourFinders[i].setThreshold(thresholds[i]);
Louis James's avatar
Louis James committed
            ss->contourFinders[i].setMinArea(minareas[i]);
            ss->contourFinders[i].setMaxArea(maxareas[i]);
            ss->contourFinders[i].setMinAreaRadius(minAreaRadi[i]);
            ss->contourFinders[i].setMaxAreaRadius(maxAreaRadi[i]);
Louis James's avatar
Louis James committed
            // if finding: find // cv on / off
            if(ss->find) ss->contourFinders[i].findContours(camPix);
Louis James's avatar
Louis James committed
        }
//--------------------------------------------------------------
void ofApp::draw() {
Louis James's avatar
Louis James committed
    // Zoom ?? Doesn't map mouse position so can't select the correct colour when zoomed
Louis James's avatar
Louis James committed
    if (zoom) {
Louis James's avatar
Louis James committed
        easy_cam.begin();
        ofTranslate(-ofGetWidth() / 2, -ofGetHeight() / 2);
Louis James's avatar
Louis James committed
    ofSetColor(255);
Louis James's avatar
Louis James committed
    cam.draw(0, 0);
    camImage.setFromPixels(camPix);
Louis James's avatar
Louis James committed
    // camImage.draw(0,0);
    ofSetLineWidth(3);
    // Draw gui
    ofPushMatrix();
    // Draw contours found
    ofTranslate(ss->rectPos.x, ss->rectPos.y);
    for(int i=0; i < num_colours; i ++)
        ss->contourFinders[i].draw();
    ofPopMatrix();
Louis James's avatar
Louis James committed

    // draw corner circles
    ofSetColor(100, 244, 244, 100);
Louis James's avatar
Louis James committed
    ofFill();
    ofSetColor(255, 200, 200);
    ofDrawCircle(ss->rectPos.x, ss->rectPos.y, 10);
Louis James's avatar
Louis James committed
    ofDrawCircle(ss->rectPos.x + ss->width_height.x, ss->rectPos.y + ss->width_height.y, 10);
Louis James's avatar
Louis James committed

    // Draw corners if hovered
        ofDrawCircle(ss->rectPos.x, ss->rectPos.y, 30);
        ofDrawCircle(ss->rectPos.x+ss->width_height.x, ss->rectPos.y+ss->width_height.y, 30);
Louis James's avatar
Louis James committed
    ofNoFill();
    ofSetColor(ofColor(255, 200, 233, 40));
Louis James's avatar
Louis James committed
    ofDrawRectangle(ss->rectPos.x, ss->rectPos.y, ss->width_height.x, ss->width_height.y);
Louis James's avatar
Louis James committed
    // ???????
Louis James's avatar
Louis James committed
    ss->camPix.x = 1920;
    ss->camPix.y = 1080;
Louis James's avatar
Louis James committed
    if(zoom) easy_cam.end();

Louis James's avatar
Louis James committed
    // Draw GUI
Louis James's avatar
Louis James committed
    gui.draw();
    ofPushMatrix();
    ofTranslate(1700, 10);
    for (int i = 0; i < num_colours; i++) {
      ofTranslate(0, 75);
      ofFill();
      ofSetColor(0);
      ofDrawRectangle(-3, -3, 64 + 6, 64 + 6);
      ofSetColor(targetColours[i]);
      ofDrawRectangle(0, 0, 64, 64);
    }
    ofPopMatrix();
Louis James's avatar
Louis James committed
//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button) {
Louis James's avatar
Louis James committed
    // if Change colour is true change colour to colour at mouse coords
    for(int i = 0; i < num_colours; i++) {
Louis James's avatar
Louis James committed
        if(changeColours[i]==true) targetColours[i]=cam.getPixels().getColor(x, y);
Louis James's avatar
Louis James committed
}

//--------------------------------------------------------------
Louis James's avatar
Louis James committed
void ofApp::keyPressed(int key) {

  // Save settings to disk
  if (key == 's') {
    saveSettings();
    ss->settings.saveFile("settings.xml");
    cout << "------------------------------------------------------" << endl;
    cout << "--------------- settings saved -----------------------" << endl;
    cout << "------------------------------------------------------" << endl;
  }

  // Toggle corners bool
  if (key == 'c') {
    if (ss->corners) {
      ss->corners = false;
    } else {
      ss->corners = true;
Louis James's avatar
Louis James committed
  }
Louis James's avatar
Louis James committed
  // Toggle chequerboard
  if (key == 'C') {
    if (ss->chequer) {
      ss->chequer = false;
    } else {
      ss->chequer = true;
Louis James's avatar
Louis James committed
  }

  // 'r' key resets camera settings
  if (key == 'r') {
      run_v4l2_commands();
Louis James's avatar
Louis James committed
  }

  // z key toggles zoom mode
  if (key == 'z') {
    if (zoom)
      zoom = false;
    else
      zoom = true;
  }

  // toggle tracking with t
  if (key=='t'){
      if (ss->find){
          ss->find=false;
          cout << "tracking off" << endl;
      } else {
          ss->find=true;
          cout << "tracking on" << endl;
      }
  }
void ofApp::run_v4l2_commands(){
Louis James's avatar
Louis James committed
    // Commands as strings
    string cm1 = "v4l2-ctl -d /dev/video2 -c focus_auto=0";
    string cm2 = "v4l2-ctl -d /dev/video2 -c focus_absolute=0";
    string cm3 = "v4l2-ctl -d /dev/video2 -c exposure_auto=0";
    string cm4 = "v4l2-ctl -d /dev/video2 -c white_balance_temperature_auto=0";
    string cm5 = "v4l2-ctl -d /dev/video2 -c exposure_absolute=656";
    vector<string> commands = {cm1, cm2, cm3, cm4, cm5};
    // loop over commands
    for (auto &_command : commands) {
      // Convert string to const char * as system requires
      // parameter of type const char *
      const char *command = _command.c_str();
      system(command);
    }
//--------------------------------------------------------------
Louis James's avatar
Louis James committed
void ofApp::keyReleased(int key){}

//--------------------------------------------------------------
void ofApp::mouseMoved(int x, int y ){
Louis James's avatar
Louis James committed
    // Crop-area hover logic.
    /*-----------------------*/
    // If hovering at top left of rect xyb is true
    if(ofDist(mouseX, mouseY, ss->rectPos.x, ss->rectPos.y) < 20){
Louis James's avatar
Louis James committed
    } else {
        xyb=false;
Louis James's avatar
Louis James committed

    // If hovering at bottom right of rect whb is true
    if (ofDist(mouseX, mouseY,
               ss->rectPos.x + ss->width_height.x,
               ss->rectPos.y + ss->width_height.y) < 20) {
Louis James's avatar
Louis James committed
        whb = true;
Louis James's avatar
Louis James committed
    } else {
Louis James's avatar
Louis James committed
        whb = false;
Louis James's avatar
Louis James committed
    /*-----------------------*/
}

//--------------------------------------------------------------
void ofApp::mouseDragged(int x, int y, int button){
Louis James's avatar
Louis James committed

    // Update crop control anchors if dragged
        ss->set_rectPos(mouseX, mouseY);
        ss->set_width_height(mouseX-ss->rectPos.x, mouseY-ss->rectPos.y);

//--------------------------------------------------------------
Louis James's avatar
Louis James committed
void ofApp::mouseReleased(int x, int y, int button){}

//--------------------------------------------------------------
Louis James's avatar
Louis James committed
void ofApp::mouseEntered(int x, int y){}
//--------------------------------------------------------------
void ofApp::saveSettings() {
    ss->settings.pushTag("contourFinders");
    for(int i = 0; i < ss->num_colours; i++){
        ss->settings.pushTag("contourFinder", i);
Louis James's avatar
Louis James committed
        ss->settings.setValue("thresh", thresholds[i]);
        ss->settings.setValue("trackHue", trackHues[i]);
Louis James's avatar
Louis James committed
        ss->settings.setValue("minArea", minareas[i]);
        ss->settings.setValue("maxArea", maxareas[i]);
        ss->settings.setValue("minAreaRadius", minAreaRadi[i]);
        ss->settings.setValue("maxAreaRadius", maxAreaRadi[i]);
Louis James's avatar
Louis James committed
        ss->settings.pushTag("threshold");
        ss->settings.setValue("r", targetColours[i].r);
        ss->settings.setValue("g", targetColours[i].g);
        ss->settings.setValue("b", targetColours[i].b);
        ss->settings.popTag();
Louis James's avatar
Louis James committed
        ss->settings.popTag();
    }
    ss->settings.popTag();
Louis James's avatar
Louis James committed

    // Projection position set
    ss->settings.pushTag("projectPositions");
    ss->settings.setValue("x", ss->rectPos.x);
    ss->settings.setValue("y", ss->rectPos.y);
    ss->settings.setValue("w", ss->width_height.x);
    ss->settings.setValue("h", ss->width_height.y);
    ss->settings.popTag();