- 更新2 -
如果您使用单个摄像头计算距离,以下文章非常有用(尽管它使用的是Python而不是C ++):Find distance from camera to object/marker using Python and OpenCV
最好的链接是Stereo Webcam Depth Detection。这个开源项目的实施非常清楚。
以下是原始问题。
对于我的项目,我使用两个摄像头(立体视觉)来跟踪物体并计算距离。我用OpenCV的示例代码校准它们并生成视差图。
我已经实现了一种基于颜色跟踪对象的方法(这会生成一个阈值图像)。
我的问题:如何使用视差图/矩阵计算到跟踪彩色物体的距离?
您可以在下面找到获取每个像素的x,y和z坐标的代码段。问题是:Point.z是cm,像素,mm?
我可以使用此代码获取跟踪对象的距离吗?
先感谢您!
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);
- 更新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
轴间距:从左镜头中心到右镜头中心的距离
IA = 0.0025 //2.5mm
相机装备物理参数的组合
A = FL * IA / PW
相机调整后的差异:(仅对于左视图,右视图将使用正[视差值])
AD = 2 * (-[disparity value] / A)
从这里您可以使用以下等式计算实际距离:
realDistance = 1 / (IZ – AD)
这个等式仅适用于“前束”相机系统,平行相机装置将使用略微不同的等式来避免无穷大值,但我现在暂时不论它。如果您需要并行的东西,请告诉我。