/** * Main application entry point. * * Accepted argumemnts: * - cpu Perform depth processing with the CPU. * - gl Perform depth processing with OpenGL. * - cl Perform depth processing with OpenCL. * - <number> Serial number of the device to open. * - -noviewer Disable viewer window. */ int main(int argc, char *argv[]) { std::string program_path(argv[0]); size_t executable_name_idx = program_path.rfind("Protonect"); std::string binpath = "/"; if(executable_name_idx != std::string::npos) { binpath = program_path.substr(0, executable_name_idx); } libfreenect2::Freenect2 freenect2; // create a console logger with debug level (default is console logger with info level) libfreenect2::setGlobalLogger(libfreenect2::createConsoleLogger(libfreenect2::Logger::Debug)); MyFileLogger *filelogger = new MyFileLogger(getenv("LOGFILE")); if (filelogger->good()) libfreenect2::setGlobalLogger(filelogger); libfreenect2::Freenect2Device *dev = 0; libfreenect2::PacketPipeline *pipeline = 0; if(freenect2.enumerateDevices() == 0) { std::cout << "no device connected!" << std::endl; return -1; } std::string serial = freenect2.getDefaultDeviceSerialNumber(); bool viewer_enabled = true; for(int argI = 1; argI < argc; ++argI) { const std::string arg(argv[argI]); if(arg == "cpu") { if(!pipeline) pipeline = new libfreenect2::CpuPacketPipeline(); } else if(arg == "gl") { #ifdef LIBFREENECT2_WITH_OPENGL_SUPPORT if(!pipeline) pipeline = new libfreenect2::OpenGLPacketPipeline(); #else std::cout << "OpenGL pipeline is not supported!" << std::endl; #endif } else if(arg == "cl") { #ifdef LIBFREENECT2_WITH_OPENCL_SUPPORT if(!pipeline) pipeline = new libfreenect2::OpenCLPacketPipeline(); #else std::cout << "OpenCL pipeline is not supported!" << std::endl; #endif } else if(arg.find_first_not_of("0123456789") == std::string::npos) //check if parameter could be a serial number { serial = arg; } else if(arg == "-noviewer") { viewer_enabled = false; } else { std::cout << "Unknown argument: " << arg << std::endl; } } if(pipeline) { dev = freenect2.openDevice(serial, pipeline); } else { dev = freenect2.openDevice(serial); } if(dev == 0) { std::cout << "failure opening device!" << std::endl; return -1; } signal(SIGINT,sigint_handler); protonect_shutdown = false; libfreenect2::SyncMultiFrameListener listener(libfreenect2::Frame::Color | libfreenect2::Frame::Ir | libfreenect2::Frame::Depth); libfreenect2::FrameMap frames; libfreenect2::Frame undistorted(512, 424, 4), registered(512, 424, 4); dev->setColorFrameListener(&listener); dev->setIrAndDepthFrameListener(&listener); dev->start(); std::cout << "device serial: " << dev->getSerialNumber() << std::endl; std::cout << "device firmware: " << dev->getFirmwareVersion() << std::endl; libfreenect2::Registration* registration = new libfreenect2::Registration(dev->getIrCameraParams(), dev->getColorCameraParams()); size_t framecount = 0; #ifdef LIBFREENECT2_WITH_OPENGL_SUPPORT Viewer viewer; if (viewer_enabled) viewer.initialize(); #else viewer_enabled = false; #endif while(!protonect_shutdown) { listener.waitForNewFrame(frames); libfreenect2::Frame *rgb = frames[libfreenect2::Frame::Color]; libfreenect2::Frame *ir = frames[libfreenect2::Frame::Ir]; libfreenect2::Frame *depth = frames[libfreenect2::Frame::Depth]; registration->apply(rgb, depth, &undistorted, ®istered); framecount++; if (!viewer_enabled) { if (framecount % 100 == 0) std::cout << "The viewer is turned off. Received " << framecount << " frames. Ctrl-C to stop." << std::endl; listener.release(frames); continue; } #ifdef LIBFREENECT2_WITH_OPENGL_SUPPORT viewer.addFrame("RGB", rgb); viewer.addFrame("ir", ir); viewer.addFrame("depth", depth); viewer.addFrame("registered", ®istered); protonect_shutdown = protonect_shutdown || viewer.render(); #endif listener.release(frames); //libfreenect2::this_thread::sleep_for(libfreenect2::chrono::milliseconds(100)); } // TODO: restarting ir stream doesn't work! // TODO: bad things will happen, if frame listeners are freed before dev->stop() :( dev->stop(); dev->close(); delete registration; return 0; }
int main(int argc, char **argv) { std::string program_path(argv[0]); size_t executable_name_idx = program_path.rfind("test_opengl"); std::string binpath = "./"; if(executable_name_idx != std::string::npos) { binpath = program_path.substr(0, executable_name_idx); } glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); GLFWwindow* window = glfwCreateWindow(1200, 600, "OpenGL", 0, 0); // Windowed libfreenect2::OpenGLContext opengl_ctx(window); libfreenect2::SyncMultiFrameListener fl(libfreenect2::Frame::Ir | libfreenect2::Frame::Depth); libfreenect2::FrameMap frames; libfreenect2::DepthPacketProcessor::Config cfg; cfg.EnableBilateralFilter = false; cfg.EnableEdgeAwareFilter = false; libfreenect2::OpenGLDepthPacketProcessor processor(opengl_ctx.glfw_ctx); processor.setConfiguration(cfg); processor.setFrameListener(&fl); processor.loadP0TablesFromFiles((binpath + "../p00.bin").c_str(), (binpath + "../p01.bin").c_str(), (binpath + "../p02.bin").c_str()); processor.load11To16LutFromFile(""); processor.loadXTableFromFile(""); processor.loadZTableFromFile(""); libfreenect2::CpuDepthPacketProcessor ref_processor; ref_processor.setConfiguration(cfg); ref_processor.setFrameListener(&fl); ref_processor.loadP0TablesFromFiles((binpath + "../p00.bin").c_str(), (binpath + "../p01.bin").c_str(), (binpath + "../p02.bin").c_str()); ref_processor.load11To16LutFromFile(""); ref_processor.loadXTableFromFile(""); ref_processor.loadZTableFromFile(""); libfreenect2::AsyncPacketProcessor<libfreenect2::DepthPacket> async(&processor); libfreenect2::DepthPacket p; p.buffer_length = 352*424*10*2; p.buffer = new unsigned char[p.buffer_length]; loadBufferFromFile(binpath + "../rawir/rawir_4599.bin", p.buffer, p.buffer_length); libfreenect2::Frame *ir, *depth; cv::Mat cpu_ir, cpu_depth, ogl_ir, ogl_depth; ref_processor.process(p); fl.waitForNewFrame(frames); ir = frames[libfreenect2::Frame::Ir]; depth = frames[libfreenect2::Frame::Depth]; cv::Mat(ir->height, ir->width, CV_32FC1, ir->data).copyTo(cpu_ir); cv::Mat(depth->height, depth->width, CV_32FC1, depth->data).copyTo(cpu_depth); fl.release(frames); processor.process(p); fl.waitForNewFrame(frames); ir = frames[libfreenect2::Frame::Ir]; depth = frames[libfreenect2::Frame::Depth]; cv::Mat(ir->height, ir->width, CV_32FC1, ir->data).copyTo(ogl_ir); cv::Mat(depth->height, depth->width, CV_32FC1, depth->data).copyTo(ogl_depth); fl.release(frames); cv::Mat diff_ir = cv::abs(cpu_ir - ogl_ir); cv::Mat diff_depth = cv::abs(cpu_depth - ogl_depth); cv::imshow("cpu_ir", cpu_ir / 65535.0f); cv::imshow("cpu_depth", cpu_depth / 4500.0f); cv::imshow("diff_ir", diff_ir); cv::imshow("diff_depth", diff_depth); cv::waitKey(0); double mi, ma; cv::minMaxIdx(diff_depth, &mi, &ma); std::cout << "depth difference min: " << mi << " max: " << ma << std::endl; while(!glfwWindowShouldClose(window)) { if(async.ready()) async.process(p); //processor.process(p); opengl_ctx.makeCurrent(); glfwSwapBuffers(opengl_ctx.glfw_ctx); //glfwSwapBuffers(window_background); glfwPollEvents(); } return 0; }
int main(int argc, char *argv[]) { std::string program_path(argv[0]); size_t executable_name_idx = program_path.rfind("Protonect"); std::string binpath = "/"; if(executable_name_idx != std::string::npos) { binpath = program_path.substr(0, executable_name_idx); } glfwInit(); libfreenect2::Freenect2 freenect2; // libfreenect2::Freenect2Device *dev = freenect2.openDefaultDevice(); libfreenect2::Freenect2Device *dev = 0; for(int i = 1; i < argc; ++i) { #ifdef LIBFREENECT2_WITH_OPENCL_SUPPORT if(strcmp(argv[i], "--opencl") == 0) dev = freenect2.openDefaultDevice(new libfreenect2::OpenCLPacketPipeline()); else #endif if(strcmp(argv[i], "--opengl") == 0) dev = freenect2.openDefaultDevice(new libfreenect2::OpenGLPacketPipeline()); else if(strcmp(argv[i], "--cpu") == 0) dev = freenect2.openDefaultDevice(new libfreenect2::CpuPacketPipeline()); else { std::cout << "Usage: Protonect [option]" << std::endl << "Packet processor type may be selected with these options:" << std::endl << "\t--opengl\tUse OpenGL to process depth packets" << std::endl << "\t--cpu\tUse CPU to process depth packets (slower)" << std::endl #ifdef LIBFREENECT2_WITH_OPENCL_SUPPORT << "\t--opencl\tUse OpenCL to process depth packets" << std::endl #else << std::endl << "This Protonect was not compiled with OpenCL support, so OpenCL depth processor is not available." << std::endl #endif << "Default is OpenGL processor." << std::endl; exit(1); } } if(dev == 0) dev = freenect2.openDefaultDevice(); if(dev == 0) { std::cout << "no device connected or failure opening the default one!" << std::endl; return -1; } signal(SIGINT,sigint_handler); protonect_shutdown = false; libfreenect2::SyncMultiFrameListener listener(libfreenect2::Frame::Color | libfreenect2::Frame::Ir | libfreenect2::Frame::Depth); libfreenect2::FrameMap frames; dev->setColorFrameListener(&listener); dev->setIrAndDepthFrameListener(&listener); dev->start(); std::cout << "device serial: " << dev->getSerialNumber() << std::endl; std::cout << "device firmware: " << dev->getFirmwareVersion() << std::endl; while(!protonect_shutdown) { listener.waitForNewFrame(frames); libfreenect2::Frame *rgb = frames[libfreenect2::Frame::Color]; libfreenect2::Frame *ir = frames[libfreenect2::Frame::Ir]; libfreenect2::Frame *depth = frames[libfreenect2::Frame::Depth]; cv::imshow("rgb", cv::Mat(rgb->height, rgb->width, CV_8UC3, rgb->data)); cv::imshow("ir", cv::Mat(ir->height, ir->width, CV_32FC1, ir->data) / 20000.0f); cv::imshow("depth", cv::Mat(depth->height, depth->width, CV_32FC1, depth->data) / 4500.0f); int key = cv::waitKey(1); protonect_shutdown = protonect_shutdown || (key > 0 && ((key & 0xFF) == 27)); // shutdown on escape listener.release(frames); //libfreenect2::this_thread::sleep_for(libfreenect2::chrono::milliseconds(100)); } // TODO: restarting ir stream doesn't work! // TODO: bad things will happen, if frame listeners are freed before dev->stop() :( dev->stop(); dev->close(); return 0; }
/** * Main application entry point. * * Accepted argumemnts: * - cpu Perform depth processing with the CPU. * - gl Perform depth processing with OpenGL. * - cl Perform depth processing with OpenCL. * - <number> Serial number of the device to open. * - -noviewer Disable viewer window. * - -streamer Enable UDP Streaming of captured images. * - -recorder Enable recording of captured images. * - -replay Enable replay of captured images. */ int main(int argc, char *argv[]) /// [main] { std::string program_path(argv[0]); std::cerr << "Version: " << LIBFREENECT2_VERSION << std::endl; std::cerr << "Environment variables: LOGFILE=<protonect.log>" << std::endl; std::cerr << "Usage: " << program_path << " [-gpu=<id>] [gl | cl | clkde | cuda | cudakde | cpu] [<device serial>]" << std::endl; std::cerr << " [-noviewer] [-norgb | -nodepth] [-help] [-version]" << std::endl; std::cerr << " [-recorder] [-streamer] [-replay]" << std::endl; std::cerr << " [-frames <number of frames to process>]" << std::endl; std::cerr << "To pause and unpause: pkill -USR1 ProtonectSR" << std::endl; size_t executable_name_idx = program_path.rfind("ProtonectSR"); const std::string prog(argv[0]); std::string binpath = "/"; if(executable_name_idx != std::string::npos) { binpath = program_path.substr(0, executable_name_idx); } #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) // avoid flooing the very slow Windows console with debug messages libfreenect2::setGlobalLogger(libfreenect2::createConsoleLogger(libfreenect2::Logger::Info)); #else // create a console logger with debug level (default is console logger with info level) /// [logging] libfreenect2::setGlobalLogger(libfreenect2::createConsoleLogger(libfreenect2::Logger::Debug)); /// [logging] #endif /// [file logging] MyFileLogger *filelogger = new MyFileLogger(getenv("LOGFILE")); if (filelogger->good()) libfreenect2::setGlobalLogger(filelogger); else delete filelogger; /// [file logging] /// [context] libfreenect2::Freenect2 freenect2; // TODO: enable on merge //libfreenect2::Freenect2Replay freenect2replay; libfreenect2::Freenect2Device *dev = 0; libfreenect2::PacketPipeline *pipeline = 0; /// [context] std::string serial = ""; bool viewer_enabled = true; bool streamer_enabled = false; bool recorder_enabled = false; bool replay_enabled = false; bool enable_rgb = true; bool enable_depth = true; int deviceId = -1; size_t framemax = -1; for(int argI = 1; argI < argc; ++argI) { const std::string arg(argv[argI]); if(arg == "-help" || arg == "--help" || arg == "-h" || arg == "-v" || arg == "--version" || arg == "-version") { // Just let the initial lines display at the beginning of main return 0; } else if(arg.find("-gpu=") == 0) { if (pipeline) { std::cerr << "-gpu must be specified before pipeline argument" << std::endl; return -1; } deviceId = atoi(argv[argI] + 5); } else if(arg == "cpu") { if(!pipeline) /// [pipeline] pipeline = new libfreenect2::CpuPacketPipeline(); /// [pipeline] } else if(arg == "gl") { #ifdef LIBFREENECT2_WITH_OPENGL_SUPPORT if(!pipeline) pipeline = new libfreenect2::OpenGLPacketPipeline(); #else std::cout << "OpenGL pipeline is not supported!" << std::endl; #endif } else if(arg == "cl") { #ifdef LIBFREENECT2_WITH_OPENCL_SUPPORT if(!pipeline) pipeline = new libfreenect2::OpenCLPacketPipeline(deviceId); #else std::cout << "OpenCL pipeline is not supported!" << std::endl; #endif } else if(arg == "clkde") { #ifdef LIBFREENECT2_WITH_OPENCL_SUPPORT if(!pipeline) pipeline = new libfreenect2::OpenCLKdePacketPipeline(deviceId); #else std::cout << "OpenCL pipeline is not supported!" << std::endl; #endif } else if(arg == "cuda") { #ifdef LIBFREENECT2_WITH_CUDA_SUPPORT if(!pipeline) pipeline = new libfreenect2::CudaPacketPipeline(deviceId); #else std::cout << "CUDA pipeline is not supported!" << std::endl; #endif } else if(arg == "cudakde") { #ifdef LIBFREENECT2_WITH_CUDA_SUPPORT if(!pipeline) pipeline = new libfreenect2::CudaKdePacketPipeline(deviceId); #else std::cout << "CUDA pipeline is not supported!" << std::endl; #endif } else if(arg.find_first_not_of("0123456789") == std::string::npos) //check if parameter could be a serial number { serial = arg; } else if(arg == "-noviewer" || arg == "--noviewer") { viewer_enabled = false; } else if(arg == "-norgb" || arg == "--norgb") { enable_rgb = false; } else if(arg == "-nodepth" || arg == "--nodepth") { enable_depth = false; } else if(arg == "-frames") { ++argI; framemax = strtol(argv[argI], NULL, 0); if (framemax == 0) { std::cerr << "invalid frame count '" << argv[argI] << "'" << std::endl; return -1; } } else if(arg == "-streamer" || arg == "--streamer" || prog == "freenect2-stream") { streamer_enabled = true; } else if(arg == "-recorder" || arg == "--recorder" || prog == "freenect2-record") { recorder_enabled = true; } else if(arg == "-replay" || arg == "--replay" || prog == "freenect2-replay") { replay_enabled = true; } else { std::cout << "Unknown argument: " << arg << std::endl; } } if (!enable_rgb && !enable_depth) { std::cerr << "Disabling both streams is not allowed!" << std::endl; return -1; } /// [discovery] if(replay_enabled == false) { if(freenect2.enumerateDevices() == 0) { std::cout << "no device connected!" << std::endl; return -1; } if(serial == "") { serial = freenect2.getDefaultDeviceSerialNumber(); } } /// [discovery] if(replay_enabled == false) { if(pipeline) { /// [open] dev = freenect2.openDevice(serial, pipeline); /// [open] } else { dev = freenect2.openDevice(serial); } } else { DIR *d; struct dirent *dir; std::vector<std::string> frame_filenames; d = opendir("recordings/depth"); if(!d) { std::cerr << "Could not open directory " << dir << " for replay." << std::endl; exit(1); } while((dir = readdir(d)) != NULL) { std::string name = dir->d_name; if(hasSuffix(name, ".depth")) { frame_filenames.push_back(name); } else { std::cerr << "Skipping currently unsupported frame filename: " << name << std::endl; } } // TODO: enable on merge /* if(pipeline) { /// [open] dev = freenect2replay.openDevice(frame_filenames, pipeline); /// [open] } else { dev = freenect2replay.openDevice(frame_filenames); } */ } if(dev == 0) { std::cout << "failure opening device!" << std::endl; return -1; } devtopause = dev; signal(SIGINT,sigint_handler); #ifdef SIGUSR1 signal(SIGUSR1, sigusr1_handler); #endif protonect_shutdown = false; /// [listeners] int types = 0; if (enable_rgb) types |= libfreenect2::Frame::Color; if (enable_depth) types |= libfreenect2::Frame::Ir | libfreenect2::Frame::Depth; libfreenect2::SyncMultiFrameListener listener(types); libfreenect2::FrameMap frames; dev->setColorFrameListener(&listener); dev->setIrAndDepthFrameListener(&listener); /// [listeners] /// [start] if (enable_rgb && enable_depth) { if (!dev->start()) return -1; } else { if (!dev->startStreams(enable_rgb, enable_depth)) return -1; } std::cout << "device serial: " << dev->getSerialNumber() << std::endl; std::cout << "device firmware: " << dev->getFirmwareVersion() << std::endl; /// [start] /// [registration setup] libfreenect2::Registration* registration = new libfreenect2::Registration(dev->getIrCameraParams(), dev->getColorCameraParams()); libfreenect2::Frame undistorted(512, 424, 4), registered(512, 424, 4); /// [registration setup] size_t framecount = 0; #ifdef EXAMPLES_WITH_OPENGL_SUPPORT Viewer viewer; if (viewer_enabled) viewer.initialize(); #else viewer_enabled = false; #endif Streamer streamer; // have to declare it outside statements to be accessible everywhere Recorder recorder; if(streamer_enabled) { streamer.initialize(); } if(recorder_enabled) { recorder.initialize(); } /// [loop start] while(!protonect_shutdown && (framemax == (size_t)-1 || framecount < framemax)) { if (!listener.waitForNewFrame(frames, 10*1000)) // 10 sconds { std::cout << "timeout!" << std::endl; return -1; } libfreenect2::Frame *rgb = frames[libfreenect2::Frame::Color]; libfreenect2::Frame *ir = frames[libfreenect2::Frame::Ir]; libfreenect2::Frame *depth = frames[libfreenect2::Frame::Depth]; /// [loop start] if (enable_rgb && enable_depth) { /// [registration] registration->apply(rgb, depth, &undistorted, ®istered); /// [registration] } framecount++; if (streamer_enabled) { streamer.stream(depth); } if (recorder_enabled) { // TODO: add recording timestamp if max frame number reached // + avoid recording new ones recorder.record(depth, "depth"); recorder.record(®istered, "registered"); // recorder.record(rgb,"rgb"); recorder.registTimeStamp(); } if (!viewer_enabled) { if (framecount % 100 == 0) std::cout << "The viewer is turned off. Received " << framecount << " frames. Ctrl-C to stop." << std::endl; listener.release(frames); continue; } #ifdef EXAMPLES_WITH_OPENGL_SUPPORT if (enable_rgb) { viewer.addFrame("RGB", rgb); } if (enable_depth) { viewer.addFrame("ir", ir); viewer.addFrame("depth", depth); } if (enable_rgb && enable_depth) { viewer.addFrame("registered", ®istered); } protonect_shutdown = protonect_shutdown || viewer.render(); #endif /// [loop end] listener.release(frames); /** libfreenect2::this_thread::sleep_for(libfreenect2::chrono::milliseconds(100)); */ } /// [loop end] if (recorder_enabled) { recorder.saveTimeStamp(); } // TODO: restarting ir stream doesn't work! // TODO: bad things will happen, if frame listeners are freed before dev->stop() :( /// [stop] dev->stop(); dev->close(); /// [stop] delete registration; return 0; }
int main(int argc, char *argv[]) { std::string program_path(argv[0]); size_t executable_name_idx = program_path.rfind("Protonect"); std::string binpath = "/"; if(executable_name_idx != std::string::npos) { binpath = program_path.substr(0, executable_name_idx); } uint16_t vid = 0x045E; uint16_t pid = 0x02C4; uint16_t mi = 0x00; bool debug_mode = false; libusb_device_handle *handle; libusb_device *dev; uint8_t bus; const char* speed_name[5] = { "Unknown", "1.5 Mbit/s (USB LowSpeed)", "12 Mbit/s (USB FullSpeed)", "480 Mbit/s (USB HighSpeed)", "5000 Mbit/s (USB SuperSpeed)" }; int r; const struct libusb_version* version; version = libusb_get_version(); printf("Using libusbx v%d.%d.%d.%d\n\n", version->major, version->minor, version->micro, version->nano); r = libusb_init(NULL); if (r < 0) return r; libusb_set_debug(NULL, debug_mode ? LIBUSB_LOG_LEVEL_DEBUG : LIBUSB_LOG_LEVEL_INFO); printf("Opening device %04X:%04X...\n", vid, pid); handle = libusb_open_device_with_vid_pid(NULL, vid, pid); if (handle == NULL) { perr(" Failed.\n"); //system("PAUSE"); return -1; } dev = libusb_get_device(handle); bus = libusb_get_bus_number(dev); /* struct libusb_device_descriptor dev_desc; printf("\nReading device descriptor:\n"); CALL_CHECK(libusb_get_device_descriptor(dev, &dev_desc)); printf(" length: %d\n", dev_desc.bLength); printf(" device class: %d\n", dev_desc.bDeviceClass); printf(" S/N: %d\n", dev_desc.iSerialNumber); printf(" VID:PID: %04X:%04X\n", dev_desc.idVendor, dev_desc.idProduct); printf(" bcdDevice: %04X\n", dev_desc.bcdDevice); printf(" iMan:iProd:iSer: %d:%d:%d\n", dev_desc.iManufacturer, dev_desc.iProduct, dev_desc.iSerialNumber); printf(" nb confs: %d\n", dev_desc.bNumConfigurations); */ r = libusb_get_device_speed(dev); if ((r < 0) || (r > 4)) r = 0; printf(" speed: %s\n", speed_name[r]); int active_cfg = -5; r = libusb_get_configuration(handle, &active_cfg); printf("active configuration: %d, err: %d", active_cfg, r); int configId = 1; if (active_cfg != configId) { printf("Setting config: %d\n", configId); r = libusb_set_configuration(handle, configId); if (r != LIBUSB_SUCCESS) { perr(" Can't set configuration. Error code: %d (%s)\n", r, libusb_error_name(r)); } } int iface = 0; printf("\nClaiming interface %d...\n", iface); r = libusb_claim_interface(handle, iface); if (r != LIBUSB_SUCCESS) { perr(" Failed: %d.\n", r); } iface = 1; printf("\nClaiming interface %d...\n", iface); r = libusb_claim_interface(handle, iface); if (r != LIBUSB_SUCCESS) { perr(" Failed: %d.\n", r); } InitKinect(handle); // install signal handler now signal(SIGINT,sigint_handler); shutdown = false; libfreenect2::usb::EventLoop usb_loop; usb_loop.start(); libfreenect2::FrameMap frames; libfreenect2::FrameListener frame_listener(libfreenect2::Frame::Color | libfreenect2::Frame::Ir | libfreenect2::Frame::Depth); //libfreenect2::DumpRgbPacketProcessor rgb_processor; libfreenect2::TurboJpegRgbPacketProcessor rgb_processor; rgb_processor.setFrameListener(&frame_listener); libfreenect2::RgbPacketStreamParser rgb_packet_stream_parser(&rgb_processor); libfreenect2::usb::BulkTransferPool rgb_bulk_transfers(handle, 0x83); rgb_bulk_transfers.allocate(50, 0x4000); rgb_bulk_transfers.setCallback(&rgb_packet_stream_parser); rgb_bulk_transfers.enableSubmission(); libfreenect2::CpuDepthPacketProcessor depth_processor; depth_processor.setFrameListener(&frame_listener); depth_processor.load11To16LutFromFile((binpath + "../11to16.bin").c_str()); depth_processor.loadXTableFromFile((binpath + "../xTable.bin").c_str()); depth_processor.loadZTableFromFile((binpath + "../zTable.bin").c_str()); libfreenect2::DepthPacketStreamParser depth_packet_stream_parser(&depth_processor); size_t max_packet_size = libusb_get_max_iso_packet_size(dev, 0x84); std::cout << "iso max_packet_size: " << max_packet_size << std::endl; libfreenect2::usb::IsoTransferPool depth_iso_transfers(handle, 0x84); depth_iso_transfers.allocate(80, 8, max_packet_size); depth_iso_transfers.setCallback(&depth_packet_stream_parser); depth_iso_transfers.enableSubmission(); r = libusb_get_device_speed(dev); if ((r < 0) || (r > 4)) r = 0; printf(" speed: %s\n", speed_name[r]); RunKinect(handle, depth_processor); rgb_bulk_transfers.submit(10); depth_iso_transfers.submit(60); r = libusb_get_device_speed(dev); if ((r < 0) || (r > 4)) r = 0; printf(" speed: %s\n", speed_name[r]); while(!shutdown) { frame_listener.waitForNewFrame(frames); libfreenect2::Frame *rgb = frames[libfreenect2::Frame::Color]; libfreenect2::Frame *ir = frames[libfreenect2::Frame::Ir]; libfreenect2::Frame *depth = frames[libfreenect2::Frame::Depth]; cv::imshow("rgb", cv::Mat(rgb->height, rgb->width, CV_8UC3, rgb->data)); cv::imshow("ir", cv::Mat(ir->height, ir->width, CV_32FC1, ir->data) / 20000.0f); cv::imshow("depth", cv::Mat(depth->height, depth->width, CV_32FC1, depth->data) / 4500.0f); cv::waitKey(1); frame_listener.release(frames); } r = libusb_get_device_speed(dev); if ((r < 0) || (r > 4)) r = 0; printf(" speed: %s\n", speed_name[r]); rgb_bulk_transfers.disableSubmission(); depth_iso_transfers.disableSubmission(); CloseKinect(handle); rgb_bulk_transfers.cancel(); depth_iso_transfers.cancel(); // wait for all transfers to cancel // TODO: better implementation libfreenect2::this_thread::sleep_for(libfreenect2::chrono::seconds(2)); rgb_bulk_transfers.deallocate(); depth_iso_transfers.deallocate(); r = libusb_get_device_speed(dev); if ((r < 0) || (r > 4)) r = 0; printf(" speed: %s\n", speed_name[r]); iface = 0; printf("Releasing interface %d...\n", iface); libusb_release_interface(handle, iface); iface = 1; printf("Releasing interface %d...\n", iface); libusb_release_interface(handle, iface); printf("Closing device...\n"); libusb_close(handle); usb_loop.stop(); libusb_exit(NULL); //system("PAUSE"); return 0; }
/** * Main application entry point. * * Accepted argumemnts: * - cpu Perform depth processing with the CPU. * - gl Perform depth processing with OpenGL. * - cl Perform depth processing with OpenCL. * - <number> Serial number of the device to open. * - -noviewer Disable viewer window. */ int main(int argc, char *argv[]) /// [main] { std::string program_path(argv[0]); std::cerr << "Version: " << LIBFREENECT2_VERSION << std::endl; std::cerr << "Environment variables: LOGFILE=<protonect.log>" << std::endl; std::cerr << "Usage: " << program_path << " [gl | cl | cuda | cpu] [<device serial>]" << std::endl; std::cerr << " [-noviewer] [-norgb | -nodepth] [-help] [-version]" << std::endl; std::cerr << "To pause and unpause: pkill -USR1 Protonect" << std::endl; size_t executable_name_idx = program_path.rfind("Protonect"); std::string binpath = "/"; if(executable_name_idx != std::string::npos) { binpath = program_path.substr(0, executable_name_idx); } #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) // avoid flooing the very slow Windows console with debug messages libfreenect2::setGlobalLogger(libfreenect2::createConsoleLogger(libfreenect2::Logger::Info)); #else // create a console logger with debug level (default is console logger with info level) /// [logging] libfreenect2::setGlobalLogger(libfreenect2::createConsoleLogger(libfreenect2::Logger::Debug)); /// [logging] #endif /// [file logging] MyFileLogger *filelogger = new MyFileLogger(getenv("LOGFILE")); if (filelogger->good()) libfreenect2::setGlobalLogger(filelogger); else delete filelogger; /// [file logging] /// [context] libfreenect2::Freenect2 freenect2; libfreenect2::Freenect2Device *dev = 0; libfreenect2::PacketPipeline *pipeline = 0; /// [context] std::string serial = ""; bool viewer_enabled = true; bool enable_rgb = true; bool enable_depth = true; for(int argI = 1; argI < argc; ++argI) { const std::string arg(argv[argI]); if(arg == "-help" || arg == "--help" || arg == "-h" || arg == "-v" || arg == "--version" || arg == "-version") { // Just let the initial lines display at the beginning of main return 0; } else if(arg == "cpu") { if(!pipeline) /// [pipeline] pipeline = new libfreenect2::CpuPacketPipeline(); /// [pipeline] } else if(arg == "gl") { #ifdef LIBFREENECT2_WITH_OPENGL_SUPPORT if(!pipeline) pipeline = new libfreenect2::OpenGLPacketPipeline(); #else std::cout << "OpenGL pipeline is not supported!" << std::endl; #endif } else if(arg == "cl") { #ifdef LIBFREENECT2_WITH_OPENCL_SUPPORT if(!pipeline) pipeline = new libfreenect2::OpenCLPacketPipeline(); #else std::cout << "OpenCL pipeline is not supported!" << std::endl; #endif } else if(arg == "cuda") { #ifdef LIBFREENECT2_WITH_CUDA_SUPPORT if(!pipeline) pipeline = new libfreenect2::CudaPacketPipeline(); #else std::cout << "CUDA pipeline is not supported!" << std::endl; #endif } else if(arg.find_first_not_of("0123456789") == std::string::npos) //check if parameter could be a serial number { serial = arg; } else if(arg == "-noviewer" || arg == "--noviewer") { viewer_enabled = false; } else if(arg == "-norgb" || arg == "--norgb") { enable_rgb = false; } else if(arg == "-nodepth" || arg == "--nodepth") { enable_depth = false; } else { std::cout << "Unknown argument: " << arg << std::endl; } } if (!enable_rgb && !enable_depth) { std::cerr << "Disabling both streams is not allowed!" << std::endl; return -1; } /// [discovery] if(freenect2.enumerateDevices() == 0) { std::cout << "no device connected!" << std::endl; return -1; } if (serial == "") { serial = freenect2.getDefaultDeviceSerialNumber(); } /// [discovery] if(pipeline) { /// [open] dev = freenect2.openDevice(serial, pipeline); /// [open] } else { dev = freenect2.openDevice(serial); } if(dev == 0) { std::cout << "failure opening device!" << std::endl; return -1; } devtopause = dev; signal(SIGINT,sigint_handler); #ifdef SIGUSR1 signal(SIGUSR1, sigusr1_handler); #endif protonect_shutdown = false; /// [listeners] int types = 0; if (enable_rgb) types |= libfreenect2::Frame::Color; if (enable_depth) types |= libfreenect2::Frame::Ir | libfreenect2::Frame::Depth; libfreenect2::SyncMultiFrameListener listener(types); libfreenect2::FrameMap frames; dev->setColorFrameListener(&listener); dev->setIrAndDepthFrameListener(&listener); /// [listeners] /// [start] if (enable_rgb && enable_depth) { if (!dev->start()) return -1; } else { if (!dev->startStreams(enable_rgb, enable_depth)) return -1; } std::cout << "device serial: " << dev->getSerialNumber() << std::endl; std::cout << "device firmware: " << dev->getFirmwareVersion() << std::endl; /// [start] /// [registration setup] libfreenect2::Registration* registration = new libfreenect2::Registration(dev->getIrCameraParams(), dev->getColorCameraParams()); libfreenect2::Frame undistorted(512, 424, 4), registered(512, 424, 4); /// [registration setup] size_t framecount = 0; #ifdef EXAMPLES_WITH_OPENGL_SUPPORT Viewer viewer; if (viewer_enabled) viewer.initialize(); #else viewer_enabled = false; #endif /// [loop start] while(!protonect_shutdown) { listener.waitForNewFrame(frames); libfreenect2::Frame *rgb = frames[libfreenect2::Frame::Color]; libfreenect2::Frame *ir = frames[libfreenect2::Frame::Ir]; libfreenect2::Frame *depth = frames[libfreenect2::Frame::Depth]; /// [loop start] if (enable_rgb && enable_depth) { /// [registration] registration->apply(rgb, depth, &undistorted, ®istered); /// [registration] } framecount++; if (!viewer_enabled) { if (framecount % 100 == 0) std::cout << "The viewer is turned off. Received " << framecount << " frames. Ctrl-C to stop." << std::endl; listener.release(frames); continue; } #ifdef EXAMPLES_WITH_OPENGL_SUPPORT if (enable_rgb) { viewer.addFrame("RGB", rgb); } if (enable_depth) { viewer.addFrame("ir", ir); viewer.addFrame("depth", depth); } if (enable_rgb && enable_depth) { viewer.addFrame("registered", ®istered); } protonect_shutdown = protonect_shutdown || viewer.render(); #endif /// [loop end] listener.release(frames); /** libfreenect2::this_thread::sleep_for(libfreenect2::chrono::milliseconds(100)); */ } /// [loop end] // TODO: restarting ir stream doesn't work! // TODO: bad things will happen, if frame listeners are freed before dev->stop() :( /// [stop] dev->stop(); dev->close(); /// [stop] delete registration; return 0; }
int main(int argc, char *argv[]) { std::string program_path(argv[0]); size_t executable_name_idx = program_path.rfind("Protonect"); std::string binpath = "/"; if(executable_name_idx != std::string::npos) { binpath = program_path.substr(0, executable_name_idx); } glfwInit(); libfreenect2::Freenect2 freenect2; libfreenect2::Freenect2Device *dev = freenect2.openDefaultDevice(); if(dev == 0) { std::cout << "no device connected or failure opening the default one!" << std::endl; return -1; } signal(SIGINT,sigint_handler); protonect_shutdown = false; libfreenect2::SyncMultiFrameListener listener(libfreenect2::Frame::Color | libfreenect2::Frame::Ir | libfreenect2::Frame::Depth); libfreenect2::FrameMap frames; dev->setColorFrameListener(&listener); dev->setIrAndDepthFrameListener(&listener); dev->start(); std::cout << "device serial: " << dev->getSerialNumber() << std::endl; std::cout << "device firmware: " << dev->getFirmwareVersion() << std::endl; while(!protonect_shutdown) { listener.waitForNewFrame(frames); libfreenect2::Frame *rgb = frames[libfreenect2::Frame::Color]; libfreenect2::Frame *ir = frames[libfreenect2::Frame::Ir]; libfreenect2::Frame *depth = frames[libfreenect2::Frame::Depth]; cv::imshow("rgb", cv::Mat(rgb->height, rgb->width, CV_8UC3, rgb->data)); cv::imshow("ir", cv::Mat(ir->height, ir->width, CV_32FC1, ir->data) / 20000.0f); cv::imshow("depth", cv::Mat(depth->height, depth->width, CV_32FC1, depth->data) / 4500.0f); int key = cv::waitKey(1); protonect_shutdown = protonect_shutdown || (key > 0 && ((key & 0xFF) == 27)); // shutdown on escape listener.release(frames); //libfreenect2::this_thread::sleep_for(libfreenect2::chrono::milliseconds(100)); } // TODO: restarting ir stream doesn't work! // TODO: bad things will happen, if frame listeners are freed before dev->stop() :( dev->stop(); dev->close(); return 0; }