6

-- 更新 2 --

如果您使用单个相机来计算距离,以下文章非常有用(尽管它使用 Python 而不是 C++):Find distance from camera to object/marker using Python and OpenCV

最佳链接立体网络摄像头深度检测。这个开源项目的实现真的很清晰。

以下是原始问题。


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

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

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

您可以在下面找到获取每个像素的 x、y 和 z 坐标的代码片段。问题:Point.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);

--更新 1 --

例如,我生成了这个阈值图像(左侧相机)。我几乎拥有相同的正确相机。

在此处输入图像描述

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

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

4

3 回答 3

2

请参阅此链接:OpenCV:如何使用图像计算相机和物体之间的距离?查找从相机到已知大小的物体的距离http://answers.opencv.org/question/5188/measure-distance-from-detected-object-using-opencv/
如果它不能解决你的问题,写更多详细信息 - 为什么它不工作等。

于 2013-06-14T09:37:49.880 回答
2

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

下面是一个给定视差图像(以像素为单位)和输入图像宽度为 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)

这个方程只适用于“toe-in”相机系统,平行相机装置将使用一个稍微不同的方程来避免无穷大值,但我现在把它留在这里。如果您需要并行的东西,请告诉我。

于 2017-04-26T23:06:30.787 回答
-1
if len(puntos) == 2:
    x1, y1, w1, h1 = puntos[0]
    x2, y2, w2, h2 = puntos[1]
    
    if x1 < x2:
        distancia_pixeles = abs(x2 - (x1+w1)) 
        distancia_cm = (distancia_pixeles*29.7)/720
        cv2.putText(imagen_A4, "{:.2f} cm".format(distancia_cm), (x1+w1+distancia_pixeles//2, y1-30), 2, 0.8, (0,0,255), 1,

cv2.LINE_AA) cv2.line(imagen_A4,(x1+w1,y1-20),(x2, y1-20),(0, 0, 255),2) cv2.line(imagen_A4,(x1+w1,y1 -30),(x1+w1, y1-10),(0, 0, 255),2) cv2.line(imagen_A4,(x2,y1-30),(x2, y1-10),(0, 0 , 255),2) 其他: distancia_pixeles = abs(x1 - (x2+w2)) distancia_cm = (distancia_pixeles*29.7)/720 cv2.putText(imagen_A4, "{:.2f} cm".format(distancia_cm), ( x2+w2+distancia_pixeles//2, y2-30), 2, 0.8, (0,0,255), 1, cv2.LINE_AA) cv2.line(imagen_A4,(x2+w2,y2-20),(x1, y2 -20),(0, 0, 255),2) cv2.line(imagen_A4,(x2+w2,y2-30),(x2+w2, y2-10),(0, 0, 255),2) cv2.line(imagen_A4,(x1,y2-30),(x1, y2-10),(0, 0, 255),2)

        cv2.imshow('imagen_A4',imagen_A4)

    cv2.imshow('frame',frame)    
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()

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

于 2021-06-20T22:55:08.763 回答