0

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);
    }
4

1 に答える 1

0

通常、OpenCV 座標はありませんが、画像行列の列と行を画像座標として頻繁に使用します。

カメラを調整した場合は、それらの画像座標を実際の座標に変換できます。一般的なケースでは、2 台目のカメラ (ステレオ ビジョン) またはシーンに関する補足情報がない限り、単一のカメラ画像で空間内のオブジェクトの位置を特定することはできません。地面に対するカメラの向きと位置。その場合、ボールをカメラに向かって動かすと、ボールが地面にあるという仮定に違反するため、予期しない動きが発生します。

提供されたコード スニペットの座標は画像座標です。3 番目の「座標」は、Web カメラ画像で検出された円形ブロブの半径で、最初の 2 つは画像内の円の中心の列と行です。

テストでボールをどのように動かしているかはわかりませんが、ボールの中心が画像内で静止したままであり、それでも x 座標が異なる場合は、使用している検出アルゴリズムを調べる必要があります。

于 2013-05-02T08:27:21.107 に答える