From: Tae-Young Chung Date: Thu, 21 Oct 2021 08:19:35 +0000 (+0900) Subject: Add WLS filter X-Git-Tag: submit/tizen/20220701.002357~1^2~18 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e906291d649c3ab0a7e17e53a17b9036ab66af5f;p=platform%2Fcore%2Fmultimedia%2Fdfs-opencv.git Add WLS filter WLS filter provides two approaches. One is to use a left color. Another is to use a left and a right images after getting disparity at the right. Signed-off-by: Tae-Young Chung --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 18ff0f6..a651c96 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ FOREACH(flag ${${fw_name}_CFLAGS}) SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} ${flag}") ENDFOREACH(flag) -find_package(OpenCV REQUIRED core calib3d imgproc) +find_package(OpenCV REQUIRED core calib3d imgproc ximgproc) if(NOT OpenCV_FOUND) message(SEND_ERROR "OpenCV NOT FOUND") return() diff --git a/src/dfs_opencv.cpp b/src/dfs_opencv.cpp index ee87a3b..916fea4 100644 --- a/src/dfs_opencv.cpp +++ b/src/dfs_opencv.cpp @@ -26,6 +26,7 @@ namespace DfsAdaptationImpl { DfsOCV::DfsOCV() : mDfsOcv(nullptr), + mDfsPostOcv(nullptr), mDfsParam(), mNumDisparities(179), mBlockSize(5), @@ -171,6 +172,17 @@ namespace DfsAdaptationImpl throw e; } +#if 0 + mDfsPostOcv = cv::ximgproc::createDisparityWLSFilterGeneric(false); + mDfsPostOcv->setDepthDiscontinuityRadius(static_cast(ceil(0.5*mBlockSize))); +#else + mDfsPostOcv = cv::ximgproc::createDisparityWLSFilter(mDfsOcv); + mDfsOcvExtra = cv::ximgproc::createRightMatcher(mDfsOcv); + mDfsPostOcv->setLRCthresh(24.0); +#endif + mDfsPostOcv->setSigmaColor(10.0); + mDfsPostOcv->setLambda(8000); + LOGI("LEAVE"); } @@ -234,14 +246,29 @@ namespace DfsAdaptationImpl throw std::runtime_error("base and extra should be the type"); } - cv::Mat rBaseMat, rExtraMat, dispMat; + cv::Mat rBaseMat, rExtraMat, dispMat, dispFiltMat; // with remap cv::remap(baseMat, rBaseMat, mBaseReMap[0], mBaseReMap[1], cv::INTER_LINEAR); cv::remap(extraMat, rExtraMat, mExtraReMap[0], mExtraReMap[1], cv::INTER_LINEAR); mDfsOcv->compute(rBaseMat, rExtraMat, dispMat); - dispMat.convertTo(mDispMat, CV_8UC1, 1.0/16.0); + if (mDfsPostOcv) { + if (mDfsOcvExtra) { + cv::Mat dispMatExtra; + mDfsOcvExtra->compute(rExtraMat, rBaseMat, dispMatExtra); + + mDfsPostOcv->filter(dispMat, rBaseMat, dispFiltMat, + dispMatExtra, + cv::Rect(0,0,rBaseMat.cols, rBaseMat.rows), + rExtraMat); + } else { + mDfsPostOcv->filter(dispMat, rBaseMat, dispFiltMat); + } + dispFiltMat.convertTo(mDispMat, CV_8UC1, 1.0/16.0); + } else { + dispMat.convertTo(mDispMat, CV_8UC1, 1.0/16.0); + } mDepthData.data = mDispMat.ptr(); mDepthData.type = DFS_DATA_TYPE_UINT8; diff --git a/src/dfs_opencv_private.h b/src/dfs_opencv_private.h index 3e71d87..d47adac 100644 --- a/src/dfs_opencv_private.h +++ b/src/dfs_opencv_private.h @@ -23,6 +23,8 @@ #include #include #include +#include +#include /** * @file dfs_opencv_private.h @@ -69,6 +71,8 @@ namespace DfsAdaptationImpl { private: cv::Ptr mDfsOcv; + cv::Ptr mDfsOcvExtra; + cv::Ptr mDfsPostOcv; DfsParameter mDfsParam; size_t mNumDisparities;