Add WLS filter
authorTae-Young Chung <ty83.chung@samsung.com>
Thu, 21 Oct 2021 08:19:35 +0000 (17:19 +0900)
committer엘무럿/선행S/W Lab(생활가전)/Principal Engineer/삼성전자 <e.talipov@samsung.com>
Tue, 14 Dec 2021 02:21:04 +0000 (11:21 +0900)
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 <ty83.chung@samsung.com>
CMakeLists.txt
src/dfs_opencv.cpp
src/dfs_opencv_private.h

index 18ff0f6c7d92767122dd24f1af19252ea7550ebf..a651c96a75b772db64d1e95b2b35d25261963b5d 100644 (file)
@@ -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()
index ee87a3b809c4c39e840a1d047e118622eace8fc4..916fea4c01e288786fe009018117925d6f8dbac9 100644 (file)
@@ -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<int>(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<unsigned char>();
                mDepthData.type = DFS_DATA_TYPE_UINT8;
index 3e71d87c9261982969cfc9afb387e79a1e8d6394..d47adac81b317708abaa45109401a924b8ae1edf 100644 (file)
@@ -23,6 +23,8 @@
 #include <opencv2/core.hpp>
 #include <opencv2/calib3d.hpp>
 #include <opencv2/imgproc.hpp>
+#include <opencv2/ximgproc.hpp>
+#include <opencv2/ximgproc/disparity_filter.hpp>
 
 /**
 * @file dfs_opencv_private.h
@@ -69,6 +71,8 @@ namespace DfsAdaptationImpl
        {
        private:
                cv::Ptr<cv::StereoSGBM> mDfsOcv;
+               cv::Ptr<cv::StereoMatcher> mDfsOcvExtra;
+               cv::Ptr<cv::ximgproc::DisparityWLSFilter> mDfsPostOcv;
 
                DfsParameter mDfsParam;
                size_t mNumDisparities;