Add stereoConfigPath to get stereoConfig information for point cloud generation
authorTae-Young Chung <ty83.chung@samsung.com>
Mon, 24 Jan 2022 05:30:03 +0000 (14:30 +0900)
committer엘무럿/선행S/W Lab(생활가전)/Principal Engineer/삼성전자 <e.talipov@samsung.com>
Thu, 27 Jan 2022 06:43:43 +0000 (15:43 +0900)
Signed-off-by: Tae-Young Chung <ty83.chung@samsung.com>
packaging/dfs-opencv.spec
src/dfs_opencv.cpp
src/dfs_opencv_private.h

index effcd3e4193d618c7bb963becba596def3377c4a..92915f67d548f4dbe9454e1ffa6695ea33ee294a 100644 (file)
@@ -1,6 +1,6 @@
 Name:       dfs-opencv
 Summary:    OpenCV based Depth-from-Stereo implementation
-Version:    1.0.1
+Version:    1.0.2
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 896cc52844e79e72bf0e63c7342a8b8d7f11182e..9c8018ec465a2d8c283d00640b8282b5ca1d7b34 100644 (file)
 #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"
-#define DEFAULT_STEREO_HD_CALIB_FILE_NAME "stereoCalibZedHD.yaml"
-
 #define MAX_THREADS_NUM 2
-#define ENABLE_CALIBRATION 0
+#define ENABLE_CALIBRATION 1
 
 namespace DfsAdaptationImpl
 {
@@ -41,7 +37,6 @@ namespace DfsAdaptationImpl
                mPreFilterCap(63),
                mDispMat(),
                mDepthData(),
-               mCalibFilePath(DFS_CALIB_FILE_PATH),
                mStereoParam(),
                mIsStereoCalibrated(false),
                mUpdateStereoCalibration(false),
@@ -67,23 +62,15 @@ namespace DfsAdaptationImpl
                LOGI("LEAVE");
        }
 
-       void DfsOCV::InitializeStereoCalibration()
+       void DfsOCV::InitializeStereoCalibration(std::string filepath)
        {
                LOGI("ENTER");
 
                cv::Mat intrinsicTest;
                try {
-                       if (mImageSize == cv::Size(1280, 720))
-                               mCalibFilePath += std::string(DEFAULT_STEREO_HD_CALIB_FILE_NAME);
-                       else if (mImageSize == cv::Size(672, 376)) {
-                               mCalibFilePath += std::string(DEFAULT_STEREO_VGA_CALIB_FILE_NAME);
-                       } else {
-                               throw std::ios_base::failure("no calibration file");
-                       }
-
-                       cv::FileStorage fs(mCalibFilePath, cv::FileStorage::READ);
+                       cv::FileStorage fs(filepath, cv::FileStorage::READ);
                        if (!fs.isOpened()) {
-                               LOGE("Failed to open calib file %s", mCalibFilePath.c_str());
+                               LOGE("Failed to open calib file %s", filepath.c_str());
                                throw std::ios_base::failure("calibration");
                        }
 
@@ -96,8 +83,6 @@ namespace DfsAdaptationImpl
                        fs["STEREO_TRANSLATION"] >> mStereoParam.translation;
                        fs["STEREO_ROTATION"] >> mStereoParam.rotation;
 
-                       mIsStereoCalibrated = true;
-
                } catch (const std::exception& e) {
                        LOGE("Failed to read calibration data %s", e.what());
                        throw std::ios_base::failure("calibration");
@@ -111,26 +96,26 @@ namespace DfsAdaptationImpl
                LOGI("ENTER");
 
                try {
-               cv::Mat newBaseCameraIntrinsic = cv::getOptimalNewCameraMatrix(
+                       cv::Mat newBaseCameraIntrinsic = cv::getOptimalNewCameraMatrix(
                                                                                                mStereoParam.baceCamera.intrinsic,
                                                                                                mStereoParam.baceCamera.distCoeffs,
                                                                                                mImageSize,
                                                                                                1.0);
 
-               cv::Mat newExtraCameraIntrinsic = cv::getOptimalNewCameraMatrix(
+                       cv::Mat newExtraCameraIntrinsic = cv::getOptimalNewCameraMatrix(
                                                                                                mStereoParam.extraCamera.intrinsic,
                                                                                                mStereoParam.extraCamera.distCoeffs,
                                                                                                mImageSize,
                                                                                                1.0);
 
-               cv::Mat extraCameraRotation;
-               cv::Rodrigues(mStereoParam.rotation, extraCameraRotation);
+                       cv::Mat extraCameraRotation;
+                       cv::Rodrigues(mStereoParam.rotation, extraCameraRotation);
 
-               cv::Mat baseRotation, extraRotation; // 3x3
-               cv::Mat baseProjection, extraProjection; // 3x4
-               cv::Mat disp2Depth; // 4x4
+                       cv::Mat baseRotation, extraRotation; // 3x3
+                       cv::Mat baseProjection, extraProjection; // 3x4
+                       cv::Mat disp2Depth; // 4x4
 
-               cv::stereoRectify(mStereoParam.baceCamera.intrinsic,
+                       cv::stereoRectify(mStereoParam.baceCamera.intrinsic,
                                                mStereoParam.baceCamera.distCoeffs,
                                                mStereoParam.extraCamera.intrinsic,
                                                mStereoParam.extraCamera.distCoeffs,
@@ -143,7 +128,7 @@ namespace DfsAdaptationImpl
                                                extraProjection,
                                                disp2Depth);
 
-               cv::initUndistortRectifyMap(mStereoParam.baceCamera.intrinsic,
+                       cv::initUndistortRectifyMap(mStereoParam.baceCamera.intrinsic,
                                                                        mStereoParam.baceCamera.distCoeffs,
                                                                        baseRotation,
                                                                        newBaseCameraIntrinsic,
@@ -152,7 +137,7 @@ namespace DfsAdaptationImpl
                                                                        mBaseReMap[0],
                                                                        mBaseReMap[1]);
 
-               cv::initUndistortRectifyMap(mStereoParam.extraCamera.intrinsic,
+                       cv::initUndistortRectifyMap(mStereoParam.extraCamera.intrinsic,
                                                                        mStereoParam.extraCamera.distCoeffs,
                                                                        extraRotation,
                                                                        newExtraCameraIntrinsic,
@@ -161,6 +146,7 @@ namespace DfsAdaptationImpl
                                                                        mExtraReMap[0],
                                                                        mExtraReMap[1]);
 
+                       mIsStereoCalibrated = true;
                } catch (const std::exception& e) {
                        LOGE("Failed to InitRectifyMap");
                        throw e;
@@ -171,7 +157,7 @@ namespace DfsAdaptationImpl
 
        }
        void DfsOCV::Initialize(DfsParameter& param, size_t width, size_t height,
-                                                       size_t minDisp, size_t maxDisp)
+                                                       size_t minDisp, size_t maxDisp, std::string stereoConfigPath)
        {
                LOGI("ENTER");
 
@@ -199,11 +185,13 @@ namespace DfsAdaptationImpl
                this->SetParameters();
 
 #if ENABLE_CALIBRATION
-               try {
-                       this->InitializeStereoCalibration();
-                       this->InitRectifyMap();
-               } catch (const std::exception& e) {
-                       throw e;
+               if (!stereoConfigPath.empty()) {
+                       try {
+                               this->InitializeStereoCalibration(stereoConfigPath);
+                               this->InitRectifyMap();
+                       } catch (const std::exception& e) {
+                               throw e;
+                       }
                }
 #endif
                mDfsPostOcv = cv::ximgproc::createDisparityWLSFilter(mDfsOcv);
@@ -380,13 +368,14 @@ namespace DfsAdaptationImpl
                cv::Mat rBaseMat, rExtraMat, dispMat, dispFiltMat;
 
                // with remap
-#if ENABLE_CALIBRATION
-               cv::remap(baseMat, rBaseMat, mBaseReMap[0], mBaseReMap[1], cv::INTER_LINEAR);
-               cv::remap(extraMat, rExtraMat, mExtraReMap[0], mExtraReMap[1], cv::INTER_LINEAR);
-#else
-               rBaseMat = baseMat;
-               rExtraMat = extraMat;
-#endif
+               if (mIsStereoCalibrated) {
+                       cv::remap(baseMat, rBaseMat, mBaseReMap[0], mBaseReMap[1], cv::INTER_LINEAR);
+                       cv::remap(extraMat, rExtraMat, mExtraReMap[0], mExtraReMap[1], cv::INTER_LINEAR);
+               } else {
+                       rBaseMat = baseMat;
+                       rExtraMat = extraMat;
+               }
+
 
                cv::Mat srcBaseMat, srcExtraMat;
                cv::resize(rBaseMat, srcBaseMat,
index 0e8c2bbf8c6cebd0590e3984d3b42f6709131899..16ebb8a6d9427b740aa6f3c5e772d4a02e4f1fd9 100644 (file)
@@ -91,7 +91,6 @@ namespace DfsAdaptationImpl
                cv::Mat mDispMat;
                DfsData mDepthData;
 
-               std::string mCalibFilePath;
                StereoParam mStereoParam;
                bool mIsStereoCalibrated;
                bool mUpdateStereoCalibration;
@@ -115,7 +114,7 @@ namespace DfsAdaptationImpl
 
                void SetParameters();
                int  ConvertDfsDataTypeToCV(int type);
-               void InitializeStereoCalibration();
+               void InitializeStereoCalibration(std::string filepath);
                void InitRectifyMap();
 
                bool computeL(const cv::Mat& baseMat, const cv::Mat& extraMat, cv::Mat& disp);
@@ -126,7 +125,7 @@ namespace DfsAdaptationImpl
                ~DfsOCV();
 
                void Initialize(DfsParameter& param, size_t width, size_t height,
-                                               size_t minDisp, size_t maxDisp) override;
+                                               size_t minDisp, size_t maxDisp, std::string stereoConfigPath) override;
                void Run(DfsData& base, DfsData& extra) override;
 
                DfsData& GetDepthData() override;