From 4949a0550c18320ad3b58b4d91bcf9590932758e Mon Sep 17 00:00:00 2001 From: tbochtl Date: Wed, 11 Apr 2018 17:13:50 +0200 Subject: [PATCH 1/3] - added option to run marker tracker in a thread - adjustments for MSVC 2017 --- doc/utql/Vision/MarkerTracker.xml | 18 ++++ .../ChessboardFunctions.cpp | 5 +- src/utVisionComponents/MarkerTracker.cpp | 102 +++++++++++++++++- src/utVisionComponents/MarkerTracker.h | 50 +++++++++ 4 files changed, 173 insertions(+), 2 deletions(-) diff --git a/doc/utql/Vision/MarkerTracker.xml b/doc/utql/Vision/MarkerTracker.xml index 55fa8ce..2990b21 100644 --- a/doc/utql/Vision/MarkerTracker.xml +++ b/doc/utql/Vision/MarkerTracker.xml @@ -95,6 +95,15 @@ + + + + Enables Running the marker tracking in a seperate thread. + + + + + @@ -216,6 +225,15 @@ + + + + Enables Running the marker tracking in a seperate thread. + + + + + diff --git a/src/utVisionComponents/ChessboardFunctions.cpp b/src/utVisionComponents/ChessboardFunctions.cpp index 3646a11..9ce19e3 100644 --- a/src/utVisionComponents/ChessboardFunctions.cpp +++ b/src/utVisionComponents/ChessboardFunctions.cpp @@ -293,7 +293,10 @@ class ChessboardFunctionsComponent } else // m_scaleFactor == 0 { -#if CV_MAJOR_VERSION > 1 && CV_MINOR_VERSION > 2 + +// added DEACTIVATED because of error of cv::Mat constructor +#if CV_MAJOR_VERSION > 1 && CV_MINOR_VERSION > 2 && DEACTIVATED + cv::Mat calib_image( *img, false ); std::vector< cv::Point2f > centers; //( CvPoint2D32f == cv::Point2f ) diff --git a/src/utVisionComponents/MarkerTracker.cpp b/src/utVisionComponents/MarkerTracker.cpp index 86cdab1..38a4b0c 100644 --- a/src/utVisionComponents/MarkerTracker.cpp +++ b/src/utVisionComponents/MarkerTracker.cpp @@ -410,7 +410,15 @@ MarkerTracker::MarkerTracker( const std::string& sName, boost::shared_ptr< Graph , m_bEdgeRefinement( true ) , m_info( 0.06f ) , m_lastTime( 0 ) + , m_State(state_stopped) + , m_pThread(nullptr) + , m_bThreadingEnabled(false) { + if (subgraph->m_DataflowAttributes.hasAttribute("enableThreading")) // enable threading + m_bThreadingEnabled = subgraph->m_DataflowAttributes.getAttributeString("enableThreading") == "true"; + + m_pThread = boost::shared_ptr< boost::thread >(new boost::thread(boost::bind(&MarkerTracker::threadFunction, this))); + // get configuration if( subgraph->hasNode( "Marker" ) ) subgraph->getNode( "Marker" )->getAttributeData( "markerSize", m_info.fSize ); @@ -438,6 +446,44 @@ MarkerTracker::MarkerTracker( const std::string& sName, boost::shared_ptr< Graph LOG4CPP_INFO( logger, "MarkerTracker configuration: edgebased refinement: " << m_bEdgeRefinement << " enableTracking: " << m_info.bEnableTracking << " enablePixelFlow: " << m_info.bEnablePixelFlow << " enableFlipCheck " << m_info.bEnableFlipCheck << " bEnableFastTracking " << m_info.bEnableFastTracking ); } +/*! *************************************************************************** +\brief + +\return void + +\author tbochtl \date 17.11.2017 +******************************************************************************/ +void MarkerTracker::start() +{ + if (m_bThreadingEnabled == false) return; + + boost::mutex::scoped_lock l(m_Mutex); + m_State = state_running; + m_NewEventCondition.notify_all(); +} + +/*! *************************************************************************** +\brief + +\return void + +\author tbochtl \date 17.11.2017 +******************************************************************************/ +void MarkerTracker::stop() +{ + boost::mutex::scoped_lock l(m_Mutex); + if (m_State != state_stopped) + { + // tell thread to stop + m_State = state_stopping; + m_NewEventCondition.notify_all(); + + // wait until thread has actually stopped + while (m_State != state_stopped) + m_NewEventCondition.wait(l); + } +} + bool MarkerTracker::debug() { return m_debugPort.isConnected(); @@ -457,7 +503,61 @@ bool MarkerTracker::useEdgeRefinement() const return m_bEdgeRefinement; } void MarkerTracker::pushImage( const Measurement::ImageMeasurement& m ) - { getModule().trackMarkers( m ); } +{ + if (m_bThreadingEnabled == false) + { + getModule().trackMarkers(m); + } + else + { + boost::mutex::scoped_lock l(m_Mutex); + m_measurement = m; + + m_NewEventCondition.notify_all(); + } +} + +/*! *************************************************************************** +\brief + +\return void + +\author tbochtl \date 15.11.2017 +******************************************************************************/ +void MarkerTracker::threadFunction() +{ + Measurement::ImageMeasurement m; + while (true) + { + if (m_State == state_running && m_measurement.invalid() == false) + { + m_Mutex.lock(); + m = m_measurement; + m.time(m_measurement.time()); + m_measurement = Measurement::ImageMeasurement(); + m_Mutex.unlock(); + getModule().trackMarkers(m); + } + else if (m_State == state_end) + { + return; + } + else if (m_State == state_stopping) + { + // stop and wait for something to happen + m_State = state_stopped; + + // tell other threads we have stopped + m_NewEventCondition.notify_all(); + } + else + { + // wait for something to happen + boost::mutex::scoped_lock l(m_Mutex); + m_NewEventCondition.wait(l); + } + } +} //MultiMarkerTracker MultiMarkerTracker::MultiMarkerTracker( const std::string& sName, boost::shared_ptr< Graph::UTQLSubgraph > subgraph, const IdKey& componentKey, MarkerTrackerModule* pModule ) diff --git a/src/utVisionComponents/MarkerTracker.h b/src/utVisionComponents/MarkerTracker.h index aa23d19..f54771b 100644 --- a/src/utVisionComponents/MarkerTracker.h +++ b/src/utVisionComponents/MarkerTracker.h @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -60,6 +61,31 @@ #include #endif +namespace Ubitrack { + namespace Dataflow { + /** + * \internal + * Defines how to extract the priority out of a data type. + * Specialized for image measurements to reduce the maximum queue length. + */ + template<> + struct EventTypeTraits< Measurement::ImageMeasurement > + { + unsigned long long getPriority(const Measurement::ImageMeasurement& m) const + { + return m.time(); + } + + /** the maximum queue length for images is 1! */ + int getMaxQueueLength() const + { + return 1; + } + }; + + } +} + // get a logger static log4cpp::Category& logger( log4cpp::Category::getInstance( "Ubitrack.Vision.MarkerTracker" ) ); @@ -333,6 +359,10 @@ class MarkerTracker public: MarkerTracker( const std::string& sName, boost::shared_ptr< Graph::UTQLSubgraph > subgraph, const IdKey& componentKey, MarkerTrackerModule* pModule ); + // start and stop functions for all processes + virtual void start(); + virtual void stop(); + /** is the debug port connected? */ bool debug(); @@ -367,6 +397,26 @@ class MarkerTracker // some variables where the module stores information Measurement::Timestamp m_lastTime; + bool m_bThreadingEnabled; + + // temp image for the image queue function (used in threading mode) + Measurement::ImageMeasurement m_measurement; + + // the event dispatching thread + boost::shared_ptr< boost::thread > m_pThread; + + // current state of the event thread + enum { state_running, state_stopping, state_stopped, state_end } m_State; + + // condition variable for thread synchronization + boost::condition m_NewEventCondition; + + // mutex for thread synchronization + boost::mutex m_Mutex; + + // queue thread function + void threadFunction(); + friend class MarkerTrackerModule; }; From 532244cd4ef319c3e7ee967ec670d5c80cc49bea Mon Sep 17 00:00:00 2001 From: "lukas.zielinski" Date: Fri, 1 Mar 2019 09:16:10 +0100 Subject: [PATCH 2/3] (*) changes for opencv 4.0.1 compatibility --- apps/CornerFinder/corners.cpp | 7 ++++--- apps/MarkerBundle/MarkerBundle.cpp | 7 ++++--- src/utVisionComponents/Color2Grayscale.cpp | 2 +- src/utVisionComponents/HomographyEstimator.cpp | 2 +- src/utVisionComponents/ImageFileFrameGrabber.cpp | 2 +- src/utVisionComponents/ImageFileRecorder.cpp | 2 +- src/utVisionComponents/ImageWarpingByHomography.cpp | 2 +- src/utVisionComponents/TextureUpdate.cpp | 2 +- src/utVisionIOComponents/AVIFrameGrabber.cpp | 2 +- src/utVisionIOComponents/HighguiFrameGrabber.cpp | 2 +- src/utVisionIOComponents/ImageIO.cpp | 2 +- src/utVisionIOComponents/NetworkImageSource.cpp | 2 +- 12 files changed, 18 insertions(+), 16 deletions(-) diff --git a/apps/CornerFinder/corners.cpp b/apps/CornerFinder/corners.cpp index c69a7cc..8c80a13 100644 --- a/apps/CornerFinder/corners.cpp +++ b/apps/CornerFinder/corners.cpp @@ -46,8 +46,9 @@ #endif // OpenCV -#include -#include +#include +#include +#include // Ubitrack #include @@ -200,7 +201,7 @@ int main( int, char** ) for ( std::vector< std::string >::iterator itImage = imageNames.begin(); itImage != imageNames.end(); itImage++ ) { - boost::shared_ptr< Vision::Image > pImage( new Vision::Image( cvLoadImage( itImage->c_str(), CV_LOAD_IMAGE_GRAYSCALE ) ) ); + boost::shared_ptr< Vision::Image > pImage( new Vision::Image( cv::imread( itImage->c_str(), cv::IMREAD_GRAYSCALE ) ) ); tmp_name = std::string( itImage-> c_str() ); std::cout << "Bild " << itImage->c_str() << std::endl; diff --git a/apps/MarkerBundle/MarkerBundle.cpp b/apps/MarkerBundle/MarkerBundle.cpp index fe3b710..abd472b 100644 --- a/apps/MarkerBundle/MarkerBundle.cpp +++ b/apps/MarkerBundle/MarkerBundle.cpp @@ -48,7 +48,8 @@ #ifdef _WIN32 #include #endif -#include +#include +#include // Ubitrack @@ -1168,8 +1169,8 @@ int main( int ac, char** av ) baInfo.imageToCam[ *itImage ] = camId; // load image - IplImage* myImage = cvLoadImage( itImage->c_str(), CV_LOAD_IMAGE_GRAYSCALE ); - if( myImage == 0 ){ + cv::Mat myImage = imread( itImage->c_str(), cv::IMREAD_GRAYSCALE); + if( myImage.empty()){ LOG4CPP_ERROR(logger, "Image could not be loaded" << itImage->c_str() << "\n"); continue; } diff --git a/src/utVisionComponents/Color2Grayscale.cpp b/src/utVisionComponents/Color2Grayscale.cpp index 8236660..3aceb7c 100644 --- a/src/utVisionComponents/Color2Grayscale.cpp +++ b/src/utVisionComponents/Color2Grayscale.cpp @@ -47,7 +47,7 @@ #include #include -#include +#include using namespace Ubitrack; using namespace Ubitrack::Vision; diff --git a/src/utVisionComponents/HomographyEstimator.cpp b/src/utVisionComponents/HomographyEstimator.cpp index 6381f54..0ca0357 100644 --- a/src/utVisionComponents/HomographyEstimator.cpp +++ b/src/utVisionComponents/HomographyEstimator.cpp @@ -44,7 +44,7 @@ #include #include -#include +#include #include #include diff --git a/src/utVisionComponents/ImageFileFrameGrabber.cpp b/src/utVisionComponents/ImageFileFrameGrabber.cpp index cd443e2..50cd142 100644 --- a/src/utVisionComponents/ImageFileFrameGrabber.cpp +++ b/src/utVisionComponents/ImageFileFrameGrabber.cpp @@ -46,7 +46,7 @@ #include #include -#include +#include // define macros not present in all OpenCV versions #ifndef CV_LOAD_IMAGE_GRAYSCALE diff --git a/src/utVisionComponents/ImageFileRecorder.cpp b/src/utVisionComponents/ImageFileRecorder.cpp index 433c7bc..27a1cb0 100644 --- a/src/utVisionComponents/ImageFileRecorder.cpp +++ b/src/utVisionComponents/ImageFileRecorder.cpp @@ -55,7 +55,7 @@ #include #include -#include +#include // define macros not present in all OpenCV versions #ifndef CV_LOAD_IMAGE_GRAYSCALE diff --git a/src/utVisionComponents/ImageWarpingByHomography.cpp b/src/utVisionComponents/ImageWarpingByHomography.cpp index 52af57b..591d7f7 100644 --- a/src/utVisionComponents/ImageWarpingByHomography.cpp +++ b/src/utVisionComponents/ImageWarpingByHomography.cpp @@ -44,7 +44,7 @@ #include #include -#include +#include #include static log4cpp::Category& logger( log4cpp::Category::getInstance( "Ubitrack.Vision.ImageWarpingByHomography" ) ); diff --git a/src/utVisionComponents/TextureUpdate.cpp b/src/utVisionComponents/TextureUpdate.cpp index b1ae76b..79abb22 100644 --- a/src/utVisionComponents/TextureUpdate.cpp +++ b/src/utVisionComponents/TextureUpdate.cpp @@ -88,7 +88,7 @@ #endif -#include +#include namespace Ubitrack { namespace Components { diff --git a/src/utVisionIOComponents/AVIFrameGrabber.cpp b/src/utVisionIOComponents/AVIFrameGrabber.cpp index c44ac45..a255ec6 100644 --- a/src/utVisionIOComponents/AVIFrameGrabber.cpp +++ b/src/utVisionIOComponents/AVIFrameGrabber.cpp @@ -45,7 +45,7 @@ #include #include -#include +#include // get a logger static log4cpp::Category& logger( log4cpp::Category::getInstance( "Ubitrack.Vision.AVIFrameGrabber" ) ); diff --git a/src/utVisionIOComponents/HighguiFrameGrabber.cpp b/src/utVisionIOComponents/HighguiFrameGrabber.cpp index 1cfdb32..f8818e8 100644 --- a/src/utVisionIOComponents/HighguiFrameGrabber.cpp +++ b/src/utVisionIOComponents/HighguiFrameGrabber.cpp @@ -45,7 +45,7 @@ #include #include -#include +#include // get a logger static log4cpp::Category& logger( log4cpp::Category::getInstance( "Ubitrack.Vision.HighguiFrameGrabber" ) ); diff --git a/src/utVisionIOComponents/ImageIO.cpp b/src/utVisionIOComponents/ImageIO.cpp index cac24bd..12c0248 100644 --- a/src/utVisionIOComponents/ImageIO.cpp +++ b/src/utVisionIOComponents/ImageIO.cpp @@ -56,7 +56,7 @@ #include #include -#include +#include using namespace Ubitrack; using namespace Ubitrack::Vision; diff --git a/src/utVisionIOComponents/NetworkImageSource.cpp b/src/utVisionIOComponents/NetworkImageSource.cpp index 860d7d1..8546e9b 100644 --- a/src/utVisionIOComponents/NetworkImageSource.cpp +++ b/src/utVisionIOComponents/NetworkImageSource.cpp @@ -47,7 +47,7 @@ #include -#include +#include #include static log4cpp::Category& logger( log4cpp::Category::getInstance( "Drivers.NetworkSource" ) ); From ca12ba9594f17ddb1c1b687289705dc08807b6e8 Mon Sep 17 00:00:00 2001 From: Mario Marschner Date: Mon, 4 Mar 2019 14:22:09 +0100 Subject: [PATCH 3/3] Revert "(*) changes for opencv 4.0.1 compatibility" This reverts commit 532244cd4ef319c3e7ee967ec670d5c80cc49bea. --- apps/CornerFinder/corners.cpp | 7 +++---- apps/MarkerBundle/MarkerBundle.cpp | 7 +++---- src/utVisionComponents/Color2Grayscale.cpp | 2 +- src/utVisionComponents/HomographyEstimator.cpp | 2 +- src/utVisionComponents/ImageFileFrameGrabber.cpp | 2 +- src/utVisionComponents/ImageFileRecorder.cpp | 2 +- src/utVisionComponents/ImageWarpingByHomography.cpp | 2 +- src/utVisionComponents/TextureUpdate.cpp | 2 +- src/utVisionIOComponents/AVIFrameGrabber.cpp | 2 +- src/utVisionIOComponents/HighguiFrameGrabber.cpp | 2 +- src/utVisionIOComponents/ImageIO.cpp | 2 +- src/utVisionIOComponents/NetworkImageSource.cpp | 2 +- 12 files changed, 16 insertions(+), 18 deletions(-) diff --git a/apps/CornerFinder/corners.cpp b/apps/CornerFinder/corners.cpp index 8c80a13..c69a7cc 100644 --- a/apps/CornerFinder/corners.cpp +++ b/apps/CornerFinder/corners.cpp @@ -46,9 +46,8 @@ #endif // OpenCV -#include -#include -#include +#include +#include // Ubitrack #include @@ -201,7 +200,7 @@ int main( int, char** ) for ( std::vector< std::string >::iterator itImage = imageNames.begin(); itImage != imageNames.end(); itImage++ ) { - boost::shared_ptr< Vision::Image > pImage( new Vision::Image( cv::imread( itImage->c_str(), cv::IMREAD_GRAYSCALE ) ) ); + boost::shared_ptr< Vision::Image > pImage( new Vision::Image( cvLoadImage( itImage->c_str(), CV_LOAD_IMAGE_GRAYSCALE ) ) ); tmp_name = std::string( itImage-> c_str() ); std::cout << "Bild " << itImage->c_str() << std::endl; diff --git a/apps/MarkerBundle/MarkerBundle.cpp b/apps/MarkerBundle/MarkerBundle.cpp index abd472b..fe3b710 100644 --- a/apps/MarkerBundle/MarkerBundle.cpp +++ b/apps/MarkerBundle/MarkerBundle.cpp @@ -48,8 +48,7 @@ #ifdef _WIN32 #include #endif -#include -#include +#include // Ubitrack @@ -1169,8 +1168,8 @@ int main( int ac, char** av ) baInfo.imageToCam[ *itImage ] = camId; // load image - cv::Mat myImage = imread( itImage->c_str(), cv::IMREAD_GRAYSCALE); - if( myImage.empty()){ + IplImage* myImage = cvLoadImage( itImage->c_str(), CV_LOAD_IMAGE_GRAYSCALE ); + if( myImage == 0 ){ LOG4CPP_ERROR(logger, "Image could not be loaded" << itImage->c_str() << "\n"); continue; } diff --git a/src/utVisionComponents/Color2Grayscale.cpp b/src/utVisionComponents/Color2Grayscale.cpp index 3aceb7c..8236660 100644 --- a/src/utVisionComponents/Color2Grayscale.cpp +++ b/src/utVisionComponents/Color2Grayscale.cpp @@ -47,7 +47,7 @@ #include #include -#include +#include using namespace Ubitrack; using namespace Ubitrack::Vision; diff --git a/src/utVisionComponents/HomographyEstimator.cpp b/src/utVisionComponents/HomographyEstimator.cpp index 0ca0357..6381f54 100644 --- a/src/utVisionComponents/HomographyEstimator.cpp +++ b/src/utVisionComponents/HomographyEstimator.cpp @@ -44,7 +44,7 @@ #include #include -#include +#include #include #include diff --git a/src/utVisionComponents/ImageFileFrameGrabber.cpp b/src/utVisionComponents/ImageFileFrameGrabber.cpp index 50cd142..cd443e2 100644 --- a/src/utVisionComponents/ImageFileFrameGrabber.cpp +++ b/src/utVisionComponents/ImageFileFrameGrabber.cpp @@ -46,7 +46,7 @@ #include #include -#include +#include // define macros not present in all OpenCV versions #ifndef CV_LOAD_IMAGE_GRAYSCALE diff --git a/src/utVisionComponents/ImageFileRecorder.cpp b/src/utVisionComponents/ImageFileRecorder.cpp index 27a1cb0..433c7bc 100644 --- a/src/utVisionComponents/ImageFileRecorder.cpp +++ b/src/utVisionComponents/ImageFileRecorder.cpp @@ -55,7 +55,7 @@ #include #include -#include +#include // define macros not present in all OpenCV versions #ifndef CV_LOAD_IMAGE_GRAYSCALE diff --git a/src/utVisionComponents/ImageWarpingByHomography.cpp b/src/utVisionComponents/ImageWarpingByHomography.cpp index 591d7f7..52af57b 100644 --- a/src/utVisionComponents/ImageWarpingByHomography.cpp +++ b/src/utVisionComponents/ImageWarpingByHomography.cpp @@ -44,7 +44,7 @@ #include #include -#include +#include #include static log4cpp::Category& logger( log4cpp::Category::getInstance( "Ubitrack.Vision.ImageWarpingByHomography" ) ); diff --git a/src/utVisionComponents/TextureUpdate.cpp b/src/utVisionComponents/TextureUpdate.cpp index 79abb22..b1ae76b 100644 --- a/src/utVisionComponents/TextureUpdate.cpp +++ b/src/utVisionComponents/TextureUpdate.cpp @@ -88,7 +88,7 @@ #endif -#include +#include namespace Ubitrack { namespace Components { diff --git a/src/utVisionIOComponents/AVIFrameGrabber.cpp b/src/utVisionIOComponents/AVIFrameGrabber.cpp index a255ec6..c44ac45 100644 --- a/src/utVisionIOComponents/AVIFrameGrabber.cpp +++ b/src/utVisionIOComponents/AVIFrameGrabber.cpp @@ -45,7 +45,7 @@ #include #include -#include +#include // get a logger static log4cpp::Category& logger( log4cpp::Category::getInstance( "Ubitrack.Vision.AVIFrameGrabber" ) ); diff --git a/src/utVisionIOComponents/HighguiFrameGrabber.cpp b/src/utVisionIOComponents/HighguiFrameGrabber.cpp index f8818e8..1cfdb32 100644 --- a/src/utVisionIOComponents/HighguiFrameGrabber.cpp +++ b/src/utVisionIOComponents/HighguiFrameGrabber.cpp @@ -45,7 +45,7 @@ #include #include -#include +#include // get a logger static log4cpp::Category& logger( log4cpp::Category::getInstance( "Ubitrack.Vision.HighguiFrameGrabber" ) ); diff --git a/src/utVisionIOComponents/ImageIO.cpp b/src/utVisionIOComponents/ImageIO.cpp index 12c0248..cac24bd 100644 --- a/src/utVisionIOComponents/ImageIO.cpp +++ b/src/utVisionIOComponents/ImageIO.cpp @@ -56,7 +56,7 @@ #include #include -#include +#include using namespace Ubitrack; using namespace Ubitrack::Vision; diff --git a/src/utVisionIOComponents/NetworkImageSource.cpp b/src/utVisionIOComponents/NetworkImageSource.cpp index 8546e9b..860d7d1 100644 --- a/src/utVisionIOComponents/NetworkImageSource.cpp +++ b/src/utVisionIOComponents/NetworkImageSource.cpp @@ -47,7 +47,7 @@ #include -#include +#include #include static log4cpp::Category& logger( log4cpp::Category::getInstance( "Drivers.NetworkSource" ) );