我目前正在为我的大学研究项目.目标是使用Microsoft Kinect摄像头控制Mac.另一名学生正在编写Kinect驱动程序(它将安装在Mac后面的天花板或墙壁上的某个位置,并在Macs屏幕上输出所有手指的位置).
我有责任使用手指位置并对它们做出反应.目标是使用一根手指控制鼠标,并以同样的方式对多个手指做出反应,就像它们在触控板上一样.
我认为这将是简单而直接的,但事实并非如此.实际上很容易用一根手指控制鼠标光标(使用CGEvent),但不幸的是,没有用于创建和发布Multitouch-Gestures到系统的公共API.
我已经做了很多研究,包括在最低位置使用事件点击捕获所有CGEvents并尝试反汇编它们,但到目前为止还没有真正的进展.
比我偶然发现并意识到,即使是事件点击的最低位置也不够深入: 扩展Magic Mouse的功能:我需要一个kext吗?
当我做对了,内置的Trackpad(以及MagicMouse和MagicTrackpad)通过KEXT-Kernel-Extension与私有MultitouchSupport框架进行通信,该框架生成并以某种方式将传入数据发布到操作系统.
因此,我需要使用MultitouchSupport.framework中的私有API来执行与触控板相同的操作,对吧?或者我需要写一个KEXT-Extension?
如果我需要使用MultitouchSupport框架:我如何反汇编它以获得私有API?(我知道类转储,但这只适用于Objective-C-frameworks,而这个框架不是)
非常感谢您的回复!NexD.
我正在使用OpenNI开发深度处理(Xbox Kinect,Asus Xtion等)应用程序.
当传感器提供新的深度数据时,我需要一种非常简单快速的Windows窗体绘图方式(30或60 fps,具体取决于分辨率).
目前,当数据可用时,我从单独的线程中使双缓冲面板无效,然后在面板的paint方法中设置位图的像素,产生可预测的可怕5fps.
System.Drawing.Graphics似乎缺乏设置单个像素的快速方法,除非任何人都可以指示其他方式.
我确实只需要设置像素颜色,因此如果可能的话,我们希望避免使用第三方高速渲染API,并且理想情况下使用尽可能本地的东西.
有没有人有什么建议?
据说微软SDK可以访问Kinect的内部参数,但有人知道它返回的深度图像是否真的没有失真?我找不到任何相关的东西.
让我知道如果我不在话题,虽然我认为这是一个隐含的编程问题:)
编辑:我发现支持@ Coeffect的答案的其他一些有用的链接
您好我正在尝试做一些图像处理.我使用Microsoft Kinect来检测房间里的人.我得到深度数据,做一些背景减法工作,最后得到一个像这样的视频序列当一个人进入场景并走动时:
我放了一个视频,以便您可以看到视频中噪音的行为.不同的颜色代表不同的深度.白色代表空.你可以看到它很嘈杂,尤其是红色噪音.
我需要尽可能地摆脱除人类以外的一切.当我进行侵蚀/扩张(使用非常大的窗口大小)时,我可以摆脱很多噪音,但我想知道是否还有其他方法可以使用.特别是视频中的红噪声很难通过侵蚀/扩张来消除.
一些说明:
1)如果我们知道场景中没有人,但我们所做的背景减法是完全自动的,即使场景中有人,甚至当相机移动等时,也可以进行更好的背景减法.这是我们现在可以得到的最好的背景减法.
2)该算法将在嵌入式系统上实时工作.因此,算法越有效,越容易.而且它不一定是完美的.虽然也欢迎复杂的信号处理技术(也许我们可能会在另一个不需要嵌入式实时处理的项目中使用它们).
3)我不需要实际的代码.只是想法.
这是我在uni的第一个图形主题,并且实现的某些部分对我不起作用.我可以正确地绘制关节,但我正在尝试编写一个在关节之间放入"骨骼"的函数.在这一点上,骨头只是立方体,被转换为矩形棱柱,稍后我将尝试从搅拌机或其他东西引入适当的模型.
我的麻烦在于轮换.大约5个小时左右后,我的伴侣和我有一些工作,但是一旦你移动你的手臂或腿,立方体就会扭曲并看起来很奇怪.任何帮助,将不胜感激.以下是尝试绘制骨骼的功能.
private void DrawBone(Skeleton skeleton, JointType jointType0, JointType jointType1)
{
Joint joint0 = skeleton.Joints[jointType0];
Joint joint1 = skeleton.Joints[jointType1];
// If we can't find either of these joints, exit
if (joint0.TrackingState == JointTrackingState.NotTracked ||
joint1.TrackingState == JointTrackingState.NotTracked)
{
return;
}
// Don't draw if both points are inferred
if (joint0.TrackingState == JointTrackingState.Inferred &&
joint1.TrackingState == JointTrackingState.Inferred)
{
return;
}
// We assume all drawn bones are inferred unless BOTH joints are tracked
if (joint0.TrackingState == JointTrackingState.Tracked && joint1.TrackingState == JointTrackingState.Tracked) …Run Code Online (Sandbox Code Playgroud) 在解释问题之前,让我解释一下我的需要.我期待着一个手控应用程序.使用手掌和点击使用抓取/拳头导航.
目前,我正在使用Openni,这听起来很有前景,并且几乎没有一些例子在我的案例中有用,因为它在样本中构建了手动跟踪器.这符合我的目的.
我想问的是,
1)使用拳头/抓取探测器的最佳方法是什么?
我在提取的RGB数据上训练并使用了Adaboost拳头分类器,这非常好,但是,它有太多的错误检测才能继续前进.
所以,在这里我再提出两个问题
2)是否有其他好的图书馆能够使用深度数据来满足我的需求?
3)我们可以训练自己的手势,尤其是使用手指,因为有些论文指的是HMM,如果是的话,我们如何进行像OpenNI这样的图书馆?
是的,我尝试使用OpenNI中的中间件库,例如抓取探测器,但是,它们不能满足我的目的,因为它既不是开源也不符合我的需要.
除了我的问题,如果你有什么想法,那可以帮助我将被接受作为一个好建议.
我一直在从事图像处理和机器人技术的自我项目,而机器人像往常一样检测颜色并挑选物体,它试图检测板上的孔(类似于不同的多边形).为了更好地理解设置,这里是一张图片:

如您所见,我必须检测这些孔,找出它们的形状,然后使用机器人将物体装入孔中.我正在使用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)
功能匹配的可怕结果如下所示
.
我现在必须开始不同的功能匹配.我会发布进一步的更新.如果有人可以帮助消除偏移问题,那将非常有用.
我使用带有文件扩展名.xef的kinect工作室,使用Kinect for windows 2收集了一堆视频.
现在我想写一个程序来从它们加载数据,只是回放或保存为另一种格式,但我发现这样做的资源很少,有没有什么有用的资源呢?
我正在尝试对ROS中的kinect中的pointcloud进行一些分段.截至目前我有这个:
import rospy
import pcl
from sensor_msgs.msg import PointCloud2
import sensor_msgs.point_cloud2 as pc2
def on_new_point_cloud(data):
pc = pc2.read_points(data, skip_nans=True, field_names=("x", "y", "z"))
pc_list = []
for p in pc:
pc_list.append( [p[0],p[1],p[2]] )
p = pcl.PointCloud()
p.from_list(pc_list)
seg = p.make_segmenter()
seg.set_model_type(pcl.SACMODEL_PLANE)
seg.set_method_type(pcl.SAC_RANSAC)
indices, model = seg.segment()
rospy.init_node('listener', anonymous=True)
rospy.Subscriber("/kinect2/hd/points", PointCloud2, on_new_point_cloud)
rospy.spin()
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但因为for循环而非常慢.我的问题是:
1)如何有效地将PointCloud2消息转换为pcl pointcloud
2)我如何可视化云.
我有以下代码。我正在尝试将从 Kinect v1 检索的 16 位深度图像保存为 png 文件。我编写了以下代码示例:
def display_depth(dev, data, timestamp):
global keep_runningp
#cv2.imshow('Depth', frame_convert2.pretty_depth_cv(data))
cv2.imshow('Depth', frame_convert2.pretty_depth_cv(data))
print type(data)
print data.shape
depthf.write(repr(timestamp)+" Depth/"+repr(timestamp)+".png\n")
namef="Sample_dataset/Depth/"+repr(timestamp)+".png"
cv2.imwrite(namef,frame_convert2.pretty_depth(data))
if cv2.waitKey(10) == 27:
keep_running = False
Run Code Online (Sandbox Code Playgroud)
当我添加以下代码时它起作用,它将数据从 16 位无符号转换为 8 位无符号 NumPy 数组:
depth = depth.astype(np.uint8)
Run Code Online (Sandbox Code Playgroud)
没有这条线,我只是得到整个空白/白色 png 图像。但我需要一个 16 位的 png 文件。
如何将其保存为 16 位 png 文件?