diff --git a/modules/AbsoluteFrameDifference.cpp b/modules/AbsoluteFrameDifference.cpp new file mode 100644 index 0000000..44b4eeb --- /dev/null +++ b/modules/AbsoluteFrameDifference.cpp @@ -0,0 +1,77 @@ +/* This file is a part of plaYUVer project + * Copyright (C) 2014 by Luis Lucas (luisfrlucas@gmail.com) + * Joao Carreira (jfmcarreira@gmail.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/** + * \file AbsoluteFrameDifference.cpp + * \brief Absolute Frame Difference module + */ + +#include "AbsoluteFrameDifference.h" + +namespace plaYUVer +{ + +static PlaYUVerModuleDefinition AbsoluteFrameDifferenceDef = +{ + FRAME_PROCESSING_MODULE, + "Measurements", + "AbsoluteFrameDifference", + "Measure the absolute difference between two images (Y plane), e. g., abs( Y1 - Y2 )", + MODULE_REQUIRES_TWO_FRAMES, + MODULE_REQUIRES_NEW_WINDOW, + APPLY_WHILE_PLAYING, +}; + +AbsoluteFrameDifference::AbsoluteFrameDifference() +{ + m_pcFrameDifference = NULL; + setModuleDefinition( AbsoluteFrameDifferenceDef ); +} + +Void AbsoluteFrameDifference::create( PlaYUVerFrame* Input ) +{ + m_pcFrameDifference = new PlaYUVerFrame( Input->getWidth(), Input->getHeight(), PlaYUVerFrame::GRAY ); +} + +PlaYUVerFrame* AbsoluteFrameDifference::process( PlaYUVerFrame* Input1, PlaYUVerFrame* Input2 ) +{ + Pel* pInput1PelYUV = Input1->getPelBufferYUV()[0][0]; + Pel* pInput2PelYUV = Input2->getPelBufferYUV()[0][0]; + Pel* pOutputPelYUV = m_pcFrameDifference->getPelBufferYUV()[0][0]; + Int aux_pel_1, aux_pel_2; + + for( UInt y = 0; y < m_pcFrameDifference->getHeight(); y++ ) + for( UInt x = 0; x < m_pcFrameDifference->getWidth(); x++ ) + { + aux_pel_1 = *pInput1PelYUV++; + aux_pel_2 = *pInput2PelYUV++; + *pOutputPelYUV++ = abs( aux_pel_1 - aux_pel_2 ); + } + return m_pcFrameDifference; +} + +Void AbsoluteFrameDifference::destroy() +{ + if( m_pcFrameDifference ) + delete m_pcFrameDifference; + m_pcFrameDifference = NULL; +} + +} // NAMESPACE + diff --git a/modules/AbsoluteFrameDifference.h b/modules/AbsoluteFrameDifference.h new file mode 100644 index 0000000..4360790 --- /dev/null +++ b/modules/AbsoluteFrameDifference.h @@ -0,0 +1,54 @@ +/* This file is a part of plaYUVer project + * Copyright (C) 2014 by Luis Lucas (luisfrlucas@gmail.com) + * Joao Carreira (jfmcarreira@gmail.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/** + * \file AbsoluteFrameDifference.h + * \brief Absolute Frame Difference module + */ + +#ifndef __ABSOLUTEFRAMEDIFFERENCE_H__ +#define __ABSOLUTEFRAMEDIFFERENCE_H__ + +#include "PlaYUVerModuleIf.h" + +#include + +namespace plaYUVer +{ + +class AbsoluteFrameDifference: public PlaYUVerModuleIf +{ +private: + PlaYUVerFrame* m_pcFrameDifference; + +public: + AbsoluteFrameDifference(); + virtual ~AbsoluteFrameDifference() + { + } + Void create( PlaYUVerFrame* Input ); + PlaYUVerFrame* process( PlaYUVerFrame* Input1, PlaYUVerFrame* Input2 ); + Void destroy(); + +}; + +} // NAMESPACE + +#endif // __FRAMEDIFFERENCE_H__ + diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 4f8b6fb..6e37592 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -39,6 +39,7 @@ ADD_MODULE( FilterComponentLuma "FilterComponent" ) ADD_MODULE( FilterComponentChromaU "FilterComponent" ) ADD_MODULE( FilterComponentChromaV "FilterComponent" ) ADD_MODULE( FrameDifference "FrameDifference" ) +ADD_MODULE( AbsoluteFrameDifference "AbsoluteFrameDifference" ) ADD_MODULE( MeasurePSNR "MeasurePSNR" ) IF( USE_OPENCV ) ADD_MODULE( DisparityStereoVar "DisparityStereoVar" ) diff --git a/modules/FrameDifference.cpp b/modules/FrameDifference.cpp index cd0abd2..e7aabf4 100644 --- a/modules/FrameDifference.cpp +++ b/modules/FrameDifference.cpp @@ -23,6 +23,7 @@ */ #include "FrameDifference.h" +#include namespace plaYUVer { @@ -32,7 +33,7 @@ static PlaYUVerModuleDefinition FrameDifferenceDef = FRAME_PROCESSING_MODULE, "Measurements", "AbsoluteFrameDifference", - "Measure the difference between two images (Y plane), e. g., abs( Y1 - Y2 )", + "Measure the difference between two images (Y plane), Y1 - Y2, with max absolute diff of 128", MODULE_REQUIRES_TWO_FRAMES, MODULE_REQUIRES_NEW_WINDOW, APPLY_WHILE_PLAYING, @@ -55,13 +56,17 @@ PlaYUVerFrame* FrameDifference::process( PlaYUVerFrame* Input1, PlaYUVerFrame* I Pel* pInput2PelYUV = Input2->getPelBufferYUV()[0][0]; Pel* pOutputPelYUV = m_pcFrameDifference->getPelBufferYUV()[0][0]; Int aux_pel_1, aux_pel_2; + Int diff = 0; for( UInt y = 0; y < m_pcFrameDifference->getHeight(); y++ ) for( UInt x = 0; x < m_pcFrameDifference->getWidth(); x++ ) { aux_pel_1 = *pInput1PelYUV++; aux_pel_2 = *pInput2PelYUV++; - *pOutputPelYUV++ = abs( aux_pel_1 - aux_pel_2 ); + diff = aux_pel_1 - aux_pel_2; + diff = std::min( diff, 127 ); + diff = std::max( diff, -128 ); + *pOutputPelYUV++ = diff; } return m_pcFrameDifference; }