Quasi dense Stereo#
Goal#
In this tutorial you will learn how to
Configure a QuasiDenseStero object
Compute dense Stereo correspondences.
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <fstream>
#include <opencv2/xstereo.hpp>
using namespace cv;
using namespace std;
int main()
{
cv::Mat rightImg, leftImg;
leftImg = imread("./imgLeft.png", IMREAD_COLOR);
rightImg = imread("./imgRight.png", IMREAD_COLOR);
cv::Size frameSize = leftImg.size();
Ptr<stereo::QuasiDenseStereo> stereo = stereo::QuasiDenseStereo::create(frameSize);
stereo->process(leftImg, rightImg);
cv::Mat disp;
disp = stereo->getDisparity();
cv::namedWindow("disparity map");
cv::imshow("disparity map", disp);
cv::namedWindow("right channel");
cv::namedWindow("left channel");
cv::imshow("left channel", leftImg);
cv::imshow("right channel", rightImg);
vector<stereo::MatchQuasiDense> matches;
stereo->getDenseMatches(matches);
std::ofstream dense("./dense.txt", std::ios::out);
for (uint i=0; i< matches.size(); i++)
{
dense << matches[i].p0 << matches[i].p1 << endl;
}
dense.close();
cv::waitKey(0);
return 0;
}
Explanation:#
The program loads a stereo image pair.
After importing the images.
We need to know the frame size of a single image, in order to create an instance of a QuasiDesnseStereo object.
cv::Size frameSize = leftImg.size();
Ptr<stereo::QuasiDenseStereo> stereo = stereo::QuasiDenseStereo::create(frameSize);
Because we didn’t specify the second argument in the constructor, the QuasiDesnseStereo object will
load default parameters.
We can then pass the imported stereo images in the process method like this
stereo->process(leftImg, rightImg);
The process method contains most of the functionality of the class and does two main things.
Computes a sparse stereo based in “Good Features to Track” and “pyramidal Lucas-Kanade” flow algorithm
Based on those sparse stereo points, densifies the stereo correspondences using Quasi Dense Stereo method.
After the execution of process() we can display the disparity Image of the stereo.
cv::Mat disp;
disp = stereo->getDisparity();
cv::namedWindow("disparity map");
cv::imshow("disparity map", disp);
At this point we can also extract all the corresponding points using getDenseMatches() method and export them in a file.
vector<stereo::MatchQuasiDense> matches;
stereo->getDenseMatches(matches);
std::ofstream dense("./dense.txt", std::ios::out);
for (uint i=0; i< matches.size(); i++)
{
dense << matches[i].p0 << matches[i].p1 << endl;
}
dense.close();