31 #include <opencv2/video/tracking.hpp>
33 #ifdef HAVE_OPENCV_CUDAOPTFLOW
34 #include <opencv2/cudaoptflow.hpp>
41 bool opticalFlow = Parameters::defaultStereoOpticalFlow();
49 return new Stereo(parameters);
54 winWidth_(
Parameters::defaultStereoWinWidth()),
55 winHeight_(
Parameters::defaultStereoWinHeight()),
56 iterations_(
Parameters::defaultStereoIterations()),
57 maxLevel_(
Parameters::defaultStereoMaxLevel()),
58 minDisparity_(
Parameters::defaultStereoMinDisparity()),
59 maxDisparity_(
Parameters::defaultStereoMaxDisparity()),
77 const cv::Mat & leftImage,
78 const cv::Mat & rightImage,
79 const std::vector<cv::Point2f> & leftCorners,
80 std::vector<unsigned char> & status)
const
82 UASSERT(leftImage.type() == CV_8UC1);
83 UASSERT(rightImage.type() == CV_8UC1);
84 std::vector<cv::Point2f> rightCorners;
85 UDEBUG(
"util2d::calcStereoCorrespondences() begin");
97 UDEBUG(
"util2d::calcStereoCorrespondences() end");
101 #ifdef HAVE_OPENCV_CUDEV
103 const cv::cuda::GpuMat & leftImage,
104 const cv::cuda::GpuMat & rightImage,
105 const std::vector<cv::Point2f> & leftCorners,
106 std::vector<unsigned char> & status)
const
108 UERROR(
"GPU support for this approach is not implemented!");
109 return std::vector<cv::Point2f>();
126 #ifndef HAVE_OPENCV_CUDAOPTFLOW
129 UERROR(
"%s is enabled but RTAB-Map is not built with OpenCV CUDA, disabling it.", Parameters::kStereoGpu().
c_str());
137 #ifdef HAVE_OPENCV_CUDAOPTFLOW
145 const cv::Mat & leftImage,
146 const cv::Mat & rightImage,
147 const std::vector<cv::Point2f> & leftCorners,
148 std::vector<unsigned char> & status)
const
150 UASSERT(leftImage.type() == CV_8UC1);
151 UASSERT(rightImage.type() == CV_8UC1);
152 std::vector<cv::Point2f> rightCorners;
153 std::vector<float> err;
154 #ifdef HAVE_OPENCV_CUDAOPTFLOW
157 cv::cuda::GpuMat d_leftImage(leftImage);
158 cv::cuda::GpuMat d_rightImage(rightImage);
164 UDEBUG(
"util2d::calcOpticalFlowPyrLKStereo() begin");
174 cv::TermCriteria(cv::TermCriteria::COUNT+cv::TermCriteria::EPS, this->
iterations(),
epsilon_),
175 cv::OPTFLOW_LK_GET_MIN_EIGENVALS, 1
e-4);
176 UDEBUG(
"util2d::calcOpticalFlowPyrLKStereo() end");
182 #ifdef HAVE_OPENCV_CUDEV
184 const cv::cuda::GpuMat & leftImage,
185 const cv::cuda::GpuMat & rightImage,
186 const std::vector<cv::Point2f> & leftCorners,
187 std::vector<unsigned char> & status)
const
189 std::vector<cv::Point2f> rightCorners;
190 #ifdef HAVE_OPENCV_CUDAOPTFLOW
191 UASSERT(leftImage.type() == CV_8UC1);
192 UASSERT(rightImage.type() == CV_8UC1);
193 UDEBUG(
"cv::cuda::SparsePyrLKOpticalFlow transfer host to device begin");
194 cv::cuda::GpuMat d_leftImage(leftImage);
195 cv::cuda::GpuMat d_rightImage(rightImage);
196 cv::cuda::GpuMat d_leftCorners(leftCorners);
197 cv::cuda::GpuMat d_rightCorners;
198 UDEBUG(
"cv::cuda::SparsePyrLKOpticalFlow transfer host to device end");
199 cv::cuda::GpuMat d_status;
200 cv::Ptr<cv::cuda::SparsePyrLKOpticalFlow> d_pyrLK_sparse = cv::cuda::SparsePyrLKOpticalFlow::create(
203 UDEBUG(
"cv::cuda::SparsePyrLKOpticalFlow calc begin");
204 d_pyrLK_sparse->calc(d_leftImage, d_rightImage, d_leftCorners, d_rightCorners, d_status);
205 UDEBUG(
"cv::cuda::SparsePyrLKOpticalFlow calc end");
207 UDEBUG(
"cv::cuda::SparsePyrLKOpticalFlow transfer device to host begin");
209 rightCorners = std::vector<cv::Point2f>(d_rightCorners.cols);
210 cv::Mat matRightCorners(1, d_rightCorners.cols, CV_32FC2, (
void*)&rightCorners[0]);
211 d_rightCorners.download(matRightCorners);
213 status = std::vector<unsigned char>(d_status.cols);
214 cv::Mat matStatus(1, d_status.cols, CV_8UC1, (
void*)&status[0]);
215 d_status.download(matStatus);
216 UDEBUG(
"cv::cuda::SparsePyrLKOpticalFlow transfer device to host end");
221 UERROR(
"GPU support for this approach is not implemented!");
228 const std::vector<cv::Point2f> & leftCorners,
229 const std::vector<cv::Point2f> & rightCorners,
230 std::vector<unsigned char> & status)
const
232 UASSERT(leftCorners.size() == rightCorners.size() && status.size() == leftCorners.size());
233 int countFlowRejected = 0;
234 int countDisparityRejected = 0;
235 for(
unsigned int i=0;
i<status.size(); ++
i)
239 float disparity = leftCorners[
i].x - rightCorners[
i].x;
243 ++countDisparityRejected;
251 UDEBUG(
"total=%d countFlowRejected=%d countDisparityRejected=%d", (
int)status.size(), countFlowRejected, countDisparityRejected);