基于OpenCV的伺服控制

基于OpenCV的伺服控制,opencv,Opencv,我将根据从OpenCV读取的坐标来跟踪对象。问题是:为了把我的伺服120度在积极的方式,我需要发送更多的3300伺服。(对于1度,我需要向伺服发送27.5个) 现在我需要找到从OpenCV读取的坐标和需要发送到伺服的值之间的关系。然而,我无法理解OpenCV的坐标。例如,我不更改对象的高度,我只减小对象和摄影机之间的距离,在这种情况下,只有z值应该减小,但看起来x值也会发生显著变化。原因是什么 如果我的代码有问题(可能x没有改变,但我读错了),你能给我一些关于OpenCV坐标的信息以及如何解释它

我将根据从OpenCV读取的坐标来跟踪对象。问题是:为了把我的伺服120度在积极的方式,我需要发送更多的3300伺服。(对于1度,我需要向伺服发送27.5个)

现在我需要找到从OpenCV读取的坐标和需要发送到伺服的值之间的关系。然而,我无法理解OpenCV的坐标。例如,我不更改对象的高度,我只减小对象和摄影机之间的距离,在这种情况下,只有z值应该减小,但看起来x值也会发生显著变化。原因是什么

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

问候

@FvD的edit1:

    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);
    }
inti;
对于(i=0;itotal;i++)
{
float*p=(float*)cvGetSeqElem(圆,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);
如果(val.val[0]<1)继续;
CV圆(框架,中心,3,CV_RGB(0255,0),-1,CV_AA,0);
cvCircle(框架,中心,cvRound(p[2]),CV_RGB(255,0,0),3,CV_AA,0);
cvCircle(最终保留,中心,3,CV_RGB(0255,0),-1,CV_AA,0);
cvCircle(最终保留,中心,cvRound(p[2]),CV_RGB(255,0,0),3,CV_AA,0);
}

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

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

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


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

你在说什么样的坐标?您是否使用立体相机设置?坐标指的是什么?它们是如何计算的?你的意思是球的中心和视差的图像坐标吗?@FvD我正在使用连接到伺服的网络摄像头。我的对象是圆形的,这里是我用来获取其中心坐标的:'CVGetSekelem(圆形,I);'现在根据这些坐标,我需要找出如果物体位移x量,我应该转动多少伺服。这不是很有用,就像说“x和y是整数”——这个命令只从序列“圆”中检索一个物体,它没有说明你使用的坐标的计算方式。实际的设置是什么?你在说什么样的坐标?它们是真实世界坐标还是图像坐标?更清楚的是:没有原生的“OpenCV坐标”,尽管你可以指图像矩阵的行和列。你必须在代码中找到那些坐标的定义位置(我猜你不是自己写的)。@FvD你是对的。这部分代码不是我写的。我在互联网上找到了它,根据printf输出,我以为我在读取对象的opencv坐标。那么,这些坐标是什么,它们是什么意思?(我通过编辑我的问题添加了代码的这一部分)