private static List <InternalDataFormat> Processhdf5Container_DaimlerLidar(int fileIndex, Hdf5Container_LidarDaimler hdf5Container_inp) { List <InternalDataFormat> listOfData_out = new List <InternalDataFormat>(); MetaData.Hdf5_DaimlerLidar._importedContainers.Add(hdf5Container_inp); MetaData.Hdf5_DaimlerLidar._tableIndexToID.Add(new Dictionary <Tuple <int, int>, int>()); int containerRows = hdf5Container_inp._distances.GetLength(0); int containerCols = hdf5Container_inp._distances.GetLength(1); for (int j = 0; j < containerRows; j++) { for (int k = 0; k < containerCols; k++) { InternalDataFormat data = CreateInternalDataFormat(hdf5Container_inp, j, k); MetaData.Hdf5_DaimlerLidar._tableIndexToID[fileIndex].Add(new Tuple <int, int>(j, k), data._ID); if (hdf5Container_inp._pointValid[j, k] == 1) { listOfData_out.Add(data); } } } return(listOfData_out); }
/// <summary> /// this method sets the ground point attribute of the given internal data list to the right value /// </summary> /// <param name="listOfDataLists">List of internal data</param> public static void SetGroundLabels(List <InternalDataFormat> listOfDataLists) { int segmentCount = 3; float initialSeedDistanceThreshold = 0.3f; float seedDistanceThreshold = 0.2f; float covarIterations = 1; InternalDataFormat seed = new InternalDataFormat(0, Vector3.zero, 0, 2); List <InternalDataFormat> seedPoints = new List <InternalDataFormat>(); //List<List<InternalDataFormat>> cloudSegments = GetSimpleCloudSegments(listOfDataLists); //List<List<InternalDataFormat>> cloudSegments = GetCloudSegmentsSegmentedByYAxis(listOfDataLists, segmentCount); List <List <InternalDataFormat> > cloudSegments = GetCloudSegmentsSegmentedByYAndXAxis(listOfDataLists, segmentCount); for (int i = 0; i < cloudSegments.Count; i++) { List <InternalDataFormat> segmentData = cloudSegments.ElementAt(i); seedPoints = GetInitialSeedPoints(segmentData, initialSeedDistanceThreshold); for (int j = 0; j < covarIterations; j++) { List <Vector3d> points = new List <Vector3d>(); for (int m = 0; m < seedPoints.Count; m++) { var pos = seedPoints[m]._position; points.Add(new Vector3d(pos.x, pos.y, pos.z)); } OrthogonalPlaneFit3 estimatedGroundPlane = new OrthogonalPlaneFit3(points); Vector3 planeOriginPoint = new Vector3((float)estimatedGroundPlane.Origin.x, (float)estimatedGroundPlane.Origin.y, (float)estimatedGroundPlane.Origin.z); Vector3 planeNormal = new Vector3((float)estimatedGroundPlane.Normal.x, (float)estimatedGroundPlane.Normal.y, (float)estimatedGroundPlane.Normal.z); Plane estimatedGroundPlaneUnity = new Plane(planeNormal, planeOriginPoint); if (j == covarIterations - 1) { Util.DrawPlane(planeOriginPoint, planeNormal, planeNormal.magnitude * 2, i); } for (int k = 0; k < segmentData.Count; k++) { seed = cloudSegments.ElementAt(i).ElementAt(k); float distancePointToPlane = estimatedGroundPlaneUnity.GetDistanceToPoint(seed._position); if (distancePointToPlane <= seedDistanceThreshold) { seed._groundPointLabel = 1; seedPoints.Add(seed); } else { seed._groundPointLabel = 0; } } } } }