$darkmode
404 Not Found

404 Not Found


nginx
OpenCV 4.11.0
Open Source Computer Vision
BEGIN_CUSTOM_MATHJAX // END_CUSTOM_MATHJAX
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 <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();
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();
return 0;
}
n-dimensional dense array class
Definition: core/include/opencv2/core/mat.hpp:829
MatSize size
Definition: core/include/opencv2/core/mat.hpp:2177
Template class for specifying the size of an image or rectangle.
Definition: modules/core/include/opencv2/core/types.hpp:335
uint32_t uint
Definition: core/include/opencv2/core/hal/interface.h:42
void imshow(const String &winname, InputArray mat)
Displays an image in the specified window.
int waitKey(int delay=0)
Waits for a pressed key.
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
Creates a window.
@ IMREAD_COLOR
Same as IMREAD_COLOR_BGR.
Definition: imgcodecs.hpp:72
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR_BGR)
Loads an image from a file.
int main(int argc, char *argv[])
Definition: highgui_qt.cpp:3
GMat stereo(const GMat &left, const GMat &right, const StereoOutputFormat of=StereoOutputFormat::DEPTH_FLOAT32)
Computes disparity/depth map for the specified stereo-pair. The function computes disparity or depth ...
Definition: core/include/opencv2/core.hpp:107
STL namespace.

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