From 6cfa9e776c49af0d822fd150232c26d61395d2da Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Fri, 13 May 2016 00:12:08 +0100 Subject: [PATCH] Add optical flow module based on the optflow module of OpenCV --- CMakeLists.txt | 3 + modules/CMakeLists.txt | 8 +- ...pticalFlowDualTVL1.cpp => OpticalFlow.cpp} | 98 +++++++++++++++---- .../{OpticalFlowDualTVL1.h => OpticalFlow.h} | 58 ++++++++--- 4 files changed, 135 insertions(+), 32 deletions(-) rename modules/{OpticalFlowDualTVL1.cpp => OpticalFlow.cpp} (67%) rename modules/{OpticalFlowDualTVL1.h => OpticalFlow.h} (59%) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc46035..5520cc8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,9 +94,12 @@ ENDIF(DOXYGEN_FOUND) SET_PACKAGE_PROPERTIES(Doxygen PROPERTIES URL "http://www.doxygen.org/" DESCRIPTION "Doxygen" TYPE OPTIONAL) OPTION( USE_OPENCV "Add OpenCV support" ON ) +SET( OPENCV_OPTFLOW_FOUND OFF ) IF( USE_OPENCV ) FIND_PACKAGE( OpenCV ) SET(USE_OPENCV ${OpenCV_FOUND}) + ## Check + LIST(FIND OpenCV_LIB_COMPONENTS opencv_optflow OpenCV_optflow_FOUND) ENDIF() SET_PACKAGE_PROPERTIES(OpenCV PROPERTIES URL "http://opencv.willowgarage.com" DESCRIPTION "OpenCV library support in PlaYUVerFrame" TYPE OPTIONAL) diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index ed2b6ca..ccdfdcf 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -40,8 +40,12 @@ ADD_MODULE( EightBitsSampling "EightBitsSampling" ) ADD_MODULE( FrameCrop "FrameCrop" ) ADD_MODULE( LumaAverage "LumaAverage" ) ADD_MODULE( WeightedPSNR "WeightedPSNR" ) -IF( USE_OPENCV ) - ADD_MODULE( OpticalFlowDualTVL1 "OpticalFlowDualTVL1" ) +IF( OpenCV_FOUND ) + IF( OPENCV_OPTFLOW_FOUND ) + ADD_MODULE( OpticalFlowDualTVL1 "OpticalFlow" ) + ADD_MODULE( OpticalFlowSparseToDense "OpticalFlow" ) + ADD_MODULE( OpticalFlowFarneback "OpticalFlow" ) + ENDIF() ADD_MODULE( DisparityStereoBM "DisparityStereoBM" ) ADD_MODULE( DisparityStereoSGBM "DisparityStereoSGBM" ) #ADD_MODULE( DisparityStereoVar "DisparityStereoVar" ) diff --git a/modules/OpticalFlowDualTVL1.cpp b/modules/OpticalFlow.cpp similarity index 67% rename from modules/OpticalFlowDualTVL1.cpp rename to modules/OpticalFlow.cpp index bd619b8..76d2f5d 100644 --- a/modules/OpticalFlowDualTVL1.cpp +++ b/modules/OpticalFlow.cpp @@ -18,13 +18,22 @@ */ /** - * \file OpticalFlowDualTVL1.cpp - * \brief Absolute Frame Difference module + * \file OpticalFlow.cpp + * \brief Modules to measure optical flow */ -#include "OpticalFlowDualTVL1.h" +// Own +#include "OpticalFlow.h" + +// System #include +// Opencv +#include +#include +#include +#include + using cv::Scalar; using cv::Mat; using cv::Mat_; @@ -32,14 +41,13 @@ using cv::Ptr; using cv::Point; using cv::Point2f; -OpticalFlowDualTVL1::OpticalFlowDualTVL1() + +OpticalFlowModule::OpticalFlowModule() { /* Module Definition */ m_iModuleAPI = MODULE_API_2; m_iModuleType = FRAME_PROCESSING_MODULE; - m_pchModuleCategory = "Measurements"; - m_pchModuleName = "OpticalFlowDualTVL1"; - m_pchModuleTooltip = "Measure optical flow"; + m_pchModuleCategory = "OpticalFlow"; m_uiNumberOfFrames = MODULE_REQUIRES_TWO_FRAMES; m_uiModuleRequirements = MODULE_REQUIRES_SKIP_WHILE_PLAY | MODULE_REQUIRES_NEW_WINDOW | MODULE_REQUIRES_OPTIONS; @@ -51,7 +59,7 @@ OpticalFlowDualTVL1::OpticalFlowDualTVL1() } -Bool OpticalFlowDualTVL1::create( std::vector apcFrameList ) +Bool OpticalFlowModule::commonCreate( std::vector apcFrameList ) { _BASIC_MODULE_API_2_CHECK_ @@ -60,7 +68,6 @@ Bool OpticalFlowDualTVL1::create( std::vector apcFrameList ) return false; m_iStep = 16; - m_cTvl1 = cv::createOptFlow_DualTVL1(); m_pcOutputFrame = new PlaYUVerFrame( apcFrameList[0]->getWidth(), apcFrameList[0]->getHeight(), PlaYUVerFrame::GRAY ); return true; @@ -71,7 +78,7 @@ static inline bool isFlowCorrect( Point2f u ) return !cvIsNaN( u.x ) && !cvIsNaN( u.y ) && fabs( u.x ) < 1e9 && fabs( u.y ) < 1e9; } -Void OpticalFlowDualTVL1::drawFlow() +Void OpticalFlowModule::drawFlow() { Mat cvMatAfter; m_pcFrameAfter->toMat( cvMatAfter, true ); @@ -105,7 +112,7 @@ Void OpticalFlowDualTVL1::drawFlow() m_pcOutputFrame->fromMat( cvMatAfter ); } -Void OpticalFlowDualTVL1::compensateFlow() +Void OpticalFlowModule::compensateFlow() { for( UInt c = 0; c < m_pcOutputFrame->getNumberChannels(); c++ ) { @@ -125,7 +132,7 @@ Void OpticalFlowDualTVL1::compensateFlow() } } -PlaYUVerFrame* OpticalFlowDualTVL1::process( std::vector apcFrameList ) +PlaYUVerFrame* OpticalFlowModule::process( std::vector apcFrameList ) { m_pcFrameAfter = apcFrameList[0]; m_pcFramePrev = apcFrameList[1]; @@ -136,18 +143,75 @@ PlaYUVerFrame* OpticalFlowDualTVL1::process( std::vector apcFram return m_pcOutputFrame; } - m_cTvl1->calc( cvMatPrev, cvMatAfter, m_cvFlow ); -// drawFlow(); - compensateFlow(); + m_cOpticalFlow->calc( cvMatAfter, cvMatPrev, m_cvFlow ); + if( m_bShowReconstruction ) + compensateFlow(); + else + drawFlow(); return m_pcOutputFrame; } -Void -OpticalFlowDualTVL1::destroy() +Void OpticalFlowModule::destroy() { if( m_pcOutputFrame ) delete m_pcOutputFrame; m_pcOutputFrame = NULL; +// if( m_cOpticalFlow ) +// delete m_cOpticalFlow; + } +OpticalFlowDualTVL1::OpticalFlowDualTVL1() +{ + /* Module Definition */ + m_pchModuleName = "OpticalFlowDualTVL1"; + m_pchModuleTooltip = "Measure optical flow using DualTVL1 method"; + +} + +Bool OpticalFlowDualTVL1::create( std::vector apcFrameList ) +{ + Bool bRet = commonCreate( apcFrameList ); + if( !bRet ) + return bRet; + m_cOpticalFlow = cv::createOptFlow_DualTVL1(); + return bRet; +} + +OpticalFlowSparseToDense::OpticalFlowSparseToDense() +{ + /* Module Definition */ + m_pchModuleName = "OpticalFlowSparseToDense"; + m_pchModuleTooltip = "Measure optical flow using SparseToDense method"; + +} + +Bool OpticalFlowSparseToDense::create( std::vector apcFrameList ) +{ + Bool bRet = commonCreate( apcFrameList ); + if( !bRet ) + return bRet; + m_cOpticalFlow = cv::optflow::createOptFlow_SparseToDense(); + return bRet; +} + +OpticalFlowFarneback::OpticalFlowFarneback() +{ + /* Module Definition */ + m_pchModuleName = "OpticalFlowFarneback"; + m_pchModuleTooltip = "Measure optical flow using Farneback method"; + +} + +Bool OpticalFlowFarneback::create( std::vector apcFrameList ) +{ + Bool bRet = commonCreate( apcFrameList ); + if( !bRet ) + return bRet; + m_cOpticalFlow = cv::optflow::createOptFlow_Farneback(); + return bRet; +} + + + diff --git a/modules/OpticalFlowDualTVL1.h b/modules/OpticalFlow.h similarity index 59% rename from modules/OpticalFlowDualTVL1.h rename to modules/OpticalFlow.h index eb7c012..c008419 100644 --- a/modules/OpticalFlowDualTVL1.h +++ b/modules/OpticalFlow.h @@ -18,43 +18,75 @@ */ /** - * \file OpticalFlowDualTVL1.h - * \brief Absolute Frame Difference module + * \file OpticalFlow.h + * \brief Modules to measure optical flow */ #ifndef __OPTICALFLOWDUALTVL1_H__ #define __OPTICALFLOWDUALTVL1_H__ -#include +// OpenCV +#include +#include +// PlaYUVerLib #include "lib/PlaYUVerModuleIf.h" -class OpticalFlowDualTVL1: public PlaYUVerModuleIf +class OpticalFlowModule: public PlaYUVerModuleIf { -REGISTER_CLASS_FACTORY( OpticalFlowDualTVL1 ) - -private: +protected: Bool m_bShowReconstruction; Int m_iStep; - cv::Ptr m_cTvl1; + cv::Ptr m_cOpticalFlow; cv::Mat_ m_cvFlow; PlaYUVerFrame* m_pcFramePrev; PlaYUVerFrame* m_pcFrameAfter; PlaYUVerFrame* m_pcOutputFrame; - Void drawFlow(); Void compensateFlow(); + Bool commonCreate( std::vector apcFrameList ); +public: + OpticalFlowModule(); + virtual ~OpticalFlowModule() + { + } + PlaYUVerFrame* process( std::vector apcFrameList ); + Void destroy(); +}; + +class OpticalFlowDualTVL1: public OpticalFlowModule +{ + REGISTER_CLASS_FACTORY( OpticalFlowDualTVL1 ) public: OpticalFlowDualTVL1(); virtual ~OpticalFlowDualTVL1() { } Bool create( std::vector apcFrameList ); - PlaYUVerFrame* process( std::vector apcFrameList ); - Void destroy(); - }; -#endif // __OPTICALFLOWDUALTVL1_H__ +class OpticalFlowSparseToDense: public OpticalFlowModule +{ + REGISTER_CLASS_FACTORY( OpticalFlowSparseToDense ) +public: + OpticalFlowSparseToDense(); + virtual ~OpticalFlowSparseToDense() + { + } + Bool create( std::vector apcFrameList ); +}; + +class OpticalFlowFarneback: public OpticalFlowModule +{ + REGISTER_CLASS_FACTORY( OpticalFlowFarneback ) +public: + OpticalFlowFarneback(); + virtual ~OpticalFlowFarneback() + { + } + Bool create( std::vector apcFrameList ); +}; + +#endif // __OPTICALFLOW_H__