- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在制作人员计数器。为此,我在门上安装了 Microsoft Kinect。我正在使用 C# 和 EmguCV。我提取了人物的头部,使它们在黑色图像上显示为白色 Blob 。然后我在头部周围创建了一个边界框。那很好用。所以我现在每帧有多少 Blob ,现在我也知道它们的位置。这很好用。但现在我想跟踪这些 Blob ,因为我想计算有多少人进出,但我不知道该怎么做。谁能帮我?问题是每一帧都会出现新的 Blob ,而旧的 Blob 可能会消失。谁能给我一个算法或者一些代码?或一张纸。非常感谢!
当然。这是 blob 的代码:
using (MemStorage stor = new MemStorage())
{
Contour<System.Drawing.Point> contours = head_image.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL, stor);
for (int i = 0; contours != null; contours = contours.HNext)
{
i++;
//if ((contours.Area > Math.Pow(sliderMinSize.Value, 2)) && (contours.Area < Math.Pow(sliderMaxSize.Value, 2)))
{
MCvBox2D box = contours.GetMinAreaRect();
blobCount++;
contour_image.Draw(box, new Bgr(System.Drawing.Color.Red), 1);
new_position = new System.Drawing.Point((int)(box.center.X), (int)(box.center.Y));
new_x = box.center.X;
new_y = box.center.Y;
}
}
}
最佳答案
请参阅Emgu CV Blob Detection了解更多信息。假设您使用的是 Emgu CV 2.1 或更高版本,那么答案将有效。如果您使用的是 1.5 或更高版本,请参阅 this thread关于如何轻松检测 Blob 。或者看下面的代码
Capture capture = new Capture();
ImageViewer viewer = new ImageViewer();
BlobTrackerAutoParam param = new BlobTrackerAutoParam();
param.ForgroundDetector = new ForgroundDetector(Emgu.CV.CvEnum.FORGROUND_DETECTOR_TYPE.FGD);
param.FGTrainFrames = 10;
BlobTrackerAuto tracker = new BlobTrackerAuto(param);
Application.Idle += new EventHandler(delegate(object sender, EventArgs e)
{
tracker.Process(capture.QuerySmallFrame().PyrUp());
Image<Gray, Byte> img = tracker.GetForgroundMask();
//viewer.Image = tracker.GetForgroundMask();
MCvFont font = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0);
foreach (MCvBlob blob in tracker)
{
img.Draw(Rectangle.Round(blob), new Gray(255.0), 2);
img.Draw(blob.ID.ToString(), ref font, Point.Round(blob.Center), new Gray(255.0));
}
viewer.Image = img;
});
viewer.ShowDialog();
希望这对您有所帮助!
编辑
我认为您应该每十帧左右(大约每秒 3 次)使用此代码并执行如下操作:
Capture capture = new Capture();
ImageViewer viewer = new ImageViewer();
BlobTrackerAutoParam param = new BlobTrackerAutoParam();
param.ForgroundDetector = new ForgroundDetector(Emgu.CV.CvEnum.FORGROUND_DETECTOR_TYPE.FGD);
param.FGTrainFrames = 10;
BlobTrackerAuto tracker = new BlobTrackerAuto(param);
int frames = 0;
Application.Idle += new EventHandler(delegate(object sender, EventArgs e)
{
frames++;//Add to number of frames
if (frames == 10)
{
frames = 0;//if it is after 10 frames, do processing and reset frames to 0
tracker.Process(capture.QuerySmallFrame().PyrUp());
Image<Gray, Byte> img = tracker.GetForgroundMask();
//viewer.Image = tracker.GetForgroundMask();
int blobs = 0;
MCvFont font = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0);
foreach (MCvBlob blob in tracker)
{
//img.Draw(Rectangle.Round(blob), new Gray(255.0), 2);
//img.Draw(blob.ID.ToString(), ref font, Point.Round(blob.Center), new Gray(255.0));
//Only uncomment these if you want to draw a rectangle around the blob and add text
blobs++;//count each blob
}
blobs = /*your counter here*/;
blobs = 0; //reset
viewer.Image = img;//get next frame
});
viewer.ShowDialog();
编辑 2
听起来你只是想识别 Blob ,听起来你想要 McvBlob.ID
.这是 blob 的 ID,您可以检查哪些 ID 仍然存在,哪些不存在。我仍然会每十帧执行一次,以免减慢速度。您只需要一个可以观察 ID 是什么以及它们是否已更改的简单算法。我会将 ID 存储在 List<string>
中并每隔几帧检查该列表是否有更改。示例:
List<string> LastFrameIDs, CurrentFrameIDs;
Capture capture = new Capture();
ImageViewer viewer = new ImageViewer();
BlobTrackerAutoParam param = new BlobTrackerAutoParam();
param.ForgroundDetector = new ForgroundDetector(Emgu.CV.CvEnum.FORGROUND_DETECTOR_TYPE.FGD);
param.FGTrainFrames = 10;
BlobTrackerAuto tracker = new BlobTrackerAuto(param);
int frames = 0;
Application.Idle += new EventHandler(delegate(object sender, EventArgs e)
{
frames++;//Add to number of frames
if (frames == 10)
{
frames = 0;//if it is after 10 frames, do processing and reset frames to 0
tracker.Process(capture.QuerySmallFrame().PyrUp());
Image<Gray, Byte> img = tracker.GetForgroundMask();
//viewer.Image = tracker.GetForgroundMask();
int blobs = 0, i = 0;
MCvFont font = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0);
foreach (MCvBlob blob in tracker)
{
i++;
//img.Draw(Rectangle.Round(blob), new Gray(255.0), 2);
//img.Draw(blob.ID.ToString(), ref font, Point.Round(blob.Center), new Gray(255.0));
//Only uncomment these if you want to draw a rectangle around the blob and add text
CurrentFrameIDs.Add(blob.ID.ToString());
if (CurrentFrameIDs[i] == LastFrameIDs[i])
img.Draw(Rectangle.Round(blob), new Gray(0,0), 2);//mark the new/changed blob
blobs++;//count each blob
}
blobs = /*your counter here*/;
blobs = 0; //reset
i = 0;
LastFrameIDs = CurrentFrameIDs;
CurrentFrameIDs = null;
viewer.Image = img;//get next frame
});
viewer.ShowDialog();
关于c# - 使用 Microsoft Kinect 跟踪 Blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14206699/
我在这里有点困惑。 Kinect 如何计算深度 : 我的理解是 IR 投影仪抛出一个图案,该图案被 IR 摄像机反射回来并读取。 现在红外摄像机知道特定深度的模式。利用传入模式和已知模式之间的差异来计
我希望使用 Kinect ToF 相机进行编程,但是我不确定这样做的硬件和软件要求。我遇到了一些涵盖这个主题的文章/书籍,但似乎有一些不一致的地方让我有些困惑。 问题 我需要购买什么 Kinect 产
我正在探索 kinect 的开发,希望能够识别手指而不是整只手。 kinect 官方 SDK 的骨骼 API 只有手关节 - 没有手指跟踪的规定。我还了解到,最近微软在新的 SDK 中包含了抓握识别
我正在探索 kinect 的开发,希望能够识别手指而不是整只手。 kinect 官方 SDK 的骨骼 API 只有手关节 - 没有手指跟踪的规定。我还了解到,最近微软在新的 SDK 中包含了抓握识别
这个问题与 Kaggle/CHALEARN 手势识别挑战有关。 您将获得大量匹配 RGB 和深度视频的训练集,这些视频是从 Kinect 录制的。我想在这些视频上使用 Kinect SDK 的骨骼跟踪
我希望我的几个开发人员立即开始使用 Kinect SDK,而且时间紧迫。因为他们不在美国,所以我需要花太多时间为他们购买 Kinect 以及在 PC 上使用它所需的电缆。 有没有一种方法可以让他们在没
我正在尝试使用 Xbox 360 的 Kinect 开发一个有趣的人脸识别应用程序。我想知道应该使用哪个 SDK 和 Visual Studio 版本才能最好地访问 Kinect。 最佳答案 Is K
我正在尝试创建一个应用程序来放大和缩小图像并通过 Kinect 旋转图像。到目前为止,它适用于任何一种情况。我想要的是,如果我旋转了图像,则在缩放时会保存新值,因此我会放大已旋转 X 度的图像。我现在
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我正在研究一种扩展方法,将一个骨架移动到 kinect 字段 os View 中的所需位置。 我的代码接收要移动的骨骼和命运位置,我计算接收到的骨骼臀部中心与命运位置之间的距离以找到how much
给定从 Kinect 深度图获得的两个连续 3D 点云 1 和 2(不是整个云,比如说使用 OpenCV 的 GoodFeaturesToMatch 从云中选择的 100 个点),我想从 1 到 2
任何人都可以使用 Raspberry Pi 从 Kinect 获取相机数据吗? 我们想制作一个无线 Kinect 使用以太网或 WiFi 连接它。否则,请告诉我您是否有可行的替代方案。 最佳答案 要回
例如,我站在 Kinect 前面。 Kinect 可以识别关节,并将它们作为数据结构公开。到目前为止我已经很清楚了。 那么,我们能否将高度定义为头关节 - ((LeftAnkle + RightAnk
我尝试将从 Kinect 接收的图像保存为 png。我从包装中取出了一个 kinect 样本,它在两个平面上显示了深度和颜色图片,我对它们进行了修改。我尝试了不同的方法,例如直接保存 color32
kinect 真的很新。我正在尝试阅读我找到的 Material 。我找到了技术规范和 .net API 文档,但可以弄清楚我正在尝试做的事情是否可行: 我可以指示 kinect 物理移动相机吗? (
据说 Microsoft SDK 可以访问 Kinect 的内在参数,但有人知道它返回的深度图像是否实际上是不失真的吗?我找不到任何相关内容。 如果我脱离主题,请告诉我,尽管我认为这是一个隐式编程问题
由于传感器之间存在红外干扰,因此使用多个 Kinect v1 传感器非常困难。 根据我读到的内容 this gamastura article ,微软通过 Kinect v2 传感器测量深度的飞行时间
我只是对 Kinect v2 的主动红外图像和深度图像之间的差异理解感到困惑。谁能告诉我主动红外图像与深度图像相比有什么特殊功能? 最佳答案 在深度图像中,像素的值与通过飞行时间测量的距相机的距离相关
我可以从 Kinect 获取深度帧,然后修改帧中的数据。 现在我想使用修改后的深度帧来获取骨架数据。 我该怎么做? 最佳答案 好吧,我发现使用 microsoft kinect sdks 无法做到这一
This programming guide暗示这是可能的,所以我想知道到底是什么。 但是,现在它不起作用。 主机操作系统为 Vista 64 位,VMWare Workstation 6.5.3 运
我是一名优秀的程序员,十分优秀!