【问题标题】:What should be a good design for the following scenario?以下场景的好的设计应该是什么?
【发布时间】:2012-02-14 13:10:25
【问题描述】:

我们正在记录身体各个部位的位置。我们的硬件 (Microsoft Kinect) 提供多达 20 个人体关节的位置。它以大约 30 fps 的速度提供数据。位置还包括该特定关节的 X、Y 和 Z 坐标。一个特定的手势大约需要 3-4 秒,所以没有。帧数从 80 到 120 不等。我们的问题是存储和检索这些数据并对其进行处理。我们的术语如下:

Frame:考虑中的所有关节的快照 示例:特定手势的所有帧的集合

问题是我们正在试验,我们不知道项目中要使用多少关节的数据。所以它不是固定的。

现在考虑一个特殊的问题,比如存储数据。 SQL 查询是使用以下方法生成的。 http://pastebin.com/ga114cQm

如您所见,问题在于有很多代码重复。在另一个我们必须预处理数据的问题中,同样的事情也会发生。即使只预处理了 6 个关节,该方法的长度也太大了。 看看这里:http://pastebin.com/JVKWNDmZ

虽然它有效,但我不喜欢它。另外,如果我们使用像填充对象这样的封装而不是直接使用数组,会对性能造成多大影响?因为这是一个实时手势识别系统,我们不能承受太多的延迟。

如果问题不是很清楚,请告诉我你不明白的部分。由于我不想问一个很大的问题,所以我试图总结整个问题。

【问题讨论】:

  • 您应该使用到达的数据,而不是存储它,没有时间这样做。如果您必须识别手势,只需丢弃不属于手势本身的所有内容。
  • @vulkanino 是的,为了获得认可,我们正在这样做。但我们需要存储该日期以用于培训目的。

标签: oop design-patterns kinect software-design


【解决方案1】:

如果问题只是创建一个 SQL INSERT 指令来将值存储到数据库中,那么您的代码毫无意义。

您可以在数据库中创建一个存储过程,在代码中设置参数并调用该过程,例如:

SqlCommand cmd  = new SqlCommand("InsertKinectData", conn);
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add(new SqlParameter("@SkeletonX", sd.Position.X));
//...
cmd.ExecuteNonQuery();

要优化速度,请保持数据库连接打开,不要重新创建SqlCommand 或参数,只需在新值到达后立即将参数设置为新值,然后立即调用SP。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2014-07-31
    • 2015-03-12
    • 2014-12-22
    相关资源
    最近更新 更多