我正在使用Kinect传感器,我正在尝试对齐深度和颜色框架,以便我可以将它们保存为彼此"适合"的图像.我花了很多时间浏览msdn论坛和Kinect SDK的适度文档,我完全无处可去.
基于这个答案:Kinect:从RGB坐标转换为深度坐标
我有以下功能,在哪里depthData和colorData从中获取NUI_LOCKED_RECT.pBits并且mappedData是包含新颜色框架的输出,映射到深度坐标:
bool mapColorFrameToDepthFrame(unsigned char *depthData, unsigned char* colorData, unsigned char* mappedData)
{
INuiCoordinateMapper* coordMapper;
// Get coordinate mapper
m_pSensor->NuiGetCoordinateMapper(&coordMapper);
NUI_DEPTH_IMAGE_POINT* depthPoints = new NUI_DEPTH_IMAGE_POINT[640 * 480];
HRESULT result = coordMapper->MapColorFrameToDepthFrame(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, NUI_IMAGE_RESOLUTION_640x480, 640 * 480, reinterpret_cast<NUI_DEPTH_IMAGE_PIXEL*>(depthData), 640 * 480, depthPoints);
if (FAILED(result))
{
return false;
}
int pos = 0;
int* colorRun = reinterpret_cast<int*>(colorData);
int* mappedRun = reinterpret_cast<int*>(mappedData);
// For each pixel of new color frame
for (int …Run Code Online (Sandbox Code Playgroud) 我在Github上从源代码构建了OpenNI和Sensor并安装了Nite.我已经在Debian上使用2.6.39内核和不同版本的Java进行了测试,并在另一台使用Lubuntu 11.04和OpenNI unstable和avin2 Sensor的计算机上进行了测试 - 结果相同.我还测试了预建的二进制文件.
C++和.NET中的UserTracker示例有效,但UserTracker.java运行,检测我的轮廓,然后当我做出校准姿势时JVM崩溃.这是崩溃前的输出:
New user 1
Pose Psi detected for 1
Run Code Online (Sandbox Code Playgroud)
我试过玩代码,但我找不到导致它的代码片段 - 它不会崩溃PoseDetectedObserver.update.
以下是相关示例的链接:https://github.com/OpenNI/OpenNI/blob/master/Samples/UserTracker.java/org/OpenNI/Samples/UserTracker/UserTracker.java
有没有其他人遇到过这个问题,或者看到可能出现的问题?
编辑:我已经打开了SamplesConfig.xml中的日志,并且Java示例在启动时输出这些警告,而C++和.NET示例只有最后一个 - 这是我在日志中找到的唯一区别.
125 INFO OpenNI version is 1.3.2 (Build 3)-Linux-x86 (Jul 28 2011 03:43:14)
141 INFO Filter Info - minimum severity: WARNING, masks: ALL
2482 WARNING Failed loading lib: /usr/lib/libXnVFeatures_1_3_0.so: undefined symbol: xnOSStrFormat
2489 WARNING Failed to load '/usr/lib/libXnVFeatures_1_3_0.so' - missing dependencies?
4080 WARNING Failed loading lib: /usr/lib/libXnVHandGenerator_1_3_0.so: undefined symbol: xnOSStrFormat
4087 WARNING Failed …Run Code Online (Sandbox Code Playgroud) 从Kinect深度图获得两个连续的3D点云1和2(不是整个云,比如用OpenCV的GoodFeaturesToMatch从云中选择的100个点),我想从1到2计算摄像机的单应性.我理解这是一个投影变换,它已经由很多人完成了:这里(幻灯片12),这里(幻灯片30)和这里似乎是经典论文.我的问题是,虽然我是一名称职的程序员,但我没有数学或触发技巧将其中一种方法转化为代码.由于这不是一个简单的问题,我为解决以下问题的代码提供了大量的赏金:
相机位于原点,沿Z方向看,不规则的五面体[A,B,C,D,E,F]:

相机向左移动-90mm(X),向上移动60mm(Y),向前移动+ 50mm(Z)并向下旋转5°,向右旋转10°,逆时针旋转-3°:

旋转整个场景以使相机返回其原始位置允许我在2处确定顶点的位置:

以下是顶点之前和之后的位置,内在函数等:

请注意,camera2的顶点不是100%准确,有一些故意的噪音.
我需要的代码,必须可以很容易地翻译成VB.Net或C#,必要时使用EMGUCV和OpenCV,获取2组顶点和内在函数并生成此输出:
Camera 2 is at -90 X, +60 Y, +50 Z rotated -5 Y, 10 X, -3 Z.
The homography matrix to translate points in A to B is:
a1, a2, a3
b1, b2, b3
c1, c2, c3
Run Code Online (Sandbox Code Playgroud)
我不知道单应性坐标的单应性是3X3还是3X4,但它必须允许我将顶点从1转换为2.
我也不知道值a1,a2等; 那是你必须找到的; ;-)
500赏金提供'替换'我提供给这个非常相似的问题的赏金,我在那里添加了一个指向这个问题的评论.
编辑2:我想知道我问这个问题的方式是否具有误导性.在我看来,问题更多的是点云拟合而不是相机几何(如果你知道如何平移和旋转A到B,你知道相机变换,反之亦然).如果是这样,那么也许可以用Kabsch的算法或类似的方法获得解决方案
我正在使用Microsoft Kinect SDK从Kinect获取深度和颜色信息,然后将该信息转换为点云.我需要深度信息在真实世界坐标中,以相机中心为原点.
我见过很多转换函数,但这些函数显然适用于OpenNI和非Microsoft驱动程序.我已经读过来自Kinect的深度信息已经是以毫米为单位,并且包含在11位......或其他内容中.
如何将此位信息转换为我可以使用的真实世界坐标?
提前致谢!
目前我正在为Kinect for Windows v2开发一个工具(类似于XBOX ONE中的那个).我尝试了一些示例,并有一个工作示例,显示相机图像,深度图像,以及使用opencv将深度映射到rgb的图像.但是我看到它在进行映射时重复了我的手,我认为这是由于坐标映射器部分出了问题.
这是一个例子:

这是创建图像的代码片段(示例中的rgbd图像)
void KinectViewer::create_rgbd(cv::Mat& depth_im, cv::Mat& rgb_im, cv::Mat& rgbd_im){
HRESULT hr = m_pCoordinateMapper->MapDepthFrameToColorSpace(cDepthWidth * cDepthHeight, (UINT16*)depth_im.data, cDepthWidth * cDepthHeight, m_pColorCoordinates);
rgbd_im = cv::Mat::zeros(depth_im.rows, depth_im.cols, CV_8UC3);
double minVal, maxVal;
cv::minMaxLoc(depth_im, &minVal, &maxVal);
for (int i=0; i < cDepthHeight; i++){
for (int j=0; j < cDepthWidth; j++){
if (depth_im.at<UINT16>(i, j) > 0 && depth_im.at<UINT16>(i, j) < maxVal * (max_z / 100) && depth_im.at<UINT16>(i, j) > maxVal * min_z /100){
double a = i * cDepthWidth + j; …Run Code Online (Sandbox Code Playgroud) 我的问题是:如何让Kinect for Windows V2跟踪数据到Javascript for HTML5游戏或其他浏览器黑客.
我使用Zigfu浏览器插件和我的旧Kinect在浏览器中使用Javascript,这也适用于我的Macintosh.我也知道微软已经发布了用于web开发的kinect.js v1.8.还有一个名为pgte/node-openni(在GIT上查找)的节点包,使您可以使用Web套接字获取Kinect数据.问题是没有这些与新传感器一起工作.
我之所以认为这是可能的原因是因为我找到了这些项目并且它们似乎与Javascript和新传感器一起工作正常但我无法从这些文章中提取足够的信息来开始开发:
项目1:http: //blog.derivatived.com/posts/Kinect-version-2-Operated-Robot-Hand/
我已经开始研究OpenKinect开发了,首先,我想弄清楚如何寻找这个人完成的某些手势.
有没有关于如何做到这一点的教程?或者什么是一个好的开始?
例如,我只是想知道一个人在一个方向或另一个方向转动手的事情.虽然,我当然感谢任何形式的帮助!
更新:据我所知,我将最有可能使用OpenNI/NITE框架,此外还有ONIPY Python包装器.因此,除非有更好的框架,否则我只需要弄清楚如何制作自己的手势.
我试图从kinect获得的深度图像中减去背景.当我学会了什么otsu阈值时,我认为它可以用它.将深度图像转换为灰度,我希望可以应用otsu阈值来对图像进行二值化.
不过我用OpenCV 2.3实现了这个(试图实现),但是徒劳无功.然而,非常意外地将输出图像二值化.我连续进行了阈值处理(即将结果打印到屏幕上以分析每一帧),并发现对于某些帧,阈值被发现为160ish,有时它被发现为0.我不太明白为什么会发生这种情况.可能是由于kinect返回的深度图像中的0的高数量,这对应于无法测量的像素.有没有办法可以告诉算法忽略值为0的像素?或者otsu阈值对我想做的事情不好?
以下是相关代码的一些输出和部分.您可能会注意到第二个屏幕截图看起来可以做一些很好的二值化,但是我希望实现一个能够区分对应于场景中的椅子和背景的像素.
谢谢.
cv::Mat1s depthcv(depth->getHeight(), depth->getWidth());
cv::Mat1b depthcv8(depth->getHeight(), depth->getWidth());
cv::Mat1b depthcv8_th(depth->getHeight(), depth->getWidth());
depthcv.data =(uchar*) depth->getDepthMetaData().Data();
depthcv.convertTo(depthcv8,CV_8U,255/5000.f);
//apply otsu thresholding
cv::threshold(depthcv8, depthcv8_th, 128, 255, CV_THRESH_BINARY|CV_THRESH_OTSU);
std::ofstream output;
output.open("output.txt");
//output << "M = "<< endl << " " << depthcv8 << endl << endl;
cv::imshow("lab",depthcv8_th);
cv::waitKey(1);
Run Code Online (Sandbox Code Playgroud)

我最近开始使用Kinect SDK 2.0,并专注于缩放和平移功能,如Control Basics-WPF示例中所示.
我已经启动并运行了缩放和平移功能.问题是我希望访问由Pinch缩放手势执行的缩放量的值.
这是我的xaml:
<UserControl x:Class="ImageNav.NavigationImage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:k="http://schemas.microsoft.com/kinect/2014"
mc:Ignorable="d"
d:DesignWidth="1200"
d:DesignHeight="700"
>
<Grid Grid.RowSpan="2">
<ScrollViewer Name="scrollViewer" Grid.Row="0"
HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
k:KinectRegion.IsHorizontalRailEnabled="true" k:KinectRegion.IsVerticalRailEnabled="true"
k:KinectRegion.ZoomMode="Enabled">
<Image Name="navigationImage" RenderTransformOrigin="0.5, 0.5" />
</ScrollViewer>
<TextBox x:Name="ZoomTextBox" Grid.Row="1" TextWrapping="Wrap" Text="Zoom: 100%" IsEnabled="False" Panel.ZIndex="10" BorderThickness="0" HorizontalAlignment="Right" VerticalAlignment="Bottom" FontSize="20"/>
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
我本来希望有类似的东西k:KinectRegion.ZoomFactor,但那是不可用的.我也想看看在UI元素,当我执行缩放手势,通过写什么样的变化Height和ActualHeight的性质ScrollViewer scrollViewer和Image navigationImage日志文件,但它们没有显示出任何的变化.
当我执行缩放手势时,我想获得缩放的值,即图像的当前高度和宽度相对于原始高度和宽度.
我最近开始使用pylibfreenect2在Linux上使用Kinect V2.
当我第一次能够在散点图中显示深度帧数据时,我很失望地看到没有任何深度像素似乎在正确的位置.
我做了一些研究,并意识到有一些简单的触发来完成转换.
为了测试,我开始使用pylibfreenect2中的预编写函数,该函数接受列,行和深度像素强度,然后返回该像素的实际位置:
X, Y, Z = registration.getPointXYZ(undistorted, row, col)
Run Code Online (Sandbox Code Playgroud)
使用getPointXYZ()或getPointXYZRGB()的唯一缺点是它们一次只能处理一个像素.这在Python中可能需要一段时间,因为它需要使用嵌套的for循环,如下所示:
n_rows = d.shape[0]
n_columns = d.shape[1]
out = np.zeros((n_rows * n_columns, 3), dtype=np.float64)
for row in range(n_rows):
for col in range(n_columns):
X, Y, Z = registration.getPointXYZ(undistorted, row, col)
out[row * n_columns + col] = np.array([Z, X, -Y])
Run Code Online (Sandbox Code Playgroud)
我试图更好地理解getPointXYZ()如何计算坐标.据我所知,它看起来类似于OpenKinect for Forfor函数:depthToPointCloudPos().虽然我怀疑libfreenect2的版本还有更多内容.
使用该gitHub源代码作为示例,然后我尝试在Python中重新编写它以进行我自己的实验,并出现以下内容:
#camera information based on the Kinect v2 hardware
CameraParams = {
"cx":254.878,
"cy":205.395,
"fx":365.456,
"fy":365.456,
"k1":0.0905474, …Run Code Online (Sandbox Code Playgroud) kinect ×10
kinect-sdk ×3
opencv ×3
c++ ×2
openni ×2
python ×2
c# ×1
homography ×1
java ×1
javascript ×1
libfreenect2 ×1
node.js ×1
numpy ×1
openkinect ×1
scrollview ×1
websocket ×1
wpf ×1