我试图从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)

我最近开始使用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) 这是我的情况:我们正在编写一个必须将Microsoft Kinect坐标转换为键盘和鼠标事件的应用程序.
当我们需要控制鼠标时,一切都按照我们在任何应用程序中的预期进行.当我们需要将键盘事件(如按键或键盘)发送到不处理Windows事件的应用程序(例如游戏)时,就会出现问题.
我们尝试了.net框架的SendKeys类,它只适用于Windows应用程序.当应用程序是像Half-Life或Doom这样的游戏时,我们无法获得相同的效果.所以,这是我的问题:我们如何有效地将键盘事件发送到这些其他应用程序?
微软声称Kinect的视角为垂直43度,水平57度(此处说明).鉴于这些,我们可以计算内在参数,即焦点和投影中心吗?我假设投影中心可以给出(0,0,0)?
谢谢
编辑:有关我正在尝试做什么的更多信息
我有一个用Kinect记录的图像数据集,我试图将像素位置(x_screen,y_screen和z_world(mm))转换为真实世界坐标.
如果我知道相机放置在真实世界坐标系中的点(x',y',z'),通过执行以下操作就足以找到真实世界的坐标:
x_world = (x_screen - c_x) * z_world / f_x
y_world = (y_screen - c_y) * z_world / f_y
Run Code Online (Sandbox Code Playgroud)
其中c_x = x'和c_y = y'和f_x, f_y是焦距?而且,只要了解视野,我怎样才能找到焦距?
谢谢
这就是我想要做的
private KinectAudioSource CreateAudioSource()
{
var source = KinectSensor.KinectSensors[0].AudioSource;
source.NoiseSuppression = _isNoiseSuppressionOn;
source.AutomaticGainControlEnabled = _isAutomaticGainOn;
return source;
}
private object lockObj = new object();
private void RecordKinectAudio()
{
lock (lockObj)
{
using (var source = CreateAudioSource())
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
'using'语句给出了一个错误,指出 - "'Microsoft.Kinect.KinectAudioSource':在using语句中使用的类型必须可以隐式转换为'System.IDisposable'".如何消除此错误,这是什么意思?
这个编程指南暗示这是可能的,所以我想到了什么.
但是现在,它不起作用.
主机操作系统是Vista 64位,VMWare Workstation 6.5.3运行Windows 7企业版32位.
VM上安装的软件:
我插入Kinect,设备被VM识别,然后我运行Sample Shape Game,它无法识别设备.它说"插入Kinect然后重试",结果证明是错误0x80080014,这导致 http://social.msdn.microsoft.com/Forums/en-US/kinectsdknuiapi/thread/4da8c75e-9aad-4dc3- bd83-d77ab4cd2f82 / 这给了我两件事要看:
在设备管理器中,我看到一个包含Microsoft Kinect Audio Control,Microsoft Kinect Camera和Microsoft Kinect Device的"Microsoft Kinect"组,但除了VMware VMaudio之外,"声音,视频和游戏控制器"下没有任何内容.应该有"Kinect USB Audio".
我猜我还有一些与VMWare USB /硬件选项有关的问题(无论是带有USB/CD/HD /软盘等图标的托盘)还是一些巧妙的重启和(联合)插件组合,但我几乎没有热情.
有任何想法吗?TIA
编辑:我意识到我在OpenKinect的主机(Vista)系统上有一些挥之不去的驱动程序.删除后,我再也看不到VM中的Kinect了.嗯.
我希望我的几个开发人员立即开始使用Kinect SDK,时间紧迫.因为他们不在美国,所以我需要花费太多时间才能获得Kinect以及与PC一起使用所需的电缆.
有没有办法可以在没有物理硬件的情况下使用SDK?也许用模拟器或其他方法?
我想使用手势,因此kinect可以选择以手势为主要玩家的人.在此之后,他可以控制PC.选择该人并给予他们控制权已完成.现在我必须实现一个手势,但我不知道如何开始.
谁能帮我?
我正在尝试使用Kinect for Xbox 360开发面部识别应用程序.我想知道应该使用哪个SDK和Visual Studio版本来最佳地访问Kinect.
kinect ×10
c# ×4
events ×1
geometry ×1
gesture ×1
kinect-sdk ×1
libfreenect2 ×1
math ×1
mouse ×1
numpy ×1
opencv ×1
projection ×1
python ×1