/***************************************************************************** * ExploringSfMWithOpenCV ****************************************************************************** * by Roy Shilkrot, 5th Dec 2012 * http://www.morethantechnical.com/ ****************************************************************************** * Ch4 of the book "Mastering OpenCV with Practical Computer Vision Projects" * Copyright Packt Publishing 2012. * http://www.packtpub.com/cool-projects-with-opencv/book *****************************************************************************/ #include #include #include "Distance.h" #include "MultiCameraPnP.h" #include "Visualization.h" using namespace std; #include class VisualizerListener : public SfMUpdateListener { public: void update(std::vector pcld, std::vector pcldrgb, std::vector pcld_alternate, std::vector pcldrgb_alternate, std::vector cameras) { ShowClouds(pcld, pcldrgb, pcld_alternate, pcldrgb_alternate); vector v = cameras; for(unsigned int i=0;i images; std::vector images_names; int main(int argc, char** argv) { if (argc < 2) { cerr << "USAGE: " << argv[0] << " [use rich features (RICH/OF) = RICH] [use GPU (GPU/CPU) = GPU] [downscale factor = 1.0]" << endl; return 0; } double downscale_factor = 1.0; if(argc >= 5) downscale_factor = atof(argv[4]); open_imgs_dir(argv[1],images,images_names,downscale_factor); if(images.size() == 0) { cerr << "can't get image files" << endl; return 1; } cv::Ptr distance = new MultiCameraPnP(images,images_names,string(argv[1])); if(argc < 3) distance->use_rich_features = true; else distance->use_rich_features = (strcmp(argv[2], "RICH") == 0); if(argc < 4) distance->use_gpu = (cv::gpu::getCudaEnabledDeviceCount() > 0); else distance->use_gpu = (strcmp(argv[3], "GPU") == 0); cv::Ptr visualizerListener = new VisualizerListener; //with ref-count distance->attach(visualizerListener); RunVisualizationThread(); distance->RecoverDepthFromImages(); //get the scale of the result cloud using PCA double scale_cameras_down = 1.0; { vector cld = distance->getPointCloud(); if (cld.size()==0) cld = distance->getPointCloudBeforeBA(); cv::Mat_ cldm(cld.size(),3); for(unsigned int i=0;i mean; cv::PCA pca(cldm,mean,CV_PCA_DATA_AS_ROW); scale_cameras_down = pca.eigenvalues.at(0) / 5.0; //if (scale_cameras_down > 1.0) { // scale_cameras_down = 1.0/scale_cameras_down; //} } visualizerListener->update(distance->getPointCloud(), distance->getPointCloudRGB(), distance->getPointCloudBeforeBA(), distance->getPointCloudRGBBeforeBA(), distance->getCameras()); //ShowCloud(distance->getPointCloud(), // distance->getPointCloudRGB(), // "baseline_only"); //WaitForVisualizationThread(); //return 1; // ShowClouds(distance->getPointCloud(), // distance->getPointCloudRGB(), // distance->getPointCloudBeforeBA(), // distance->getPointCloudRGBBeforeBA() // ); WaitForVisualizationThread(); }