Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算距离(视差)OpenCV_Opencv_Distance_Vision_Stereoscopy_Disparity Mapping - Fatal编程技术网

计算距离(视差)OpenCV

计算距离(视差)OpenCV,opencv,distance,vision,stereoscopy,disparity-mapping,Opencv,Distance,Vision,Stereoscopy,Disparity Mapping,--更新2-- 如果使用单个摄影机计算距离,下面的文章非常有用(尽管它使用的是Python而不是C++): 最佳链接是。这个开源项目的实现非常清楚 以下是原始问题 在我的项目中,我使用两个摄像头(立体视觉)来跟踪物体并计算距离。我用OpenCV的示例代码校准了它们,并生成了一个视差图 我已经实现了一种基于颜色跟踪对象的方法(这会生成一个阈值图像) 我的问题:如何使用视差贴图/矩阵计算到跟踪的彩色对象的距离 下面您可以找到一个代码片段,它获取每个像素的x、y和z坐标。问题是:点z是厘米,像素还是

--更新2--

如果使用单个摄影机计算距离,下面的文章非常有用(尽管它使用的是Python而不是C++):

最佳链接是。这个开源项目的实现非常清楚

以下是原始问题


在我的项目中,我使用两个摄像头(立体视觉)来跟踪物体并计算距离。我用OpenCV的示例代码校准了它们,并生成了一个视差图

我已经实现了一种基于颜色跟踪对象的方法(这会生成一个阈值图像)

我的问题:如何使用视差贴图/矩阵计算到跟踪的彩色对象的距离

下面您可以找到一个代码片段,它获取每个像素的x、y和z坐标。问题是:点z是厘米,像素还是毫米

我能用这个代码得到到被跟踪物体的距离吗

提前谢谢你

cvReprojectImageTo3D(disparity, Image3D, _Q);

vector<CvPoint3D32f> PointArray;
CvPoint3D32f Point;

for (int y = 0; y < Image3D->rows; y++) {    

    float *data = (float *)(Image3D->data.ptr + y * Image3D->step);  

    for (int x = 0; x < Image3D->cols * 3; x = x + 3) 
    {   
        Point.x = data[x];        
        Point.y =  data[x+1];     
        Point.z = data[x+2];
        PointArray.push_back(Point);
        //Depth > 10
        if(Point.z > 10)
        {
            printf("%f %f %f", Point.x, Point.y, Point.z);              
        }
    }
}
cvReleaseMat(&Image3D);
cvreprojectionmageto3d(视差,图像3d,_Q);
矢量点阵列;
CvPoint3D32f点;
对于(int y=0;yrows;y++){
浮点*数据=(浮点*)(Image3D->data.ptr+y*Image3D->step);
对于(int x=0;xcols*3;x=x+3)
{   
点x=数据[x];
点y=数据[x+1];
点z=数据[x+2];
点数组。向后推(点);
//深度>10
如果(z点>10)
{
printf(“%f%f%f”,点x,点y,点z);
}
}
}
cvReleaseMat(和Image3D);
--更新1--

例如,我生成了(左摄影机的)这个阈值图像。我几乎有同样的相机

除了上述阈值图像外,应用程序还生成视差图。如何在视差图中获得手部像素的Z坐标

实际上,我想获得手部像素的所有Z坐标,以计算平均Z值(距离)(使用视差图)。

请参见以下链接:,

如果它不能解决您的问题,请写更多的细节-为什么它不工作,等等。

将视差(以像素或图像宽度百分比为单位)转换为实际距离的数学已经有了很好的记录(不是很难),但我也将在这里记录它

以下是给定视差图像(以像素为单位)和2K(2048像素宽)图像的输入图像宽度的示例:

会聚距离由相机镜头之间的旋转决定。在这个例子中,它将是5米。会聚距离5(米)意味着5米以外的物体的视差为0

CD = 5 (meters)        
收敛距离的倒数为:1/CD

IZ = 1/5 = 0.2M
摄像机传感器的尺寸(米)

SS  = 0.035 (meters)    //35mm camera sensor
PW = SS/image resolution = 0.035 / 2048(image width) = 0.00001708984
FL = 0.07 //70mm lens
传感器上像素的宽度(以米为单位)

SS  = 0.035 (meters)    //35mm camera sensor
PW = SS/image resolution = 0.035 / 2048(image width) = 0.00001708984
FL = 0.07 //70mm lens
相机的焦距(以米为单位)

SS  = 0.035 (meters)    //35mm camera sensor
PW = SS/image resolution = 0.035 / 2048(image width) = 0.00001708984
FL = 0.07 //70mm lens
轴间距离:从左透镜中心到右透镜中心的距离

IA = 0.0025 //2.5mm
摄影机装备的物理参数组合

A = FL * IA / PW
相机调整的视差:(仅对于左视图,右视图将使用正[视差值])

从这里,您可以使用以下等式计算实际距离:

realDistance = 1 / (IZ – AD)
这个方程只适用于“前束”相机系统,平行相机装备将使用一个稍微不同的方程来避免无穷大的值,但我现在就把它留在这里。如果你需要类似的东西,请告诉我


我认为这是一种测量两个物体之间距离的好方法

请参见--更新--在第一篇文章中。@cyriel我们能用两个摄像机视图预测一个点的深度吗?你能反向计算吗,即用已知的摄像机参数拍摄一张深度图像并得到一张视差图吗?是的,这是一个可逆的方程。欢迎来到这里,请正确使用文本格式。