{
DfsOCV::DfsOCV() :
mDfsOcv(nullptr),
+ mDfsPostOcv(nullptr),
mDfsParam(),
mNumDisparities(179),
mBlockSize(5),
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");
}
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;
#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
{
private:
cv::Ptr<cv::StereoSGBM> mDfsOcv;
+ cv::Ptr<cv::StereoMatcher> mDfsOcvExtra;
+ cv::Ptr<cv::ximgproc::DisparityWLSFilter> mDfsPostOcv;
DfsParameter mDfsParam;
size_t mNumDisparities;