我正在研究行人检测算法,并坚持使用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;
}
答案 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}");
}