예제 #1
0
void ntk::MultipleGrabber::onImageUpdated(EventBroadcaster *sender)
{
    RGBDGrabber* grabber = dynamic_cast<RGBDGrabber*>(sender);
    int grabber_index = 0;
    while (m_grabbers[grabber_index] != grabber) ++grabber_index;

    m_all_grabbers_updated_mutex.lock();
    grabber->copyImageTo(m_temp_grabbed_images[grabber_index]);
    m_updated_grabbers.insert(grabber);

    if (m_updated_grabbers.size() == m_grabbers.size())
    {
        m_all_grabbers_updated_condition.wakeAll();
    }
    else if (m_disconnect_alternatively)
    {
        m_grabbers[grabber_index]->stop();
        m_grabbers[grabber_index]->disconnectFromDevice();

        for (int i = 0; i < m_grabbers.size(); ++i)
        {
            if (m_updated_grabbers.find(m_grabbers[i]) == m_updated_grabbers.end())
            {
                m_grabbers[i]->connectToDevice();
                m_grabbers[i]->start();
                break;
            }
        }
    }

    m_all_grabbers_updated_mutex.unlock();   
}
예제 #2
0
int main (int argc, char** argv)
{
    arg_base::set_help_option("-h");
    arg_parse(argc, argv);
    ntk_debug_level = opt::debug_level();
    cv::setBreakOnError(true);

    QApplication app (argc, argv);

    // Config dir is supposed to be next to the binaries.
    QDir prev_dir = QDir::current();
    QDir::setCurrent(QApplication::applicationDirPath());

    MultipleGrabber* multi_grabber = new MultipleGrabber();
    MultiKinectScanner scanner;

    RGBDGrabberFactory& grabber_factory = RGBDGrabberFactory::instance();
    RGBDGrabberFactory::Params params;

    if (opt::directory())
        params.directory = opt::directory();

    if (opt::openni())
        params.default_type = RGBDGrabberFactory::OPENNI;

    if (opt::freenect())
        params.default_type = RGBDGrabberFactory::FREENECT;

    if (opt::kin4win())
        params.default_type = RGBDGrabberFactory::KIN4WIN;

    if (opt::softkinetic())
        params.default_type = RGBDGrabberFactory::SOFTKINETIC;

    if (opt::pmd())
        params.default_type = RGBDGrabberFactory::PMD;

    if (opt::calibration_dir())
        params.calibration_dir = opt::calibration_dir();

    if (opt::high_resolution())
        params.high_resolution = true;

    if (opt::no_registration())
        params.hardware_registration = false;

    if (opt::sync())
        params.synchronous = true;

    std::vector<RGBDGrabberFactory::GrabberData> grabbers;
    grabbers = grabber_factory.createGrabbers(params);

    ntk_dbg_print(grabbers.size(), 1);

    for (int i = 0; i < grabbers.size(); ++i)
    {
        RGBDGrabber* grabber = grabbers[i].grabber;       
        bool ok = grabber->connectToDevice();
        if (!ok)
        {
            ntk_dbg(0) << "WARNING: connectToDevice failed.";
            continue;
        }

        multi_grabber->addGrabber(grabber);
        scanner.addGrabber(grabber);
    }

    QDir::setCurrent(prev_dir.absolutePath());

    GuiMultiKinectController* controller = new GuiMultiKinectController(&scanner);
    if (opt::bbox())
    {
        ntk::Rect3f bbox = readBoundingBoxFromYamlFile(opt::bbox());
        controller->setBoundingBox(bbox, true);
    }

    scanner.plugController(controller);
    controller->scanner().calibratorBlock().setCalibrationPattern(0.034, 10, 7);

    if (opt::sync())
        controller->scanner().setPaused(true);

    scanner.start();
    return app.exec();
}
예제 #3
0
int main (int argc, char** argv)
{
    arg_base::set_help_option("-h");
    arg_parse(argc, argv);
    ntk_debug_level = opt::debug_level();
    cv::setBreakOnError(true);

    QApplication::setGraphicsSystem("raster");
    QApplication app (argc, argv);

    const char* fake_dir = opt::image();
    bool is_directory = opt::directory() != 0;
    if (opt::directory())
        fake_dir = opt::directory();

    ntk::RGBDProcessor* processor = 0;
    RGBDGrabber* grabber = 0;

#ifdef NESTK_USE_OPENNI
    OpenniDriver* ni_driver = 0;
#endif

    bool use_openni = !opt::freenect();
#ifndef NESTK_USE_OPENNI
    use_openni = false;
#endif

    if (opt::image() || opt::directory())
    {
        std::string path = opt::image() ? opt::image() : opt::directory();
        FileGrabber* file_grabber = new FileGrabber(path, opt::directory() != 0);
        grabber = file_grabber;
    }
#ifdef NESTK_USE_OPENNI
    else if (use_openni)
    {
        // Config dir is supposed to be next to the binaries.
        QDir prev = QDir::current();
        QDir::setCurrent(QApplication::applicationDirPath());
        if (!ni_driver) ni_driver = new OpenniDriver();
        OpenniGrabber* k_grabber = new OpenniGrabber(*ni_driver);
        k_grabber->setTrackUsers(false);	
        // k_grabber->setCustomBayerDecoding(true);
        if (opt::high_resolution())
            k_grabber->setHighRgbResolution(true);
        k_grabber->initialize();
        QDir::setCurrent(prev.absolutePath());
        grabber = k_grabber;
    }
#endif
#ifdef NESTK_USE_FREENECT
    else
    {
        FreenectGrabber* k_grabber = new FreenectGrabber();
        k_grabber->initialize();
        k_grabber->setIRMode(false);
        grabber = k_grabber;
    }
#endif

    ntk_ensure(grabber, "Could not create any grabber. Kinect support built?");

    if (use_openni)
    {
        processor = new ntk::OpenniRGBDProcessor();
    }
    else
    {
        processor = new ntk::FreenectRGBDProcessor();
    }

    if (opt::sync())
        grabber->setSynchronous(true);

    RGBDFrameRecorder frame_recorder (opt::dir_prefix());
    frame_recorder.setSaveOnlyRaw(false);

    ntk::RGBDCalibration* calib_data = 0;
    if (opt::calibration_file())
    {
        calib_data = new RGBDCalibration();
        calib_data->loadFromFile(opt::calibration_file());
    }
    else if (use_openni)
    {
        calib_data = grabber->calibrationData();
    }
    else if (QDir::current().exists("kinect_calibration.yml"))
    {
        {
            ntk_dbg(0) << "[WARNING] Using kinect_calibration.yml in current directory";
            ntk_dbg(0) << "[WARNING] use --calibration to specify a different file.";
        }
        calib_data = new RGBDCalibration();
        calib_data->loadFromFile("kinect_calibration.yml");
    }

    ntk_ensure(calib_data, "You must specify a calibration file (--calibration)");
    grabber->setCalibrationData(*calib_data);

    GuiController gui_controller (*grabber, *processor);
    grabber->addEventListener(&gui_controller);
    gui_controller.setFrameRecorder(frame_recorder);

    if (opt::sync())
        gui_controller.setPaused(true);

    SurfelsRGBDModeler modeler;
    modeler.setMinViewsPerSurfel(1);
    processor->setFilterFlag(RGBDProcessorFlags::ComputeNormals, 1);
    processor->setMaxNormalAngle(90);
    processor->setFilterFlag(RGBDProcessorFlags::ComputeMapping, true);

    ModelAcquisitionController* acq_controller = 0;
    acq_controller = new ModelAcquisitionController (gui_controller, modeler);

    IncrementalPoseEstimatorFromImage* pose_estimator = 0;
    // FeatureSetParams params ("FAST", "BRIEF64", true);
    FeatureSetParams params ("SURF", "SURF64", true);
    pose_estimator = new IncrementalPoseEstimatorFromRgbFeatures(params, opt::use_icp());

    acq_controller->setPoseEstimator(pose_estimator);
    gui_controller.setModelAcquisitionController(*acq_controller);

    grabber->start();

    app.exec();
    delete acq_controller;
}
예제 #4
0
int main (int argc, char** argv)
{
  arg_base::set_help_option("-h");
  arg_parse(argc, argv);
  ntk_debug_level = 1;
  cv::setBreakOnError(true);

  QApplication::setGraphicsSystem("raster");
  QApplication app (argc, argv);

  const char* fake_dir = opt::image();
  bool is_directory = opt::directory() != 0;
  if (opt::directory())
    fake_dir = opt::directory();

  ntk::RGBDProcessor* processor = 0;
  RGBDGrabber* grabber = 0;

  bool use_openni = !opt::freenect();
#ifndef USE_OPENNI
  use_openni = false;
#endif

  if (opt::image() || opt::directory())
  {
    std::string path = opt::image() ? opt::image() : opt::directory();
    FileGrabber* file_grabber = new FileGrabber(path, opt::directory() != 0);
    grabber = file_grabber;
  }
  else if (use_openni)
  {
    NiteRGBDGrabber* k_grabber = new NiteRGBDGrabber();
    if (opt::high_resolution())
      k_grabber->setHighRgbResolution(true);
    k_grabber->initialize();
    grabber = k_grabber;
  }
  else
  {
    KinectGrabber* k_grabber = new KinectGrabber();
    k_grabber->initialize();
    k_grabber->setIRMode(false);
    grabber = k_grabber;
  }

  if (use_openni)
  {
    processor = new ntk::NiteProcessor();
  }
  else
  {
    processor = new ntk::KinectProcessor();
  }

  if (opt::sync())
    grabber->setSynchronous(true);

  RGBDFrameRecorder frame_recorder (opt::dir_prefix());
  frame_recorder.setSaveOnlyRaw(false);

  ntk::RGBDCalibration* calib_data = 0;
  if (use_openni)
  {
    calib_data = grabber->calibrationData();
  }
  else if (opt::calibration_file())
  {
    calib_data = new RGBDCalibration();
    calib_data->loadFromFile(opt::calibration_file());
  }
  else if (QDir::current().exists("kinect_calibration.yml"))
  {
    {
      ntk_dbg(0) << "[WARNING] Using kinect_calibration.yml in current directory";
      ntk_dbg(0) << "[WARNING] use --calibration to specify a different file.";
    }
    calib_data = new RGBDCalibration();
    calib_data->loadFromFile("kinect_calibration.yml");
  }

  ntk_ensure(calib_data, "You must specify a calibration file (--calibration)");
  grabber->setCalibrationData(*calib_data);

  GuiController gui_controller (*grabber, *processor);
  grabber->addEventListener(&gui_controller);
  gui_controller.setFrameRecorder(frame_recorder);

  if (opt::sync())
    gui_controller.setPaused(true);

  SurfelsRGBDModeler modeler;
  modeler.setMinViewsPerSurfel(1);
  processor->setFilterFlag(RGBDProcessor::ComputeNormals, 1);
  processor->setMaxNormalAngle(90);

  ModelAcquisitionController* acq_controller = 0;
  acq_controller = new ModelAcquisitionController (gui_controller, modeler);

  RelativePoseEstimator* pose_estimator = 0;
  FeatureSetParams params ("FAST", "BRIEF64", true);
  pose_estimator = new RelativePoseEstimatorFromImage(params);

  acq_controller->setPoseEstimator(pose_estimator);
  gui_controller.setModelAcquisitionController(*acq_controller);

  grabber->start();

  app.exec();
  delete acq_controller;
}
예제 #5
0
int main (int argc, char** argv)
{
    arg_base::set_help_option("-h");
    arg_parse(argc, argv);
    ntk_debug_level = opt::debug_level();
    cv::setBreakOnError(true);

    QApplication::setGraphicsSystem("raster");
    QApplication app (argc, argv);

    RGBDGrabberFactory grabber_factory;
    RGBDGrabberFactory::Params params;

    if (opt::directory())
        params.directory = opt::directory();

    if (opt::openni())
        params.default_type = RGBDGrabberFactory::OPENNI;

    if (opt::freenect())
        params.default_type = RGBDGrabberFactory::FREENECT;

    if (opt::kin4win())
        params.default_type = RGBDGrabberFactory::KIN4WIN;

    if (opt::softkinetic())
        params.default_type = RGBDGrabberFactory::SOFTKINETIC;

    if (opt::pmd())
        params.default_type = RGBDGrabberFactory::PMD;

    if (opt::calibration_file())
        params.calibration_file = opt::calibration_file();

    if (opt::high_resolution())
        params.high_resolution = true;

    if (opt::sync())
        params.synchronous = true;

    std::vector<RGBDGrabberFactory::GrabberData> grabbers;
    grabbers = grabber_factory.createGrabbers(params);

    if (grabbers.size() < 1)
    {
        QMessageBox::critical(0, "Fatal error",
                                  "Cannot connect to any RGBD device.\n\nPlease check that it is correctly plugged to the computer.");
        return 1;
    }

    RGBDGrabber* grabber = grabbers[0].grabber;
    RGBDProcessor* processor = grabbers[0].processor;

    bool ok = grabber->connectToDevice();
    if (!ok)
    {
        ntk_dbg(0) << "WARNING: connectToDevice failed.";
        return 1;
    }

    RGBDFrameRecorder frame_recorder (opt::dir_prefix());
    frame_recorder.setFrameIndex(opt::first_index());
    frame_recorder.setSaveOnlyRaw(true);
    frame_recorder.setUseBinaryRaw(true);
    frame_recorder.setSavePCLPointCloud(opt::savePCD());

    ObjectDetector detector;

    MeshGenerator* mesh_generator = 0;

    ntk::RGBDCalibrationPtr calib_data = grabber->calibrationData();

    if (calib_data)
    {
        mesh_generator = new MeshGenerator();
    }

    GuiController gui_controller (*grabber, *processor);
    grabber->addEventListener(&gui_controller);
    gui_controller.setFrameRecorder(frame_recorder);
    gui_controller.setObjectDetector(detector);

    if (opt::sync())
        gui_controller.setPaused(true);

    if (mesh_generator)
    {
        mesh_generator->setUseColor(true);
        gui_controller.setMeshGenerator(*mesh_generator);
    }

    grabber->start();

    app.exec();
    delete mesh_generator;
}
예제 #6
0
int main (int argc, char** argv)
{
    arg_base::set_help_option("-h");
    arg_parse(argc, argv);
    ntk_debug_level = opt::debug_level();
    cv::setBreakOnError(true);

    QApplication::setGraphicsSystem("raster");
    QApplication app (argc, argv);

    RGBDGrabberFactory& grabber_factory = RGBDGrabberFactory::instance();
    RGBDGrabberFactory::Params params;

    if (opt::directory())
        params.directory = opt::directory();

    if (opt::openni())
        params.default_type = RGBDGrabberFactory::OPENNI;

    if (opt::freenect())
        params.default_type = RGBDGrabberFactory::FREENECT;

    if (opt::kin4win())
        params.default_type = RGBDGrabberFactory::KIN4WIN;

    if (opt::softkinetic())
        params.default_type = RGBDGrabberFactory::SOFTKINETIC;

    if (opt::pmd())
        params.default_type = RGBDGrabberFactory::PMD;

    if (opt::calibration_file())
        params.calibration_file = opt::calibration_file();

    if (opt::sync())
        params.synchronous = true;

    std::vector<RGBDGrabberFactory::GrabberData> grabbers;
    grabbers = grabber_factory.createGrabbers(params);

    if (grabbers.size() < 1)
    {
        QMessageBox::critical(0, "Fatal error",
                                  "Cannot connect to any RGBD device.\n\nPlease check that it is correctly plugged to the computer.");
        return 1;
    }

    RGBDGrabber* grabber = grabbers[0].grabber;
    RGBDProcessor* rgbd_processor = grabbers[0].processor;

    bool ok = grabber->connectToDevice();
    if (!ok)
    {
        ntk_dbg(0) << "WARNING: connectToDevice failed.";
        return 1;
    }

    rgbd_processor->setMaxNormalAngle(40);
    rgbd_processor->setFilterFlag(RGBDProcessorFlags::ComputeMapping, true);
    rgbd_processor->setFilterFlag(RGBDProcessorFlags::FilterThresholdDepth, true);
    rgbd_processor->setMinDepth(0.05f);
    rgbd_processor->setMaxDepth(1.5f);

    MeshGenerator* mesh_generator = 0;
    ntk::RGBDCalibrationPtr calib_data = grabber->calibrationData();

    if (calib_data)
    {
        mesh_generator = new MeshGenerator();
    }

    RGBDFrameRecorder frame_recorder (opt::dir_prefix());
    frame_recorder.setFrameIndex(opt::first_index());
    frame_recorder.setSaveOnlyRaw(true);
    frame_recorder.setUseBinaryRaw(true);

    GuiController gui_controller (*grabber, *rgbd_processor);
    grabber->addEventListener(&gui_controller);
    gui_controller.setFrameRecorder(frame_recorder);

    if (opt::sync())
        gui_controller.setPaused(true);

    TableObjectRGBDModeler modeler;
    modeler.setDepthFilling(true);
    modeler.setRemoveSmallStructures(true);

    ModelAcquisitionController* acq_controller = 0;
    acq_controller = new ModelAcquisitionController (gui_controller, modeler);
    acq_controller->setPaused(true);

    IncrementalPoseEstimatorFromImage* pose_estimator = new DummyIncrementalPoseEstimator();

    acq_controller->setPoseEstimator(pose_estimator);
    gui_controller.setModelAcquisitionController(*acq_controller);

    if (mesh_generator)
        gui_controller.setMeshGenerator(*mesh_generator);

    grabber->start();

    app.exec();
    delete mesh_generator;
    delete acq_controller;
}
예제 #7
0
파일: main.cpp 프로젝트: chparsons/rgbdemo
int main (int argc, char** argv)
{
    arg_base::set_help_option("-h");
    arg_parse(argc, argv);
    ntk_debug_level = opt::debug_level();
    cv::setBreakOnError(true);

    QApplication::setGraphicsSystem("raster");
    QApplication app (argc, argv);

    // Opening cameras. Its important to remember that CvCapture has to be done
    // before PMD otherwise will crash
    // 1.- Logitech (openCV)
    // 2.- PMD (pmdlibrary)

    const char* fake_dir = opt::image();
    bool is_directory = opt::directory() != 0;
    if (opt::directory())
        fake_dir = opt::directory();

    ntk::RGBDProcessor* rgbd_processor = 0;

    RGBDGrabber* grabber = 0;

#ifdef NESTK_USE_OPENNI
    OpenniDriver* ni_driver = 0;
#endif

    bool use_openni = false;
    if (opt::use_kinect())
    {
#ifdef NESTK_USE_OPENNI
        if (opt::use_freenect())
        {
            rgbd_processor = new FreenectRGBDProcessor();
        }
        else
        {
            rgbd_processor = new OpenniRGBDProcessor();
            use_openni = true;
        }
#else
        rgbd_processor = new FreenectRGBDProcessor();
#endif
    }
    else
    {
        rgbd_processor = new RGBDProcessor();
    }

    rgbd_processor->setMaxNormalAngle(40);
    rgbd_processor->setFilterFlag(RGBDProcessor::ComputeMapping, true);
    rgbd_processor->setFilterFlag(RGBDProcessor::FilterThresholdDepth, true);
    rgbd_processor->setMinDepth(0.3);
    rgbd_processor->setMaxDepth(1.5);

    if (opt::image() || opt::directory())
    {
        std::string path = opt::image() ? opt::image() : opt::directory();
        FileGrabber* file_grabber = new FileGrabber(path, is_directory);
        grabber = file_grabber;
        // Image are saved with flipping applied.
        rgbd_processor->setFilterFlag(RGBDProcessor::FlipColorImage, false);
    }
    else if (opt::use_kinect())
    {
        if (opt::use_freenect())
        {
#ifdef NESTK_USE_FREENECT
            FreenectGrabber* k_grabber = new FreenectGrabber();
            k_grabber->initialize();
            k_grabber->setIRMode(false);
            grabber = k_grabber;
#else
            fatal_error("Freenect support not built.");
#endif
        }
        else
        {
#ifdef NESTK_USE_OPENNI
            // Config dir is supposed to be next to the binaries.
            QDir prev = QDir::current();
            QDir::setCurrent(QApplication::applicationDirPath());
            if (!ni_driver) ni_driver = new OpenniDriver();
            OpenniGrabber* k_grabber = new OpenniGrabber(*ni_driver);
            k_grabber->setTrackUsers(false);
            if (opt::high_resolution())
                k_grabber->setHighRgbResolution(true);
            k_grabber->initialize();
            QDir::setCurrent(prev.absolutePath());
            grabber = k_grabber;
#else
            fatal_error("OpenNI support not built, try --freenect.");
#endif
        }
    }
    else
    {
        ntk_assert(0, "PMDSDK support not enabled.");
    }

    MeshGenerator* mesh_generator = 0;
    ntk::RGBDCalibration* calib_data = 0;

    if (opt::calibration_file())
    {
        calib_data = new RGBDCalibration();
        calib_data->loadFromFile(opt::calibration_file());
    }
    else if (use_openni)
    {
        calib_data = grabber->calibrationData();
    }

    if (calib_data)
    {
        mesh_generator = new MeshGenerator();
        grabber->setCalibrationData(*calib_data);
    }

    if (opt::sync())
        grabber->setSynchronous(true);

    RGBDFrameRecorder frame_recorder (opt::dir_prefix());
    frame_recorder.setFrameIndex(opt::first_index());
    frame_recorder.setSaveOnlyRaw(true);
    frame_recorder.setUseBinaryRaw(true);

    GuiController gui_controller (*grabber, *rgbd_processor);
    grabber->addEventListener(&gui_controller);
    gui_controller.setFrameRecorder(frame_recorder);

    if (opt::sync())
        gui_controller.setPaused(true);

    TableObjectRGBDModeler modeler;
    modeler.setDepthFilling(true);
    modeler.setRemoveSmallStructures(true);

    ModelAcquisitionController* acq_controller = 0;
    acq_controller = new ModelAcquisitionController (gui_controller, modeler);
    acq_controller->setPaused(true);

    RelativePoseEstimator* pose_estimator = new DummyRelativePoseEstimator();

    acq_controller->setPoseEstimator(pose_estimator);
    gui_controller.setModelAcquisitionController(*acq_controller);

    if (mesh_generator)
        gui_controller.setMeshGenerator(*mesh_generator);

    grabber->start();

    app.exec();
    delete mesh_generator;
    delete acq_controller;
}
예제 #8
0
int main(int argc, char *argv[])
{
    // Create kinect node
    ros::init(argc, argv, "kinectListenner");



    RGBDGrabber grabber;

    ros::NodeHandle n("~");
//    ros::Subscriber sub = n.subscribe("/camera/depth_registered/points", 2, &DataCompressionNode::pointCloudCallback, &dataCompressor);
    ros::Subscriber sub2 = n.subscribe("/camera/rgb/image_color", 10, &RGBDGrabber::colorImageCallback, &grabber);
    ros::Subscriber sub3 = n.subscribe("/camera/depth_registered/image_rect_raw", 10, &RGBDGrabber::depthImageCallback, &grabber);
    ros::Rate loop_rate(10);

    bool saveMismatched= true;

    n.getParam("saveMismatched", saveMismatched);

    std::cout<<"------------------------- RGBD_GRABBER started -----------------------------"<<std::endl;
    grabber.setSaveMismatchedImages(saveMismatched);
    if (saveMismatched)
    {
        std::cout<<"--------------- RGBDGrabber will save mismatched images. You will get all the frames. ---------------- "<<std::endl;
    } else {
        std::cout<<"--------------- RGBDGrabber will NOT save mismatched images. You might miss some frames. ---------------- "<<std::endl;
    }



    bool loop = true;

    while (ros::ok() && loop)
    {
        int ch = keyPressed();

//        std::cout<<ch<<std::endl;
        switch (ch)
        {
            case 113: // key q
            {
                std::cout<<"------------------------- Exitting program -----------------------------"<<std::endl;
                loop = false;
                break;
            }

            case 115: // key s
            {
                grabber.setSaveOneFrame(true);
                std::cout<<"------------------------- Saving a frame -----------------------------"<<std::endl;
                break;
            }
            case 97: // key a
            {
                grabber.setSaveFrameSeq(true);
                std::cout<<"------------------------- Saving frame sequence-----------------------------"<<std::endl;
                break;
            }
            case 122: // key z
            {
                grabber.setSaveFrameSeq(false);
                std::cout<<"------------------------- Stopping saving -----------------------------"<<std::endl;
                break;
            }
            case 110: // key n
            {
                grabber.createNewFolder();
                std::string folderName = grabber.getFolderName();
                std::cout<<"------------------------- Created new folder "<<folderName<<"-----------------------------"<<std::endl;
                break;
            }
            case 105: // key i
            {
                grabber.increaseFrameSkip();
                std::cout<<"------------------------- Frameskip increased to  "<<grabber.getFrameSkip()<<"-----------------------------"<<std::endl;
                break;
            }
            case 117: // key u
            {
                grabber.decreaseFrameSkip();
                std::cout<<"------------------------- Frameskip decreased to  "<<grabber.getFrameSkip()<<"-----------------------------"<<std::endl;
                break;
            }

            case 0:
                break;
            default:
                   break;
        }

        ros::spinOnce();
        loop_rate.sleep();
    }
}
예제 #9
0
int main (int argc, char** argv)
{
    arg_base::set_help_option("-h");
    arg_parse(argc, argv);
    ntk_debug_level = opt::debug_level();
    cv::setBreakOnError(true);

    QApplication::setGraphicsSystem("raster");
    QApplication app (argc, argv);

    const char* fake_dir = opt::image();
    bool is_directory = opt::directory() != 0;
    if (opt::directory())
        fake_dir = opt::directory();

    ntk::RGBDProcessor* processor = 0;

#ifdef NESTK_USE_OPENNI
    OpenniDriver* ni_driver = 0;
#endif

    RGBDGrabber* grabber = 0;
    bool use_openni = !opt::freenect();
#ifndef NESTK_USE_OPENNI
    use_openni = false;
#endif

    if (opt::image() || opt::directory())
    {
        std::string path = opt::image() ? opt::image() : opt::directory();
        FileGrabber* file_grabber = new FileGrabber(path, opt::directory() != 0);
        grabber = file_grabber;
    }
#ifdef NESTK_USE_OPENNI
    else if (use_openni)
    {
        // Config dir is supposed to be next to the binaries.
        QDir prev = QDir::current();
        QDir::setCurrent(QApplication::applicationDirPath());
        if (!ni_driver) ni_driver = new OpenniDriver();
        OpenniGrabber* k_grabber = new OpenniGrabber(*ni_driver);
        k_grabber->setTrackUsers(false);
        if (opt::high_resolution())
            k_grabber->setHighRgbResolution(true);
        k_grabber->initialize();
        QDir::setCurrent(prev.absolutePath());
        grabber = k_grabber;
    }
#endif
#ifdef NESTK_USE_FREENECT
    else
    {
        FreenectGrabber* k_grabber = new FreenectGrabber();
        k_grabber->initialize();
        k_grabber->setIRMode(false);
        grabber = k_grabber;
    }
#endif

    ntk_ensure(grabber, "Could not create any grabber. Kinect support built?");

    if (use_openni)
    {
        processor = new ntk::OpenniRGBDProcessor();
    }
    else
    {
        processor = new ntk::FreenectRGBDProcessor();
    }
    processor->setFilterFlag(RGBDProcessor::FilterEdges, true);

    if (opt::sync())
        grabber->setSynchronous(true);

    RGBDFrameRecorder frame_recorder (opt::dir_prefix());
    frame_recorder.setSaveOnlyRaw(false);

    ntk::RGBDCalibration* calib_data = 0;
    if (opt::calibration_file())
    {
      calib_data = new RGBDCalibration();
      calib_data->loadFromFile(opt::calibration_file());
    }
    else if (use_openni)
    {
      calib_data = grabber->calibrationData();
    }
    else if (QDir::current().exists("kinect_calibration.yml"))
    {
      {
        ntk_dbg(0) << "[WARNING] Using kinect_calibration.yml in current directory";
        ntk_dbg(0) << "[WARNING] use --calibration to specify a different file.";
      }
      calib_data = new RGBDCalibration();
      calib_data->loadFromFile("kinect_calibration.yml");
    }
    ntk_ensure(calib_data, "You must specify a calibration file (--calibration)");
    grabber->setCalibrationData(*calib_data);

    PeopleTrackerParameters tracker_parameters;
    tracker_parameters.loadFromYamlFile(opt::tracker_config());
    PeopleTracker tracker (tracker_parameters);

    GuiController gui_controller (*grabber, *processor, tracker);
    grabber->addEventListener(&gui_controller);
    gui_controller.setFrameRecorder(frame_recorder);

    if (opt::sync())
        gui_controller.setPaused(true);

    grabber->start();

    app.exec();
}