0

我将根据从 OpenCV 读取的坐标跟踪对象。事情是这样的:为了使我的舵机正向转动 120 度,我需要再向舵机发送 3300 个。(对于 1 度,我需要再向伺服器发送 27.5 度)。

现在我需要找到我从 OpenCV 读取的坐标和我需要发送到伺服的值的关系。但是我无法理解 OpenCV 的坐标。例如,我不改变物体的高度,我只减少物体和相机之间的距离,在这种情况下,只有 z 值应该减小,但 x 值似乎也发生了显着变化。这是什么原因?

万一我的代码有问题(也许 x 没有改变,但我读错了),你能给我有关 OpenCV 坐标以及如何解释它的信息吗?正如我在开始时所说,我需要找到一个关系,比如我的伺服转动多少度对应于我从 OpenCV 读取的球 X 坐标的多少变化?

问候

@FvD 的编辑 1:

    int i;
    for (i = 0; i < circles->total; i++)
    {

        float *p = (float*)cvGetSeqElem(circles, i);
        printf("Ball! x=%f y=%f r=%f\n\r",p[0],p[1],p[2] );
        CvPoint center = cvPoint(cvRound(p[0]),cvRound(p[1]));
        CvScalar val = cvGet2D(finalthreshold, center.y, center.x);

        if (val.val[0] < 1) continue;
        cvCircle(frame,  center, 3,             CV_RGB(0,255,0), -1, CV_AA, 0);
        cvCircle(frame,  center, cvRound(p[2]), CV_RGB(255,0,0),  3, CV_AA, 0);
        cvCircle(finalthreshold, center, 3,             CV_RGB(0,255,0), -1, CV_AA, 0);
        cvCircle(finalthreshold, center, cvRound(p[2]), CV_RGB(255,0,0),  3, CV_AA, 0);
    }
4

1 回答 1

0

通常,没有 OpenCV 坐标,但您会经常使用图像矩阵的列和行作为图像坐标。

如果您已校准相机,则可以将这些图像坐标转换为真实世界坐标。在一般情况下,您无法使用单个摄像机图像精确定位物体在空间中的位置,除非您有第二台摄像机(立体视觉)或有关场景的补充信息,例如,如果您正在检测地面上的物体并且您知道相机相对于地平面的方向和位置。在这种情况下,将你的球移向相机会导致意外的移动,因为它违反了它躺在地上的假设。

您提供的代码片段中的坐标是图像坐标。第三个“坐标”是在网络摄像头图像中检测到的圆形斑点的半径,前两个是图像中圆心的列和行。

我不确定你在测试中是如何移动球的,但如果球的中心在图像中保持静止并且你仍然得到不同的 x 坐标,你应该查看你正在使用的检测算法。

于 2013-05-02T08:27:21.107 回答