OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
无匹配项
准密集立体匹配

目标

本教程将指导您学习如何:

  • 配置 QuasiDenseStereo 对象
  • 计算密集立体匹配。
#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("视差图");
cv::imshow("视差图", disp);
cv::namedWindow("右侧通道");
cv::namedWindow("左侧通道");
cv::imshow("左侧通道", leftImg);
cv::imshow("右侧通道", 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维密集数组类
定义 mat.hpp:829
MatSize size
定义 mat.hpp:2177
用于指定图像或矩形大小的模板类。
定义 types.hpp:335
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
uint32_t uint
定义 interface.h:42
void imshow(const String &winname, InputArray mat)
在指定的窗口中显示图像。
int waitKey(int delay=0)
等待按键按下。
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
创建窗口。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
定义 core.hpp:107
STL 命名空间。

解释

程序加载一对立体图像。

导入图像后:

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

我们需要知道单个图像的帧大小,以便创建一个 QuasiDenseStereo 对象的实例。

cv::Size frameSize = leftImg.size();
Ptr<stereo::QuasiDenseStereo> stereo = stereo::QuasiDenseStereo::create(frameSize);

因为我们在构造函数中没有指定第二个参数,所以 QuasiDenseStereo 对象将加载默认参数。

然后我们可以像这样在 process 方法中传递导入的立体图像

stereo->process(leftImg, rightImg);

process 方法包含该类的大部分功能,主要执行两项操作。

  • 基于“良好的特征点跟踪”和“金字塔卢卡斯-卡纳德”光流算法计算稀疏立体匹配。
  • 基于这些稀疏立体点,使用准密集立体匹配方法对立体匹配进行稠密化。

执行 process() 后,我们可以显示立体匹配的视差图像。

cv::Mat disp;
disp = stereo->getDisparity();
cv::namedWindow("视差图");
cv::imshow("视差图", disp);

此时,我们还可以使用 getDenseMatches() 方法提取所有对应的点,并将它们导出到文件中。

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