我正在为一些C++代码编写一些SWIG/Python绑定.这是所谓的Kinect的意外API,我有电机和LED功能的工作.解析和填充RGB和深度缓冲区的Listener类的回调似乎不会从SWIG调用.数据捕获线程显然已启动并开始占用CPU,但回调中没有调试行通过.什么是更好的方法来填充数据缓冲区并从python轻松访问它们?
class KinectListener
{
public:
virtual ~KinectListener(){};
virtual void KinectDisconnected(Kinect *K) {};
virtual void DepthReceived(Kinect *K) {};
virtual void ColorReceived(Kinect *K) {};
virtual void AudioReceived(Kinect *K) {};
};
Run Code Online (Sandbox Code Playgroud)
这是带有虚方法的监听器类,这个类的Python包装版本可以用来继承c ++类的监听器吗?我在C++中添加了一个最小的监听器,现在剩下的工作是使用类型映射有效地访问数组.目前我正在使用这个天真的类型图
%typemap(out) unsigned short [ANY] {
int i;
$result = PyList_New($1_dim0);
for (i = 0; i < $1_dim0; i++) {
PyObject *o = PyInt_FromLong((long)$1[i]);
PyList_SetItem($result,i,o);
}
}
Run Code Online (Sandbox Code Playgroud)
更好的选择?
有可能检测我是否用Kinect转动或倾斜我的头部.
最好使用Kinect SDK.我知道Forza 4会有一些头条新闻,但可以用SDK完成吗?
我一直在关注Kinect for Windows发行说明和功能,因为我想在我的项目中加入手势识别.
在上面的页面中,第一行提到"Kinect for Windows SDK使开发人员能够创建支持手势和语音识别的应用程序".语音识别API随SDK一起提供,可以随时使用.但是,我认为SDK中没有可用的手势识别API.Skeleton Tracking的API可以很容易地使用,但是必须进行定制以获得手势识别.
我已经看过Windows Media Center的视频由手势等和其他应用程序控制.我想知道所有这些应用程序是否都是自定义构建的并且必须编写自己的手势识别代码.
目前,在我的项目中,我正在使用Codeplex的Kinect DTW手势识别.我有两个问题 - > 1)看起来非常性能占用,并且通过我的应用程序启用此功能,我的应用程序在一段时间后抛出OutofMemory异常(PC规格非常高).2)不能说系统的健壮性.有时为某些人工作而不为其他人工作.
我想如果API已经内置,那么切换到这些就好了.这些是可用的还是分辨率是什么?
我正在尝试制作一个使用Microsoft语音识别API(使用Kinect)的C#程序,但我很难开始使用.我有使用声明
using Microsoft.Speech.AudioFormat;
using Microsoft.Speech.Recognition;
Run Code Online (Sandbox Code Playgroud)
但它给我的错误是"类型或名称空间名称'Speech'在命名空间'Microsoft'中不存在.你错过了程序集引用吗?"
有谁知道要添加什么?System.Speech没有做到这一点.
我正在玩新的Kinect SDK v1.0.3.190.(stackoverflow中的其他相关问题是以前的kinect sdk)我从Kinect获得深度和颜色流.由于使用不同的传感器捕获深度和RGB流,因此在两个帧之间存在未对准,如下所示.
只有RGB

只有深度

深度和RGB

我需要对齐它们,并且有一个名为MapDepthToColorImagePoint的函数正是为此目的.但它似乎不起作用.这是一个相同的混合(深度和映射颜色)结果,下面是使用以下代码创建的
Parallel.For(0, this.depthFrameData.Length, i =>
{
int depthVal = this.depthFrameData[i] >> 3;
ColorImagePoint point = this.kinectSensor.MapDepthToColorImagePoint(DepthImageFormat.Resolution640x480Fps30, i / 640, i % 640, (short)depthVal, ColorImageFormat.RgbResolution640x480Fps30);
int baseIndex = Math.Max(0, Math.Min(this.videoBitmapData.Length - 4, (point.Y * 640 + point.X) * 4));
this.mappedBitmapData[baseIndex] = (byte)((this.videoBitmapData[baseIndex]));
this.mappedBitmapData[baseIndex + 1] = (byte)((this.videoBitmapData[baseIndex + 1]));
this.mappedBitmapData[baseIndex + 2] = (byte)((this.videoBitmapData[baseIndex + 2]));
});
Run Code Online (Sandbox Code Playgroud)
哪里
depthFrameData -> raw depth data (short array)
videoBitmapData -> raw image data (byte array)
mappedBitmapData -> …Run Code Online (Sandbox Code Playgroud) 我用OpenCV计算了相机的内在和外在参数.现在,我想从屏幕坐标(u,v)计算世界坐标(x,y,z).
我是怎么做到的
注意,当我使用kinect时,我已经知道了z坐标.
任何帮助深表感谢.谢谢!
我正在研究一种扩展方法,将一个骨架移动到kinect字段os视图中的所需位置.
我的代码接收要移动的骨架和命运位置,我计算接收到的骨架髋关节中心和命运位置之间的距离how much to move,然后在应用此因子的关节中进行迭代.我的代码,实际上看起来像这样.
public static Skeleton MoveTo(this Skeleton skToBeMoved, Vector4 destiny)
{
Joint newJoint = new Joint();
///Based on the HipCenter (i dont know if it is reliable, seems it is.)
float howMuchMoveToX = Math.Abs(skToBeMoved.Joints[JointType.HipCenter].Position.X - destiny.X);
float howMuchMoveToY = Math.Abs(skToBeMoved.Joints[JointType.HipCenter].Position.Y - destiny.Y);
float howMuchMoveToZ = Math.Abs(skToBeMoved.Joints[JointType.HipCenter].Position.Z - destiny.Z);
float howMuchToMultiply = 1;
// Iterate in the 20 Joints
foreach (JointType item in Enum.GetValues(typeof(JointType)))
{
newJoint = skToBeMoved.Joints[item];
// This adjust, try to keeps the skToBeMoved …Run Code Online (Sandbox Code Playgroud) 我有一个C++项目,我正在使用OpenCV和Libfreenect.我不希望包含像OpenNI那样大而重的东西,并在此过程中创建OpenCV安装依赖项.我想使用此处提供的校准信息来解决并对齐RGB和深度图像.
基于相机矩阵和失真系数单独地分解图像非常容易.但现在我对如何使用校正和投影矩阵来对齐RGB和深度图像感到困惑,因此它们基本上从同一个角度向我展示了相同的东西.经过一段时间的搜索,我无法确定如何使用OpenCV.这是一个模糊的估计,可能会使用reprojectImageTo3D()和warpPerspective(),但我不知道如何.
我怎么能解决这个问题?我正在使用旧的XBOX360 Kinect(0-2047原始差异值范围).
UPDATE
这是我到目前为止编写的部分代码:
// I use callback functions to get RGB (CV_8UC3) and depth (CV_16UC1)
// I undistort them and call the following method
void AlignImages(cv::Mat& pRGB, cv::Mat& pDepth) {
rotationMat = (cv::Mat_<double_t>(3,3) << 9.9984628826577793e-01, 1.2635359098409581e-03, -1.7487233004436643e-02, -1.4779096108364480e-03, 9.9992385683542895e-01, -1.2251380107679535e-02, 1.7470421412464927e-02, 1.2275341476520762e-02, 9.9977202419716948e-01);
translationMat = (cv::Mat_<double_t>(3,1) << 1.9985242312092553e-02, -7.4423738761617583e-04, -1.0916736334336222e-02);
// make a copy in float to convert raw depth data to physical distance
cv::Mat tempDst;
pDepth.convertTo(tempDst, CV_32F);
// …Run Code Online (Sandbox Code Playgroud) 我探索运行的C#Kinect的手势可视化的可行性方案(像连续姿势基础项目https://github.com/angelaHillier/ContinuousGestureBasics-WPF)一内部泊坞的Windows容器.
这在理论上是否可行(在Docker for Windows容器中运行C#Kinect?)
如果1的答案是肯定的,这里有一些额外的细节:
我正在使用microsoft/dotnet-framework:4.7图像作为基础,我的初始Dockerfile如下所示:
FROM microsoft/dotnet-framework:4.7
ADD . /home/gesture
WORKDIR /home/gesture
Run Code Online (Sandbox Code Playgroud)
构建图像:
$ docker build -t kinect .
Run Code Online (Sandbox Code Playgroud)
打开容器:
$ docker run -dit --name kinectContainer kinect
Run Code Online (Sandbox Code Playgroud)
附加到PowerShell会话以围绕:
$ docker exec -it kinectContainer powershell
Run Code Online (Sandbox Code Playgroud)
当我尝试从Docker容器运行我的手势应用程序时,我收到以下错误(由于容器中没有安装Kinect SDK,因此预计会出现这种情况):
Unhandled Exception: System.BadImageFormatException: Could not load file or assembly 'Microsoft.Kinect, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependenc
ies. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: …Run Code Online (Sandbox Code Playgroud) 我一直在从事图像处理和机器人技术的自我项目,而机器人像往常一样检测颜色并挑选物体,它试图检测板上的孔(类似于不同的多边形).为了更好地理解设置,这里是一张图片:

如您所见,我必须检测这些孔,找出它们的形状,然后使用机器人将物体装入孔中.我正在使用kinect深度相机来获取深度图像.图片如下所示:

我想到如何使用相机检测孔洞,最初使用遮罩来移除背景部分和一些基于深度测量的前景部分,但是这并没有成功,因为在相机的不同方向上孔将与板合并...类似于排列(它完全变白).然后我遇到了adaptiveThreshold功能
adaptiveThreshold(depth1,depth3,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,7,-1.0);
Run Code Online (Sandbox Code Playgroud)
使用侵蚀,扩张和高斯模糊消除噪音; 它以更好的方式检测到孔,如下图所示.然后我使用了cvCanny边缘检测器来获得边缘,但到目前为止它还不如下图所示.之后我尝试了来自SIFT,SURF,ORB,GoodFeaturesToTrack的各种特征检测器,发现ORB给出了最好的时间和检测到的功能.在此之后,我尝试通过查找其关键点并匹配这些关键点来获得查询图像的相对相机姿势,以便为该findHomography函数提供良好的匹配.结果如下图所示:

最后,我想获得两个图像之间的相对相机姿势,并使用从solvePnP函数获得的旋转和平移向量将机器人移动到该位置.
那么有没有其他方法可以提高检测到的关键点检测和匹配孔的质量?
我也曾尝试过轮廓检测和近似,但近似的形状并不是很好:

我已经尝试调整阈值和canny函数的输入参数,但这是我能得到的最好的
另外,我的方法是让相机姿势正确吗?
更新:无论我尝试什么,我都无法获得良好的可重复功能来映射.然后我在网上看到深度图像的分辨率很低,它只用于掩蔽和获取距离等东西.所以,由于低分辨率的图像及其杂乱的边缘,这让我觉得功能不合适.所以我想到了检测RGB图像上的特征并使用深度图像来获得这些特征的距离.我得到的功能质量完全脱离了图表.它甚至检测到了主板上的螺丝!以下是使用GoodFeaturesToTrack关键点检测检测到的关键点.
.我遇到了另一个障碍,同时距离不正确的点距离.我搜索了可能的原因,很长一段时间后,由于相机之间的偏移,RGB和深度图像中存在偏移.我可以从前两个图像中看到这一点.然后,我在网上搜索了如何补偿这种偏移,但找不到有效的解决方案.
如果你们中的任何一个人可以帮助我补偿抵消,那就太好了!
更新:我无法正常使用goodFeaturesToTrack函数.该函数给出了Point2f类型的角点.如果你想计算描述符,我们需要关键点并将Point2f转换为Keypoint,下面的代码片段会导致缩放和旋转不变性的丢失.
for( size_t i = 0; i < corners1.size(); i++ )
{
keypoints_1.push_back(KeyPoint(corners1[i], 1.f));
}
Run Code Online (Sandbox Code Playgroud)
功能匹配的可怕结果如下所示
.
我现在必须开始不同的功能匹配.我会发布进一步的更新.如果有人可以帮助消除偏移问题,那将非常有用.
kinect ×10
c# ×4
opencv ×3
c++ ×2
calibration ×1
color-depth ×1
docker ×1
image ×1
keypoint ×1
kinect-sdk ×1
openkinect ×1
python ×1
swig ×1
windows ×1
wix ×1
wpf ×1