Add downscaling to reduce execution time
authorTae-Young Chung <ty83.chung@samsung.com>
Mon, 25 Oct 2021 06:58:24 +0000 (15:58 +0900)
committer엘무럿/선행S/W Lab(생활가전)/Principal Engineer/삼성전자 <e.talipov@samsung.com>
Tue, 14 Dec 2021 02:21:04 +0000 (11:21 +0900)
Before running compute() for disparity estimation,
resize the input images' size to half in both width and height.
After compute(), resize the size to the original size.
The, apply WLS filter as post-process.

Signed-off-by: Tae-Young Chung <ty83.chung@samsung.com>
src/dfs_opencv.cpp
src/dfs_opencv_private.h

index 055f9569c5891fefd845628e08f1589023496159..c435ba3554334396893276148de233785aa0d547 100644 (file)
@@ -17,6 +17,7 @@
 #include "dfs_opencv_private.h"
 #include <dlog.h>
 #include <opencv2/core/persistence.hpp>
+#include <opencv2/imgcodecs.hpp>
 
 #define DEFAULT_STEREO_CALIB_FILE_NAME "stereoCalibZed.yaml"
 #define DEFAULT_STEREO_VGA_CALIB_FILE_NAME "stereoCalibZedVGA.yaml"
@@ -26,6 +27,7 @@ namespace DfsAdaptationImpl
 {
        DfsOCV::DfsOCV() :
                mDfsOcv(nullptr),
+               mDfsOcvExtra(nullptr),
                mDfsPostOcv(nullptr),
                mDfsParam(),
                mNumDisparities(179),
@@ -40,7 +42,8 @@ namespace DfsAdaptationImpl
                mStereoParam(),
                mIsStereoCalibrated(false),
                mUpdateStereoCalibration(false),
-               mImageSize(cv::Size(0,0))
+               mImageSize(cv::Size(0,0)),
+               mDownScale(1)
        {
                LOGI("ENTER");
                LOGI("LEAVE");
@@ -161,6 +164,10 @@ namespace DfsAdaptationImpl
 
                mDfsParam = param;
                mImageSize = cv::Size(width, height);
+               if (mDownScale) {
+                       mMinDisparity >>= mDownScale;
+                       mNumDisparities >>= mDownScale;
+               }
                mDfsOcv = cv::StereoSGBM::create(mMinDisparity, mNumDisparities, mBlockSize);
 
                this->SetParameters();
@@ -172,10 +179,10 @@ namespace DfsAdaptationImpl
                        throw e;
                }
 
-#if 0
+#if 0 // oneway
                mDfsPostOcv = cv::ximgproc::createDisparityWLSFilterGeneric(false);
                mDfsPostOcv->setDepthDiscontinuityRadius(static_cast<int>(ceil(0.5*mBlockSize)));
-#else
+#else // twoway
                mDfsPostOcv = cv::ximgproc::createDisparityWLSFilter(mDfsOcv);
                mDfsOcvExtra = cv::ximgproc::createRightMatcher(mDfsOcv);
                mDfsPostOcv->setLRCthresh(24.0);
@@ -252,22 +259,67 @@ namespace DfsAdaptationImpl
                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);
+               cv::Mat srcBaseMat, srcExtraMat;
+               cv::resize(rBaseMat, srcBaseMat,
+                                       cv::Size(),
+                                       1.0/static_cast<double>((1<<mDownScale)),
+                                       1.0/static_cast<double>((1<<mDownScale)));
+               cv::resize(rExtraMat, srcExtraMat,
+                                       cv::Size(),
+                                       1.0/static_cast<double>((1<<mDownScale)),
+                                       1.0/static_cast<double>((1<<mDownScale)));
+
+               mDfsOcv->compute(srcBaseMat, srcExtraMat, dispMat);
                if (mDfsPostOcv) {
                        if (mDfsOcvExtra) {
                                cv::Mat dispMatExtra;
-                               mDfsOcvExtra->compute(rExtraMat, rBaseMat, dispMatExtra);
-
+                               mDfsOcvExtra->compute(srcExtraMat, srcBaseMat, dispMatExtra);
+
+                               if (mDownScale) {
+                                       cv::Mat tmp;
+                                       // base
+                                       cv::resize(dispMat, tmp,
+                                       cv::Size(),
+                                       static_cast<double>(1<<mDownScale),
+                                       static_cast<double>(1<<mDownScale));
+                                       dispMat = tmp * static_cast<double>(1<<mDownScale);
+
+                                       // extra
+                                       cv::resize(dispMatExtra, tmp,
+                                       cv::Size(),
+                                       static_cast<double>(1<<mDownScale),
+                                       static_cast<double>(1<<mDownScale));
+                                       dispMatExtra = tmp * static_cast<double>(1<<mDownScale);
+                               }
                                mDfsPostOcv->filter(dispMat, rBaseMat, dispFiltMat,
                                                                        dispMatExtra,
                                                                        cv::Rect(0,0,rBaseMat.cols, rBaseMat.rows),
                                                                        rExtraMat);
                        } else {
+                               if (mDownScale) {
+                                       cv::Mat tmp;
+                                       cv::resize(dispMat, tmp,
+                                       cv::Size(),
+                                       static_cast<double>(1<<mDownScale),
+                                       static_cast<double>(1<<mDownScale));
+                                       dispMat = tmp * static_cast<double>(1<<mDownScale);
+                               }
                                mDfsPostOcv->filter(dispMat, rBaseMat, dispFiltMat);
                        }
+
                        dispFiltMat.convertTo(mDispMat, CV_8UC1, 1.0/16.0);
                } else {
-                       dispMat.convertTo(mDispMat, CV_8UC1, 1.0/16.0);
+                       if (mDownScale) {
+                               cv::Mat tmp;
+                               cv::resize(dispMat, tmp,
+                                       cv::Size(),
+                                       static_cast<double>(1<<mDownScale),
+                                       static_cast<double>(1<<mDownScale));
+
+                               tmp.convertTo(mDispMat, CV_8UC1, (1.0/16.0) * static_cast<double>(1 << mDownScale));
+                       } else {
+                               dispMat.convertTo(mDispMat, CV_8UC1, 1.0/16.0);
+                       }
                }
 
                mDepthData.data = mDispMat.ptr<unsigned char>();
index d47adac81b317708abaa45109401a924b8ae1edf..1467860554edbf345f7dd5596755b92e8de7c7c8 100644 (file)
@@ -94,6 +94,8 @@ namespace DfsAdaptationImpl
                cv::Mat mBaseReMap[2];
                cv::Mat mExtraReMap[2];
 
+               size_t mDownScale;
+
                void SetParameters();
                int  ConvertDfsDataTypeToCV(int type);
                void InitializeStereoCalibration();