- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试在 OpenCV 中使用 StereoBM 从一对图像中提取视差图。忽略下面的视差图质量不好,你可以看到它的左边有一些黑色的柱子对应于参数 ndisparities。我认为 ndisparities 只告诉 StereoBM 它可以在多远的地方搜索对应关系。什么可能导致这种行为?它似乎限制了生成的深度图的宽度,但我不明白为什么。
您可以看到立体声对 here和我下面的代码。在此先感谢您的指点!
Mat Limg = imread("left.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat Rimg = imread("right.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat disp(Limg.size(), CV_16SC1), disp8U;
int ndisparities = 512;
StereoBM SBM(StereoBM::BASIC_PRESET, ndisparities , 11);
SBM(Limg, Rimg, disp, CV_16S);
double minVal, maxVal;
minMaxLoc( disp, &minVal, &maxVal );
disp.convertTo( disp8U, CV_8UC1, 255/(maxVal - minVal));
imshow("disparity", disp8U)
最佳答案
视差图量化了左右图像中对应点对之间的纵向(对极)偏移。
原则上,
disparity := x_l - x_r
其中 x_l
和 x_r
是空间中给定点的两个相机在焦平面上的投影。 (请记住,较大的差异表征了距离相机更近的像素。[A])
参数 ndisparities
量化您可以拥有的预期最大差异(假设您可以忽略最小差异)。
因为您假设 ndisparities
是您最大的差异,所以它成立
x_l - x_r < ndisparities,
即
x_r > x_l - ndisparities
因此,在左图像的第一个 ndisparities
列中寻找与任何像素的右图像的对应关系是没有意义的:根本不可能。
从某种意义上说,右侧相机的视锥恰好从左侧相机的视锥右侧的 ndisparities
列开始。
修复:
如果您希望差异图左侧的黑色列更少,您需要能够假设ndisparities
的值较低。
由于 ndisparities
取决于距离最近物体(从 [A])的相机的距离,因此要么将相机远离物体,要么将相机彼此靠近。
在你非常具体的情况下,你有一个巨大的差异(stereoBM 需要做很多工作)!!前景中的“x”符号显示出与图像比例相当的差异!!我相信你需要把你的相机放远一点。
关于c++ - 使用 StereoBM 时视差图中的黑色列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15831018/
我看过很多关于这个问题的帖子,但这个是不同的。我的代码适用于一对图像,但不适用于另一对图像。 稍后,我想将两个摄像头的视频输入转换为立体声输出。我试过了,但也有与下面显示的图像(第二对图像)相同的问题
result left right import numpy as np import cv2 imgL = cv2.imread("C:/Users/admin/jupyter/c
我正在使用这段代码来计算两幅图像之间的差异: l1 = cv2.cvtColor(imgL, cv2.COLOR_BGR2GRAY) l2 = cv2.cvtColor(imgR, cv2.COLOR
我正在尝试在 OpenCV 中使用 StereoBM 从一对图像中提取视差图。忽略下面的视差图质量不好,你可以看到它的左边有一些黑色的柱子对应于参数 ndisparities。我认为 ndispari
我正在尝试增强 stereobm(Opencv 立体 block 匹配)。他们声称该算法使用 SAD cost_function 方法。 (ABOSLUE 差异的 SAD 总和)。 但是在代码中他们以
如果我像这样 decalre 一个 stereoBM 的实例 cv::StereoBM bmState; 编译器抛出错误: cannot declare field ‘bmState’ to be o
我一直致力于使用 StereoBM 类根据两个摄像头输入源生成视差图。 我可以创建一个指向变量 StereoBM *sbm;但是每当我调用一个函数时,都会出现发布版本的段错误。由于 malloc():
我正在尝试使用 StereoBM 获取两幅图像的视差图。我尝试了一些示例代码和图像。他们工作正常。然而,当我尝试自己的图像时,我得到了非常糟糕的 map ,非常嘈杂。 我的 StereoBM 参数 s
作为我项目的一部分,我将 SteroBM 类用于立体视觉。我正在从 2 个网络摄像头获取输入帧,并在不进行校正的情况下对输入帧灰度帧运行立体 block 匹配计算。我得到的输出与基本事实相去甚远(非常
我组装了一个立体摄像头装置,但在使用它制作良好的视差图时遇到了问题。这是两个校正后的图像和我用它们制作的视差图的示例: 如您所见,结果非常糟糕。更改 StereoBM 的设置不会有太大变化。 设置 两
我正在使用 opencv 库进行立体重建。我目前正在测试整流和立体匹配。我使用了 opencv 2.4.9 中的 stereoRectify 函数,我让它工作正常。我使用了来自该站点的测试数据: ht
Konolige 的 block 匹配算法的应用在 OpenCV 文档中没有充分解释。 CvStereoBMState 的参数影响由 cv::StereoBM 计算的差异的准确性。但是,没有记录这些参
当我初始化 StereoBM 对象时,出现错误“无法定义抽象类的对象”。我检查了 calib3d.hpp,发现 StereoBM 是一个抽象类。请给我一个解决方案,如何在 StereoBM 类中定义所
这是我的测试代码,用于实现一个简单的 testBM 算法,没有预过滤。但当窗口尺寸较大时,它需要大约 400 毫秒甚至更多,而 opencv 的 StereoBM(CPU 而非 GPU)需要 20 毫
我正在运行 cv::cuda::StereoBM,它可以在 Tesla K80 上运行。 (计算能力 3.7。)完全相同的代码,具有完全相同的系统库,它卡在 Geforce RTX 2080 Ti 上
我需要你的帮助来解决 OpenCV cv::StereoBM 中的一个问题,因为当我尝试编译以下代码时遇到错误: std::string myImgLeftString = myImgLeft.to
我是一名优秀的程序员,十分优秀!