#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"
{
DfsOCV::DfsOCV() :
mDfsOcv(nullptr),
+ mDfsOcvExtra(nullptr),
mDfsPostOcv(nullptr),
mDfsParam(),
mNumDisparities(179),
mStereoParam(),
mIsStereoCalibrated(false),
mUpdateStereoCalibration(false),
- mImageSize(cv::Size(0,0))
+ mImageSize(cv::Size(0,0)),
+ mDownScale(1)
{
LOGI("ENTER");
LOGI("LEAVE");
mDfsParam = param;
mImageSize = cv::Size(width, height);
+ if (mDownScale) {
+ mMinDisparity >>= mDownScale;
+ mNumDisparities >>= mDownScale;
+ }
mDfsOcv = cv::StereoSGBM::create(mMinDisparity, mNumDisparities, mBlockSize);
this->SetParameters();
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);
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>();