我正在将 openNI 用于一些带有 kinect 传感器的项目。我想为深度图给出的用户像素着色。现在我有从白色到黑色的像素,但我想要从红色到黑色。我尝试过 alpha 混合,但我的结果只是我有从粉红色到黑色的像素,因为我添加了(使用 addWeight)红色+白色 = 粉红色。
这是我的实际代码:
layers = device.getDepth().clone();
cvtColor(layers, layers, CV_GRAY2BGR);
Mat red = Mat(240,320, CV_8UC3, Scalar(255,0,0));
Mat red_body; // = Mat::zeros(240,320, CV_8UC3);
red.copyTo(red_body, device.getUserMask());
addWeighted(red_body, 0.8, layers, 0.5, 0.0, layers);
Run Code Online (Sandbox Code Playgroud)
其中 device.getDepth() 返回带有深度图的 cv::Mat 并且 device.getUserMask() 返回带有用户像素(仅白色像素)的 cv::Mat
一些忠告?
编辑:还有一件事:多亏了sammy 的回答,我已经做到了。但实际上我没有完全从 0 到 255 的值,而是从(例如)123-220。
我将通过一个简单的 for 循环找到最小值和最大值(有更好的方法吗?),以及如何将我的值从 min-max 映射到 0-255 ?
我可以从我的Kinect获取深度帧,然后修改帧中的数据.现在我想使用修改后的深度帧来获取骨架数据.我该怎么做?
我找不到这个版本的 OpenNI 的安装说明。我有一个适用于 Windows 和 Mac OSX 10.8 的 Kinect。
它在OpenNI.org上列为可下载的,但该站点上没有安装说明(我可以找到)并且OpenNI2 Github 页面没有适用于 Mac 的说明。
所以,我尝试下载存储库并运行:
sudo ./install.sh
Run Code Online (Sandbox Code Playgroud)
与以前的版本一样。我没有得到任何回应,只是提示回来。当我跑
./Tools/NiViewer
Run Code Online (Sandbox Code Playgroud)
我得到
openDevice failed:
DeviceOpen using default: no devices found
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏!
我正在使用红外视图和深度视图进行 Kinect 项目。在红外视图中,使用 CVBlob 库,我能够提取一些二维兴趣点。我想找到这些二维点的深度。所以我想我可以直接使用深度视图,像这样:
coordinates3D[0] = coordinates2D[0];
coordinates3D[1] = coordinates2D[1];
coordinates3D[2] = (USHORT*)(LockedRect.pBits)
[(int)coordinates2D[1] * Width + (int)coordinates2D[0]] >> 3;
Run Code Online (Sandbox Code Playgroud)
我认为这不是获得深度的正确公式。我能够在深度视图中可视化感兴趣的 2D 点。如果我在红外视图中得到一个点 (x, y),然后我将它绘制为深度视图中 (x, y) 处的一个红点,
我注意到红点不在我期望的位置(在一个物体上) )。他们的位置存在系统性错误。
我认为深度视图和红外视图具有一一对应的关系,这与彩色视图和深度视图之间的对应关系不同。
这确实是真的还是 IR 和深度视图之间存在偏移?如果有偏移,我能以某种方式获得正确的深度值吗?
我正在使用一些简单的基于 openni 的处理应用程序来破解 Kinect,我打算很快发表一个演讲,我发现了一个似乎可以控制电机的 API。有一个 moveKinect 方法似乎已添加到主 ContextWrapper 界面,但我似乎无法让它工作。查看 svn 历史和发行说明,它似乎是去年添加的,并附有说明它不适用于最新驱动程序(5.1.02,Linux64)的说明。我试过调用该方法以提供度数和弧度值,但没有任何反应。我没有错误,也没有动作。有没有其他人玩过这个?我正在运行第二个到最新的处理 2.0 版本(处理 2.0.1 的链接不起作用)和我可以下载的最新 SImpleOpenNI 包。
我正在使用 OpenNI 和 OpenCV(但没有支持 openni 的最新代码)。如果我只是将深度通道发送到屏幕 - 它会看起来很暗并且难以理解。所以我想以一种颜色为用户显示一个深度通道,但无法找到如何在不损失准确性的情况下做到这一点。现在我这样做:
xn::DepthMetaData xDepthMap;
depthGen.GetMetaData(xDepthMap);
XnDepthPixel* depthData = const_cast<XnDepthPixel*>(xDepthMap.Data());
cv::Mat depth(frame_height, frame_width, CV_16U, reinterpret_cast<void*>(depthData));
cv::Mat depthMat8UC1;
depth.convertTo(depthMat8UC1, CV_8UC1);
cv::Mat falseColorsMap;
cv::applyColorMap(depthMat8UC1, falseColorsMap, cv::COLORMAP_AUTUMN);
depthWriter << falseColorsMap;
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,我得到的输出比 Windows 的 kinects 软件显示的更糟糕(丢失细节)。所以我正在寻找 OpenNI 或 OpenCV 中具有更好转换的函数。
我正在寻找一种使用 MATLAB 将 kinect RGB 和深度值转换为 XYZ 坐标的简单方法。我的目标是一个函数,其输入为:Kinect相机拍摄的每个点的 RGB 和深度值,以及每个点的 x、y 和 z 值的输出。
[RGB,深度] = RGB_D2XYZ(XYZ)
谢谢,本
我们使用Kinect和OpenNI Library捕获了一个3D图像,并使用此代码以OpenCV Mat的形式获得了rgb和深度图像.
main()
{
OpenNI::initialize();
puts( "Kinect initialization..." );
Device device;
if ( device.open( openni::ANY_DEVICE ) != 0 )
{
puts( "Kinect not found !" );
return -1;
}
puts( "Kinect opened" );
VideoStream depth, color;
color.create( device, SENSOR_COLOR );
color.start();
puts( "Camera ok" );
depth.create( device, SENSOR_DEPTH );
depth.start();
puts( "Depth sensor ok" );
VideoMode paramvideo;
paramvideo.setResolution( 640, 480 );
paramvideo.setFps( 30 );
paramvideo.setPixelFormat( PIXEL_FORMAT_DEPTH_100_UM );
depth.setVideoMode( paramvideo );
paramvideo.setPixelFormat( PIXEL_FORMAT_RGB888 );
color.setVideoMode( paramvideo );
puts( "Réglages des …Run Code Online (Sandbox Code Playgroud) 我目前正在使用Processing Kinect库来提供深度图.如果可能的话,我想知道如何将其用于创建2D骨架.这里没有寻找任何代码,只是我可以用来实现这些结果的一般过程.
另外,鉴于到目前为止我们已经在几个Kinect游戏中看到了这一点,难以同时运行多个骷髅吗?
kinect ×10
opencv ×4
openni ×3
arrays ×1
color-depth ×1
colors ×1
coordinates ×1
depth ×1
matlab ×1
numpy ×1
opengl ×1
processing ×1
python ×1