我意识到已经提出了一些类似的问题,但我仍然被卡住了。
我正在尝试编写一小段代码,当点击使用kinect重建的3D场景时,该代码将给出鼠标的x,yz协调。我的目标是为机器人手臂创建一个“转到”功能。
我想我需要在窗口框架中找到鼠标xy位置,然后在最终场景框架之前将其转换为屏幕框架。这是正确的吗?另外我无法弄清楚如何从像素中读取深度值?
我是视觉工作室和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;
}
答案 0 :(得分:1)
如果您使用RGBDemo,RGBImage中的方法比给您提供信息。 首先,您需要将点从2D图像映射到2D深度图像(如果您的图像已经存在并创建带有这些坐标的cv :: Point pt)。 然后从ntk :: RGBDImage中调用函数:
cv::Point3f p3f = rgbdimage->calibration()->depth_pose->unprojectFromImage(pt, rgbdimage->depth()(pt));
此点包含世界的3D坐标(不确定,但我认为它以米为单位)
希望它有所帮助!