1

同様の質問がいくつか寄せられていることは承知していますが、まだ行き詰まっています。

Kinect を使用して再構築された 3D シーンをクリックすると、マウスの x、yz 座標が得られるコードの小さなセクションを作成しようとしています。私の目的は、ロボット アームの「移動」機能を作成することです。

ウィンドウフレームでマウスのxy位置を見つけて、それを画面のフレームに変換してから、最終的にシーンのフレームにする必要があると思います。これは正しいですか?また、ピクセルから深度値を読み取る方法がわかりませんか?

私は Visual Studio と C++ プログラミングにかなり慣れていないため、正しいコードを書くのに苦労しています。新しいクラスを作成して含めるか、ビューアー プロジェクトに直接挿入するかがわかりません。

ここに私が書いたものがありますが、変更する必要があると確信しています。

どんな助けでも大歓迎です。

トビー

void get_point_position_MOUSE(int event, int x, int y, int flags,
    void* depthMapZ) {
if (CV_EVENT_LBUTTONDOWN == event) {
    if (DISP_IMAGE_DEPTH != IPL_DEPTH_32F) {
        write_on_buffer(
                g_strdup_printf(
                        "This only supports IPL_DEPTH_32F images.\n"));
        return;
    }
    if (selectionMode != POINT_SEL_MODE_MOUSE) {
        write_on_buffer(g_strdup_printf("X: %f Y: %f\n", (float) x,
                (float) y));
        CvPoint3D32f points = getWorldCo_Ords((float) x, (float) y,
                (float) CV_IMAGE_ELEM((IplImage*) disparityMap, int, y, x));
        write_on_buffer(g_strdup_printf("X: %f Y: %f Z: %f\n", points.x,
                points.y,
                (float) CV_IMAGE_ELEM((IplImage*) disparityMap, int, y, x)));
        return;
    }
4

1 に答える 1

1

RGBDemo を使用している場合は、RGBImage にその情報を提供するメソッドがあります。最初に、2D 画像から 2D 深度画像にポイントをマップする必要があります (画像があった場合は、それらの座標で cv::Point pt を作成します。次に、ntk::RGBDImage から関数を呼び出すことができます。

cv::Point3f p3f = rgbdimage->calibration()->depth_pose->unprojectFromImage(pt, rgbdimage->depth()(pt));

このポイントには、世界の 3D 座標が含まれています (確かではありませんが、メートル単位だと思います)。

それが役に立ったことを願っています!

于 2012-12-14T12:58:40.863 に答える