如何从EmguCv中的ConnectedComponentsWithStats获取统计信息

时间:2018-01-15 09:15:00

标签: c# emgucv connected-components

我正在研究行人检测算法,并坚持使用ConnectedComponentsWithStats()方法。我无法达到统计数据的价值。这是我到目前为止写的:

var labels = new Mat();
var stats = new Mat();
var centroids = new Mat();
var nLabels = CvInvoke.ConnectedComponentsWithStats(greyImage, labels, stats, centroids);

var centroidPoints = new MCvPoint2D64f[nLabels];
centroids.CopyTo(centroidPoints);

foreach (MCvPoint2D64f point in centroidPoints)
{
   var x = point.X;
   var y = point.Y;
}

1 个答案:

答案 0 :(得分:0)

统计数据在opencv c ++中存储为int32,并且有5个字段x,y,width,height和area。

您可以看到ConnectedComponentsWithStats here的opencv实现。 您还可以看到struct CCStatsOp opencv returns the stats as here

可悲的是,EMGUCV尚未创建数据结构CCStatsOp,因此您只需要存储原始整数数据。

  int[] statsData = new int[stats.Rows * stats.Cols];
  stats.CopyTo(statsData);
  for (int i = 0; i < stats.Rows; i++)
  {
    var x = statsData[i * stats.Cols + 0];
    var y = statsData[i * stats.Cols + 1];
    var width = statsData[i * stats.Cols + 2];
    var height = statsData[i * stats.Cols + 3];
    var area = statsData[i * stats.Cols + 4];
  }

您也可以在此处使用此代码滚动自己的CCStats操作。

STRUCT

public struct CCStatsOp
{
  public Rectangle Rectangle;
  public int Area;
}

代码

  var labels = new Mat();
  var stats = new Mat();
  var centroids = new Mat();
  var nLabels = CvInvoke.ConnectedComponentsWithStats(greyImage, labels, stats, centroids);

  var centroidPoints = new MCvPoint2D64f[nLabels];
  centroids.CopyTo(centroidPoints);

  CCStatsOp[] statsOp = new CCStatsOp[stats.Rows];
  stats.CopyTo(statsOp);
  foreach (var statop in statsOp)
  {
    Console.WriteLine($"Rectangle: {statop.Rectangle} Area: {statop.Area}");
  }