private static int TutorialApiCpp() { try { OpenPose.Log("Starting OpenPose demo...", Priority.High); using (var opTimer = OpenPose.GetTimerInit()) { // OpenPose wrapper OpenPose.Log("Configuring OpenPose...", Priority.High); using (var opWrapper = new Wrapper <Datum>()) { ConfigureWrapper(opWrapper); // Start, run, and stop processing - exec() blocks this thread until OpenPose wrapper has finished OpenPose.Log("Starting thread(s)...", Priority.High); opWrapper.Exec(); } // Measuring total time OpenPose.PrintTime(opTimer, "OpenPose demo successfully finished. Total time: ", " seconds.", Priority.High); } // Return return(0); } catch (Exception) { return(-1); } }
private static int TutorialApiCpp() { try { OpenPose.Log("Starting OpenPose demo...", Priority.High); using (var opTimer = OpenPose.GetTimerInit()) { // Configuring OpenPose OpenPose.Log("Configuring OpenPose...", Priority.High); using (var opWrapper = new Wrapper <Datum>(ThreadManagerMode.AsynchronousOut)) { ConfigureWrapper(opWrapper); // Start, run, and stop processing - exec() blocks this thread until OpenPose wrapper has finished OpenPose.Log("Starting thread(s)...", Priority.High); opWrapper.Start(); // User processing var userOutputClass = new UserOutputClass(); var userWantsToExit = false; while (!userWantsToExit) { // Pop frame if (opWrapper.WaitAndPop(out var datumProcessed)) { if (!Flags.NoDisplay) { userWantsToExit = userOutputClass.Display(datumProcessed); } userOutputClass.PrintKeyPoints(datumProcessed); datumProcessed.Dispose(); } // If OpenPose finished reading images else if (!opWrapper.IsRunning) { break; } // Something else happened else { OpenPose.Log("Processed datum could not be emplaced.", Priority.High); } } OpenPose.Log("Stopping thread(s)", Priority.High); opWrapper.Stop(); // Measuring total time OpenPose.PrintTime(opTimer, "OpenPose demo successfully finished. Total time: ", " seconds.", Priority.High); } } // Return return(0); } catch (Exception) { return(-1); } }
private static int TutorialAddModule1() { try { OpenPose.Log("Starting OpenPose demo...", Priority.High); using (var opTimer = OpenPose.GetTimerInit()) { // Configuring OpenPose OpenPose.Log("Configuring OpenPose...", Priority.High); using (var opWrapperT = new Wrapper <CustomDatum>()) { ConfigureWrapper(opWrapperT); OpenPose.Log("Starting thread(s)...", Priority.High); // Start, run & stop threads - it blocks this thread until all others have finished opWrapperT.Exec(); // Measuring total time OpenPose.PrintTime(opTimer, "OpenPose demo successfully finished. Total time: ", " seconds.", Priority.High); } } // Return successful message return(0); } catch (Exception) { return(-1); } }
private static int TutorialApiCpp() { try { OpenPose.Log("Starting OpenPose demo...", Priority.High); using (var opTimer = OpenPose.GetTimerInit()) { // Configuring OpenPose OpenPose.Log("Configuring OpenPose...", Priority.High); using (var opWrapper = new Wrapper <Datum>(ThreadManagerMode.AsynchronousIn)) { ConfigureWrapper(opWrapper); // Start, run, and stop processing - exec() blocks this thread until OpenPose wrapper has finished OpenPose.Log("Starting thread(s)...", Priority.High); opWrapper.Start(); // User processing var userInputClass = new UserInputClass(Flags.ImageDir); var userWantsToExit = false; while (!userWantsToExit && !userInputClass.IsFinished()) { // Push frame using (var datumToProcess = userInputClass.CreateDatum()) { if (datumToProcess != null) { var successfullyEmplaced = opWrapper.WaitAndEmplace(datumToProcess); if (!successfullyEmplaced) { OpenPose.Log("Processed datum could not be emplaced.", Priority.High); } } } } OpenPose.Log("Stopping thread(s)", Priority.High); opWrapper.Stop(); } // Measuring total time OpenPose.PrintTime(opTimer, "OpenPose demo successfully finished. Total time: ", " seconds.", Priority.High); } // Return return(0); } catch (Exception) { return(-1); } }
private static int OpenPoseTutorialThread2() { try { OpenPose.Log("Starting OpenPose demo...", Priority.High); using (var opTimer = OpenPose.GetTimerInit()) { // ------------------------- INITIALIZATION ------------------------- // Step 1 - Set logging level // - 0 will output all the logging messages // - 255 will output nothing OpenPose.CheckBool(0 <= Flags.LoggingLevel && Flags.LoggingLevel <= 255, "Wrong logging_level value."); ConfigureLog.PriorityThreshold = (Priority)Flags.LoggingLevel; // Step 2 - Setting thread workers && manage using (var threadManager = new ThreadManager <UserDatum>()) { // Step 3 - Initializing the worker classes // Frames producer (e.g., video, webcam, ...) using (var wUserInput = new StdSharedPtr <UserWorkerProducer <UserDatum> >(new WUserInput(Flags.ImageDir))) { // Processing using (var wUserProcessing = new StdSharedPtr <UserWorker <UserDatum> >(new WUserPostProcessing())) { // GUI (Display) using (var wUserOutput = new StdSharedPtr <UserWorkerConsumer <UserDatum> >(new WUserOutput())) { // ------------------------- CONFIGURING THREADING ------------------------- // In this simple multi-thread example, we will do the following: // 3 (virtual) queues: 0, 1, 2 // 1 real queue: 1. The first and last queue ids (in this case 0 and 2) are not actual queues, but the // beginning and end of the processing sequence // 2 threads: 0, 1 // wUserInput will generate frames (there is no real queue 0) and push them on queue 1 // wGui will pop frames from queue 1 and process them (there is no real queue 2) var threadId = 0UL; var queueIn = 0UL; var queueOut = 1UL; threadManager.Add(threadId++, wUserInput, queueIn++, queueOut++); // Thread 0, queues 0 -> 1 threadManager.Add(threadId++, wUserProcessing, queueIn++, queueOut++); // Thread 1, queues 1 -> 2 threadManager.Add(threadId++, wUserOutput, queueIn++, queueOut++); // Thread 2, queues 2 -> 3 // ------------------------- STARTING AND STOPPING THREADING ------------------------- OpenPose.Log("Starting thread(s)...", Priority.High); // Two different ways of running the program on multithread environment // Option a) Using the main thread (this thread) for processing (it saves 1 thread, recommended) threadManager.Exec(); // Option b) Giving to the user the control of this thread // // VERY IMPORTANT NOTE: if OpenCV is compiled with Qt support, this option will not work. Qt needs the main // // thread to plot visual results, so the final GUI (which uses OpenCV) would return an exception similar to: // // `QMetaMethod::invoke: Unable to invoke methods with return values in queued connections` // // Start threads // threadManager.start(); // // Keep program alive while running threads. Here the user could perform any other desired function // while (threadManager.isRunning()) // std::this_thread::sleep_for(std::chrono::milliseconds{33}); // // Stop and join threads // op::log("Stopping thread(s)", op::Priority::High); // threadManager.stop(); } } } } // Measuring total time OpenPose.PrintTime(opTimer, "OpenPose demo successfully finished. Total time: ", " seconds.", Priority.High); } // Return return(0); } catch (Exception e) { OpenPose.Error(e.Message, -1, nameof(OpenPoseTutorialThread2)); return(-1); } }
private static int TutorialDeveloperThread1() { try { OpenPose.Log("Starting OpenPose demo...", Priority.High); using (var opTimer = OpenPose.GetTimerInit()) { // ------------------------- INITIALIZATION ------------------------- // Step 1 - Set logging level // - 0 will output all the logging messages // - 255 will output nothing OpenPose.CheckBool(0 <= Flags.LoggingLevel && Flags.LoggingLevel <= 255, "Wrong logging_level value."); ConfigureLog.PriorityThreshold = (Priority)Flags.LoggingLevel; // Step 2 - Read GFlags (user defined configuration) // cameraSize var cameraSize = OpenPose.FlagsToPoint(Flags.CameraResolution, "-1x-1"); // outputSize var outputSize = OpenPose.FlagsToPoint(Flags.OutputResolution, "-1x-1"); // producerType var tie = OpenPose.FlagsToProducer(Flags.ImageDir, Flags.Video, Flags.IpCamera, Flags.Camera, Flags.FlirCamera, Flags.FlirCameraIndex); var producerType = tie.Item1; var producerString = tie.Item2; var displayProducerFpsMode = Flags.ProcessRealTime ? ProducerFpsMode.OriginalFps : ProducerFpsMode.RetrievalFps; using (var producerSharedPtr = OpenPose.CreateProducer(producerType, cameraSize, producerString, Flags.CameraParameterPath, Flags.FrameUndistort, Flags.Views3D)) { producerSharedPtr.Get().SetProducerFpsMode(displayProducerFpsMode); OpenPose.Log("", Priority.Low); // Step 3 - Setting producer //var videoSeekSharedPtr = std::make_shared<std::pair<std::atomic<bool>, std::atomic<int>>>(); //videoSeekSharedPtr->first = false; //videoSeekSharedPtr->second = 0; // Step 4 - Setting thread workers && manager // Note: // nativeDebugging may occur crash using (var threadManager = new ThreadManager <Datum>()) { // Step 5 - Initializing the worker classes // Frames producer (e.g., video, webcam, ...) using (var datumProducer = new StdSharedPtr <DatumProducer <Datum> >(new DatumProducer <Datum>(producerSharedPtr))) using (var wDatumProducer = new StdSharedPtr <WDatumProducer <Datum> >(new WDatumProducer <Datum>(datumProducer))) { // Specific WUserClass using (var wUserClass = new StdSharedPtr <UserWorker <Datum> >(new WUserClass())) { // GUI (Display) using (var gui = new StdSharedPtr <Gui>(new Gui(outputSize, Flags.FullScreen, threadManager.GetIsRunningSharedPtr()))) using (var wGui = new StdSharedPtr <WGui <Datum> >(new WGui <Datum>(gui))) { // ------------------------- CONFIGURING THREADING ------------------------- // In this simple multi-thread example, we will do the following: // 3 (virtual) queues: 0, 1, 2 // 1 real queue: 1. The first and last queue ids (in this case 0 and 2) are not actual queues, but the // beginning and end of the processing sequence // 2 threads: 0, 1 // wDatumProducer will generate frames (there is no real queue 0) and push them on queue 1 // wGui will pop frames from queue 1 and process them (there is no real queue 2) var threadId = 0UL; var queueIn = 0UL; var queueOut = 1UL; threadManager.Add(threadId++, wDatumProducer, queueIn++, queueOut++); // Thread 0, queues 0 -> 1 threadManager.Add(threadId++, wUserClass, queueIn++, queueOut++); // Thread 1, queues 1 -> 2 threadManager.Add(threadId++, wGui, queueIn++, queueOut++); // Thread 2, queues 2 -> 3 // Equivalent single-thread version // const auto threadId = 0ull; // auto queueIn = 0ull; // auto queueOut = 1ull; // threadManager.add(threadId, wDatumProducer, queueIn++, queueOut++); // Thread 0, queues 0 -> 1 // threadManager.add(threadId, wUserClass, queueIn++, queueOut++); // Thread 1, queues 1 -> 2 // threadManager.add(threadId, wGui, queueIn++, queueOut++); // Thread 2, queues 2 -> 3 // Smart multi-thread version // Assume wUser is the slowest process, and that wDatumProducer + wGui is faster than wGui itself, // then, we can group the last 2 in the same thread and keep wGui in a different thread: // const auto threadId = 0ull; // auto queueIn = 0ull; // auto queueOut = 1ull; // threadManager.add(threadId, wDatumProducer, queueIn++, queueOut++); // Thread 0, queues 0 -> 1 // threadManager.add(threadId+1, wUserClass, queueIn++, queueOut++); // Thread 1, queues 1 -> 2 // threadManager.add(threadId, wGui, queueIn++, queueOut++); // Thread 0, queues 2 -> 3 // ------------------------- STARTING AND STOPPING THREADING ------------------------- OpenPose.Log("Starting thread(s)...", Priority.High); // Two different ways of running the program on multithread environment // Option a) Using the main thread (this thread) for processing (it saves 1 thread, recommended) threadManager.Exec(); // Option b) Giving to the user the control of this thread // // VERY IMPORTANT NOTE: if OpenCV is compiled with Qt support, this option will not work. Qt needs the main // // thread to plot visual results, so the final GUI (which uses OpenCV) would return an exception similar to: // // `QMetaMethod::invoke: Unable to invoke methods with return values in queued connections` // // Start threads // threadManager.start(); // // Keep program alive while running threads. Here the user could perform any other desired function // while (threadManager.isRunning()) // std::this_thread::sleep_for(std::chrono::milliseconds{33}); // // Stop and join threads // op::log("Stopping thread(s)", op::Priority::High); // threadManager.stop(); } } } } } // Measuring total time OpenPose.PrintTime(opTimer, "OpenPose demo successfully finished. Total time: ", " seconds.", Priority.High); } // Return return(0); } catch (Exception e) { OpenPose.Error(e.Message, -1, nameof(TutorialDeveloperThread1)); return(-1); } }