diff --git a/lib/PlaYUVerFrame.cpp b/lib/PlaYUVerFrame.cpp index 0f5b2c4..74f9522 100644 --- a/lib/PlaYUVerFrame.cpp +++ b/lib/PlaYUVerFrame.cpp @@ -1039,16 +1039,17 @@ Double PlaYUVerFrame::getMaximum( Int channel ) ************************************************************** */ -cv::Mat* PlaYUVerFrame::getCvMat( Bool convertToGray ) +Bool PlaYUVerFrame::toMat( cv::Mat& cvMat, Bool convertToGray ) { + Bool bRet = false; #ifdef USE_OPENCV if( convertToGray && !( d->m_pcPelFormat->colorSpace == PlaYUVerPixel::COLOR_YUV || d->m_pcPelFormat->colorSpace == PlaYUVerPixel::COLOR_GRAY ) ) { - return NULL; + return bRet; } Int cvType = CV_MAKETYPE( CV_8U, convertToGray ? 1 : d->m_pcPelFormat->numberChannels ); - cv::Mat *pcCvFrame = new cv::Mat( d->m_uiHeight, d->m_uiWidth, cvType ); - UChar* pCvPel = pcCvFrame->data; + cvMat.create( d->m_uiHeight, d->m_uiWidth, cvType ); + UChar* pCvPel = cvMat.data; if( !convertToGray && ( d->m_pcPelFormat->colorSpace == PlaYUVerPixel::COLOR_YUV || d->m_pcPelFormat->colorSpace == PlaYUVerPixel::COLOR_RGB ) ) { fillRGBBuffer(); @@ -1060,6 +1061,7 @@ cv::Mat* PlaYUVerFrame::getCvMat( Bool convertToGray ) *pCvPel++ = *pARGB++; pARGB++; } + bRet = true; } else if( convertToGray || d->m_pcPelFormat->colorSpace == PlaYUVerPixel::COLOR_GRAY ) { @@ -1068,27 +1070,25 @@ cv::Mat* PlaYUVerFrame::getCvMat( Bool convertToGray ) { *pCvPel++ = *pPel++; } + bRet = true; } else { - if( pcCvFrame ) - delete pcCvFrame; - pcCvFrame = NULL; + return false; } - return pcCvFrame; -#else - return NULL; #endif + return bRet; } -Void PlaYUVerFrame::fromCvMat( cv::Mat* pcCvFrame ) +Bool PlaYUVerFrame::fromMat( cv::Mat& cvMat ) { + Bool bRet = false; #ifdef USE_OPENCV if( !d->m_bInit ) { if( d->m_iPixelFormat == NO_FMT ) { - switch( pcCvFrame->channels() ) + switch( cvMat.channels() ) { case 1: d->m_iPixelFormat = findPixelFormat( "GRAY" ); @@ -1097,16 +1097,16 @@ Void PlaYUVerFrame::fromCvMat( cv::Mat* pcCvFrame ) d->m_iPixelFormat = findPixelFormat( "BGR24" ); break; default: - return; + return false; } } - d->init( pcCvFrame->cols, pcCvFrame->rows, d->m_iPixelFormat, 8, -1 ); + d->init( cvMat.cols, cvMat.rows, d->m_iPixelFormat, 8, -1 ); } d->m_bHasRGBPel = false; d->m_bHasHistogram = false; - UChar* pCvPel = pcCvFrame->data; + UChar* pCvPel = cvMat.data; if( d->m_iPixelFormat != GRAY ) { Pel* pInputPelR = d->m_pppcInputPel[COLOR_R][0]; @@ -1117,9 +1117,8 @@ Void PlaYUVerFrame::fromCvMat( cv::Mat* pcCvFrame ) *pInputPelB++ = *pCvPel++; *pInputPelG++ = *pCvPel++; *pInputPelR++ = *pCvPel++; - - } + bRet = true; } else { @@ -1128,8 +1127,10 @@ Void PlaYUVerFrame::fromCvMat( cv::Mat* pcCvFrame ) { *pPel++ = *pCvPel++; } + bRet = true; } #endif + return bRet; } /* diff --git a/lib/PlaYUVerFrame.h b/lib/PlaYUVerFrame.h index d10a883..69b62f7 100644 --- a/lib/PlaYUVerFrame.h +++ b/lib/PlaYUVerFrame.h @@ -232,8 +232,8 @@ public: /** * Interface with OpenCV lib */ - cv::Mat* getCvMat( Bool convertToGray = false ); - Void fromCvMat( cv::Mat* ); + Bool toMat( cv::Mat& cvMat, Bool convertToGray = false ); + Bool fromMat( cv::Mat& cvMat ); /** * @defgroup PlaYUVerLib_QualityMetrics Quality Metrics Interface diff --git a/lib/StreamHandlerOpenCV.cpp b/lib/StreamHandlerOpenCV.cpp index 43aa139..d5d762f 100644 --- a/lib/StreamHandlerOpenCV.cpp +++ b/lib/StreamHandlerOpenCV.cpp @@ -36,7 +36,7 @@ using cv::VideoCapture; std::vector StreamHandlerOpenCV::supportedReadFormats() { INI_REGIST_PLAYUVER_SUPPORTED_FMT; -// REGIST_PLAYUVER_SUPPORTED_FMT( &StreamHandlerOpenCV::Create, "Portable Network Graphics", "png" ); + REGIST_PLAYUVER_SUPPORTED_FMT( &StreamHandlerOpenCV::Create, "Portable Network Graphics", "png" ); // REGIST_PLAYUVER_SUPPORTED_FMT( &StreamHandlerOpenCV::Create, "Device", "/dev/" ); END_REGIST_PLAYUVER_SUPPORTED_FMT; } @@ -44,8 +44,8 @@ std::vector StreamHandlerOpenCV::supportedReadFormats() std::vector StreamHandlerOpenCV::supportedWriteFormats() { INI_REGIST_PLAYUVER_SUPPORTED_FMT; - APPEND_PLAYUVER_SUPPORTED_FMT( StreamHandlerOpenCV, Read ); REGIST_PLAYUVER_SUPPORTED_FMT( &StreamHandlerOpenCV::Create, "Portable PixMap ", "ppm" ); + REGIST_PLAYUVER_SUPPORTED_FMT( &StreamHandlerOpenCV::Create, "Portable Network Graphics", "png" ); REGIST_PLAYUVER_SUPPORTED_FMT( &StreamHandlerOpenCV::Create, "Joint Photographic Experts Group", "jpg" ); REGIST_PLAYUVER_SUPPORTED_FMT( &StreamHandlerOpenCV::Create, "Windows Bitmap", "bmp" ); END_REGIST_PLAYUVER_SUPPORTED_FMT; @@ -53,7 +53,6 @@ std::vector StreamHandlerOpenCV::supportedWriteFormats( StreamHandlerOpenCV::StreamHandlerOpenCV() { - pcMat = NULL; pcVideoCapture = NULL; } @@ -62,8 +61,6 @@ Bool StreamHandlerOpenCV::openHandler( String strFilename, Bool bInput ) m_cFilename = strFilename; if( bInput ) { - - /* * Special filename to handle webcam input */ @@ -79,9 +76,9 @@ Bool StreamHandlerOpenCV::openHandler( String strFilename, Bool bInput ) else { m_strCodecName = m_strFormatName = uppercase (strFilename.substr( strFilename.find_last_of( "." ) + 1 ) ); - pcMat = new Mat( cv::imread( m_cFilename ) ); - m_uiWidth = pcMat->cols; - m_uiHeight = pcMat->rows; + Mat cvMat = cv::imread( m_cFilename ); + m_uiWidth = cvMat.cols; + m_uiHeight = cvMat.rows; m_dFrameRate = 1; } m_uiBitsPerPixel = 8; @@ -99,10 +96,6 @@ Void StreamHandlerOpenCV::closeHandler() delete pcVideoCapture; pcVideoCapture = NULL; } - if( pcMat ) - { - delete pcMat; - } } Bool StreamHandlerOpenCV::configureBuffer( PlaYUVerFrame* pcFrame ) @@ -132,12 +125,12 @@ Bool StreamHandlerOpenCV::read( PlaYUVerFrame* pcFrame ) Mat cvMat; bRet = pcVideoCapture->read( cvMat ); if( bRet ) - pcFrame->fromCvMat( &cvMat ); + bRet = pcFrame->fromMat( cvMat ); } - if( pcMat ) + else { - pcFrame->fromCvMat( pcMat ); - bRet = true; + Mat cvMat = cv::imread( m_cFilename ); + bRet = pcFrame->fromMat( cvMat ); } return bRet; } @@ -145,11 +138,11 @@ Bool StreamHandlerOpenCV::read( PlaYUVerFrame* pcFrame ) Bool StreamHandlerOpenCV::write( PlaYUVerFrame* pcFrame ) { Bool bRet = false; - cv::Mat* pcCvFrame = pcFrame->getCvMat(); - if( pcCvFrame ) + Mat cvFrame; + bRet = pcFrame->toMat( cvFrame ); + if( bRet ) { - bRet = cv::imwrite( m_cFilename, *pcCvFrame ); - delete pcCvFrame; + bRet = cv::imwrite( m_cFilename, cvFrame ); } return bRet; } diff --git a/lib/StreamHandlerOpenCV.h b/lib/StreamHandlerOpenCV.h index acb769a..0a661fe 100644 --- a/lib/StreamHandlerOpenCV.h +++ b/lib/StreamHandlerOpenCV.h @@ -65,7 +65,6 @@ public: private: cv::VideoCapture* pcVideoCapture; - cv::Mat* pcMat; }; #endif // __STREAMHANDLEROPENCV_H__ diff --git a/modules/DisparityStereoBM.cpp b/modules/DisparityStereoBM.cpp index ffdbae7..2ac0e0a 100644 --- a/modules/DisparityStereoBM.cpp +++ b/modules/DisparityStereoBM.cpp @@ -85,19 +85,22 @@ PlaYUVerFrame* DisparityStereoBM::process( std::vector apcFrameL PlaYUVerFrame* InputLeft = apcFrameList[0]; PlaYUVerFrame* InputRight = apcFrameList[1]; - cv::Mat* leftImage = InputLeft->getCvMat( true ); - cv::Mat* rightImage = InputRight->getCvMat( true ); + cv::Mat leftImage, rightImage; + if( !InputLeft->toMat( leftImage, true ) || !InputRight->toMat( rightImage, true ) ) + { + return m_pcDisparityFrame; + } cv::Mat disparityImage, disparityImage8; #if( CV_MAJOR_VERSION == 2) - m_cStereoBM( *leftImage, *rightImage, disparityImage ); + m_cStereoBM( leftImage, rightImage, disparityImage ); #else - m_cStereoBM->compute( *leftImage, *rightImage, disparityImage ); + m_cStereoBM->compute( leftImage, rightImage, disparityImage ); #endif disparityImage.convertTo( disparityImage8, CV_8U ); - m_pcDisparityFrame->fromCvMat( &disparityImage8 ); + m_pcDisparityFrame->fromMat( disparityImage8 ); return m_pcDisparityFrame; } diff --git a/modules/DisparityStereoSGBM.cpp b/modules/DisparityStereoSGBM.cpp index 064dc1a..c6065fd 100644 --- a/modules/DisparityStereoSGBM.cpp +++ b/modules/DisparityStereoSGBM.cpp @@ -91,20 +91,19 @@ PlaYUVerFrame* DisparityStereoSGBM::process( std::vector apcFram { PlaYUVerFrame* InputLeft = apcFrameList[0]; PlaYUVerFrame* InputRight = apcFrameList[1]; - - cv::Mat* leftImage = InputLeft->getCvMat( true ); - cv::Mat* rightImage = InputRight->getCvMat( true ); + cv::Mat leftImage, rightImage; + if( !InputLeft->toMat( leftImage, true ) || !InputRight->toMat( rightImage, true ) ) + { + return m_pcDisparityFrame; + } cv::Mat disparityImage, disparityImage8; - #if( CV_MAJOR_VERSION == 3) - m_cStereoMatch->compute( *leftImage, *rightImage, disparityImage ); + m_cStereoMatch->compute( leftImage, rightImage, disparityImage ); #else - m_cStereoMatch( *leftImage, *rightImage, disparityImage ); + m_cStereoMatch( leftImage, rightImage, disparityImage ); #endif - disparityImage.convertTo( disparityImage8, CV_8U ); - - m_pcDisparityFrame->fromCvMat( &disparityImage8 ); + m_pcDisparityFrame->fromMat( disparityImage8 ); return m_pcDisparityFrame; }