| OpenCV 5.0.0alpha Open Source Computer Vision

Loading...
Searching...
No Matches
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;
}
cv::Mat
n-dimensional dense array class
Definition mat.hpp:951
cv::Mat::size
MatSize size
Definition mat.hpp:2448
cv::Size_
Template class for specifying the size of an image or rectangle.
Definition types.hpp:338
cv::Ptr
std::shared_ptr< _Tp > Ptr
Definition cvstd_wrapper.hpp:23
uint
uint32_t uint
Definition interface.h:42
cv::imshow
void imshow(const String &winname, InputArray mat)
Displays an image in the specified window.
cv::waitKey
int waitKey(int delay=0)
Waits for a pressed key.
cv::namedWindow
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
Creates a window.
highgui.hpp
main
int main(int argc, char *argv[])
Definition highgui_qt.cpp:3
core.hpp
cv
Definition core.hpp:107
std
STL namespace.
xstereo.hpp

# 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.

- 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();