如何在opencv中访问视差值

如何在opencv中访问视差值,opencv,computer-vision,stereo-3d,Opencv,Computer Vision,Stereo 3d,哪个选项是正确的 disparity.at<short>(X,Y) disparity.at<uchar>(X,Y) 视差(X,Y) 在(X,Y)处的差异 我们是否必须将视差除以16.0才能得到正确的视差。 有些人在他们的博客中使用1。有些人使用了2。使用函数dispation.type()时,该类型很短。 我使用1访问得到的视差值非常高。使用StereoBM时,输出视差可以是CV\u 16S或CV\u 32F。当视差类型为CV_16S时,它是一个16位有符号单通道图

哪个选项是正确的

disparity.at<short>(X,Y)
disparity.at<uchar>(X,Y)
视差(X,Y) 在(X,Y)处的差异 我们是否必须将视差除以16.0才能得到正确的视差。 有些人在他们的博客中使用1。有些人使用了2。使用函数dispation.type()时,该类型很短。
我使用1访问得到的视差值非常高。

使用
StereoBM
时,输出视差可以是
CV\u 16S
CV\u 32F
。当视差类型为CV_16S时,它是一个16位有符号单通道图像,包含按16缩放的视差值。要从这种定点表示中获得真实的视差值,需要将每个元素除以16。如果视差的类型为
CV\u 32F
,则视差贴图将已经包含输出上的真实视差值。

如果使用OpenCV 2.4.x,您必须查看以下信息:

视差–输出视差图。它与输入图像的大小相同。当disptype==CV_16S时,贴图为16位有符号单通道图像,包含按16缩放的视差值。要从这种定点表示中获得真实的视差值,需要将每个disp元素除以16。如果disptype==CV_32F,视差贴图将已经包含输出上的实际视差值

因此,如果在计算过程中选择了
disptype=CV_16S
,则可以通过以下方式访问像素位置(X,Y)处的像素:

如果在计算过程中选择了
disptype=CV_32F
,则可以直接访问视差:

float disparity = disparity.at<float>(Y,X);
浮动视差=视差。在(Y,X)处;
使用
.at
访问视差矩阵肯定是错误的


请注意,不同的OpenCV版本可能存在差异

我看不出1和2之间有什么区别。我遗漏了什么吗?很抱歉,遗漏了…我是在…我在里面写东西时没有使用插入代码选项。你从哪里得到差异值的?Kinect捕获库通常提供16位无符号值(但深度,而不是差异),这将是
。在
时,其他方法可能会计算
值,甚至可能是
或其他方法。您可以尝试打印
差异.深度
并告诉我们。还有一件事要提:如果你的X和Y是图像符号X和Y,那么你的访问是错误的,应该是
。在(Y,X)
。在(cv::Point(X,Y))
我有两张来自KITTI数据集的立体对图像。我正在使用opencv中提供的stereoBM查找视差。如果使用
StereoMatcher::compute
创建视差,您可以查看文档:
视差–输出视差图。它与输入图像的大小相同。有些算法,如StereoBM或StereoSGBM计算16位定点视差图(其中每个视差值有4个分数位),而其他算法输出32位浮点视差图。
这是一种16位类型,因此肯定是错误的。不确定固定点4个分数位的东西谢谢你的回答…我用(X,Y)代替(Y,X)并且得到deg错误…谢谢你,玩得开心!
.at
(Y,X)
顺序访问有点令人困惑,但这是因为它是一个矩阵,数学矩阵惯例是先索引行,再索引列。而图像通常具有X轴优先访问像素。
float disparity = pixVal / 16.0f;
float disparity = disparity.at<float>(Y,X);