OpenCV  4.10.0
开源计算机视觉
加载中...
搜索中...
没有匹配项
类密集立体

目标

本教程中,你将学习如何

  • 配置一个 QuasiDenseStero 对象
  • 计算密集的立体交差。
#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 维密集数组类
定义 mat.hpp:812
MatSize size
定义 mat.hpp:2160
模板类,用于指定图像或矩形的大小。
定义 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:102
STL 名称空间。

说明

该程序加载立体图像对。

在导入图像后。

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

我们需要了解单个图像的帧大小,才能创建 QuasiDesnseStereo 对象的实例。

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

由于我们没有在构造函数中指定第二个参数,QuasiDesnseStereo 对象将加载默认参数。

然后,我们可以像这样将导入的立体图像作为 process 方法中的参数传递

stereo->process(leftImg, rightImg);

process 方法包含该类的多数功能,并且执行以下两项主要任务。

  • 基于“追踪用的良好特征”和“金字塔 Lucas-Kanade”光流算法计算稀疏立体图
  • 基于这些稀疏立体点,利用 Quasi Dense Stereo 方法来细化立体对应关系。

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

cv::Mat disp;
disp = stereo->getDisparity();
cv::namedWindow("disparity map");
cv::imshow("disparity map", 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();