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 回答