From: Tae-Young Chung Date: Mon, 18 Oct 2021 06:51:18 +0000 (+0900) Subject: Add stereoCalibZed.yaml for stereo calibration and add InitializeStereoCalibration... X-Git-Tag: submit/tizen/20220701.002357~1^2~25 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c3020ac463aea8b9de8b59ba2af7ca336d519066;p=platform%2Fcore%2Fmultimedia%2Fdfs-opencv.git Add stereoCalibZed.yaml for stereo calibration and add InitializeStereoCalibration() method and variables for calibration The stereoCalibZed.yaml file is for zed camera only. It is added to test dfs-opencv using zed camera. You should change the file if you try to use other camera. Signed-off-by: Tae-Young Chung --- diff --git a/packaging/dfs-opencv.spec b/packaging/dfs-opencv.spec index de5bfa1..7465b12 100644 --- a/packaging/dfs-opencv.spec +++ b/packaging/dfs-opencv.spec @@ -11,6 +11,7 @@ BuildRequires: cmake BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(dfs-adaptation) BuildRequires: pkgconfig(opencv) +BuildRequires: pkgconfig(libtzplatform-config) %description OpenCV based Dept-from-Stereo implementation @@ -26,12 +27,16 @@ export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE" export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" %endif +export CXXFLAGS+=" -DDFS_CALIB_FILE_PATH=\\\"%{TZ_SYS_RO_SHARE}/%{name}/\\\"" + %cmake . make %{?jobs:-j%jobs} %install rm -rf %{buildroot} +mkdir -p %{buildroot}%{_datadir}/%{name} +cp res/*.yaml %{buildroot}%{_datadir}/%{name}/ %make_install @@ -43,3 +48,4 @@ rm -rf %{buildroot} %license LICENSE.APLv2 %defattr(-,root,root,-) %{_libdir}/*.so +%{_datadir}/%{name}/*.yaml diff --git a/res/stereoCalibZed.yaml b/res/stereoCalibZed.yaml new file mode 100644 index 0000000..615f2bd --- /dev/null +++ b/res/stereoCalibZed.yaml @@ -0,0 +1,31 @@ +%YAML:1.0 +LEFT_CAM_VGA: !!opencv-matrix + rows: 3 + cols: 3 + dt: d + data: [ 263.7425, 0., 333.64, 0., 263.5325, 184.129, 0., 0., 1. ] +LEFT_CAM_DISTCOEFFS: !!opencv-matrix + rows: 5 + cols: 1 + dt: d + data: [ -0.0397725, 0.00826312, -0.00435501, -0.000558719, 0.000138723 ] +RIGHT_CAM_VGA: !!opencv-matrix + rows: 3 + cols: 3 + dt: d + data: [ 264.02, 0., 335.0625, 0., 263.8875, 182.037, 0., 0., 1. ] +RIGHT_CAM_DISTCOEFFS: !!opencv-matrix + rows: 5 + cols: 1 + dt: d + data: [ -0.0416412, 0.00967152, -0.00473998, 0.000477674, 0.00033336 ] +STEREO_TRANSLATION: !!opencv-matrix + rows: 3 + cols: 1 + dt: d + data: [ 119.814, -0.0286845, 0.0224355 ] +STEREO_ROTATION: !!opencv-matrix + rows: 3 + cols: 1 + dt: d + data: [ 0.0017263, 0.00115139, -0.000467542 ] \ No newline at end of file diff --git a/src/dfs_opencv.cpp b/src/dfs_opencv.cpp index 98f7278..ccde94e 100644 --- a/src/dfs_opencv.cpp +++ b/src/dfs_opencv.cpp @@ -16,6 +16,9 @@ #include "dfs_opencv_private.h" #include +#include + +#define DEFAULT_STEREO_CALIB_FILE_NAME "stereoCalibZed.yaml" namespace DfsAdaptationImpl { @@ -29,9 +32,14 @@ namespace DfsAdaptationImpl mP2(96*3), mPreFilterCap(63), mDispMat(), - mDepthData() + mDepthData(), + mCalibFilePath(DFS_CALIB_FILE_PATH), + mStereoParam(), + mIsStereoCalibrated(false), + mUpdateStereoCalibration(false) { LOGI("ENTER"); + mCalibFilePath += std::string(DEFAULT_STEREO_CALIB_FILE_NAME); LOGI("LEAVE"); } @@ -41,6 +49,37 @@ namespace DfsAdaptationImpl LOGI("LEAVE"); } + void DfsOCV::InitializeStereoCalibration() + { + LOGI("ENTER"); + + cv::Mat intrinsicTest; + try { + cv::FileStorage fs(mCalibFilePath, cv::FileStorage::READ); + if (!fs.isOpened()) { + LOGE("Failed to open calib file %s", mCalibFilePath.c_str()); + throw std::ios_base::failure("calibration"); + } + + fs["LEFT_CAM_VGA"] >> mStereoParam.baceCamera.intrinsic; + fs["LEFT_CAM_DISTCOEFFS"] >> mStereoParam.baceCamera.distCoeffs; + + fs["RIGHT_CAM_VGA"] >> mStereoParam.extraCamera.intrinsic; + fs["RIGHT_CAM_DISTCOEFFS"] >> mStereoParam.extraCamera.distCoeffs; + + 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"); + } + + LOGI("LEAVE"); + } + void DfsOCV::Initialize(DfsParameter& param) { LOGI("ENTER"); @@ -50,6 +89,13 @@ namespace DfsAdaptationImpl mDfsOcv = cv::StereoSGBM::create(1, mNumDisparities, mBlockSize); this->SetParameters(); + + try { + this->InitializeStereoCalibration(); + } catch (const std::exception& e) { + throw e; + } + LOGI("LEAVE"); } diff --git a/src/dfs_opencv_private.h b/src/dfs_opencv_private.h index fba5045..e52d221 100644 --- a/src/dfs_opencv_private.h +++ b/src/dfs_opencv_private.h @@ -40,6 +40,31 @@ using namespace DfsAdaptation; namespace DfsAdaptationImpl { + typedef struct _CameraParam { + cv::Mat intrinsic; + cv::Mat distCoeffs; + + _CameraParam() + { + intrinsic = cv::Mat(cv::Size(3,3), CV_32FC1); + distCoeffs = cv::Mat(cv::Size(1,5), CV_32FC1); + } + } CameraParam; + + typedef struct _StereoParam { + CameraParam baceCamera; + CameraParam extraCamera; + + cv::Mat translation; + cv::Mat rotation; + + _StereoParam() + { + translation = cv::Mat(cv::Size(1,3), CV_32FC1); + rotation = cv::Mat(cv::Size(1,3), CV_32FC1); + } + } StereoParam; + class DfsOCV : public IDfsAdaptation { private: @@ -56,8 +81,14 @@ namespace DfsAdaptationImpl cv::Mat mDispMat; DfsData mDepthData; + std::string mCalibFilePath; + StereoParam mStereoParam; + bool mIsStereoCalibrated; + bool mUpdateStereoCalibration; + void SetParameters(); int ConvertDfsDataTypeToCV(int type); + void InitializeStereoCalibration(); public: DfsOCV(); ~DfsOCV();