使用OpenCV进行伺服控制

时间:2013-05-01 00:03:44

标签: opencv

我将根据从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);
    }

1 个答案:

答案 0 :(得分:0)

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

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

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

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