OpenCV  4.5.1
Open Source Computer Vision
Quasi dense Stereo

Goal

In this tutorial you will learn how to

#include <opencv2/core.hpp>
#include <fstream>
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();
stereo->process(leftImg, rightImg);
uint8_t displvl = 80;
cv::Mat disp;
disp = stereo->getDisparity(displvl);
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::Match> 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();
return 0;
}

Explanation:

The program loads a stereo image pair.

After importing the images.

cv::Mat rightImg, leftImg;
leftImg = imread("./imgLeft.png", IMREAD_COLOR);
rightImg = imread("./imgRight.png", IMREAD_COLOR);

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.

After the execution of process() we can display the disparity Image of the stereo.

uint8_t displvl = 80;
cv::Mat disp;
disp = stereo->getDisparity(displvl);
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::Match> 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();