//find an image by filename private SkyImage findImage(string file) { SkyImage si = _context.SkyImages.Where(c => c.filename == file).Include(x => x.detectedObjects) .ThenInclude(y => y.bbox).FirstOrDefault(); return(si); }
public async Task <IActionResult> PutSkyImage(int id, [FromBody] SkyImage skyImage) { if (id != skyImage.skyImageId) { return(BadRequest()); } _context.Entry(skyImage).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!SkyImageExists(id)) { return(NotFound()); } else { throw; } } return(NoContent()); }
private int findImageSet(SkyImage si) { //gather all images from the last 60 seconds with same camera var cutOffDate = (si.date).Subtract(new TimeSpan(0, 0, 30)); var recentPics = _context.SkyImages.Where(c => c.camera == si.camera && (c.date > cutOffDate)) .Include(x => x.detectedObjects) .ThenInclude(y => y.bbox).ToList(); var meteors = si.detectedObjects.Where(x => x.skyObjectClass.Contains("meteor")); foreach (SkyImage skyI in recentPics) { //check if bounding boxes intersect foreach (SkyObjectDetection recentdetObj in skyI.detectedObjects) { if (recentdetObj.skyObjectClass.Contains("meteor")) { Rectangle r1 = new Rectangle(recentdetObj.bbox.xmin, recentdetObj.bbox.ymin, recentdetObj.bbox.xmax - recentdetObj.bbox.xmin, recentdetObj.bbox.ymax - recentdetObj.bbox.ymin); foreach (SkyObjectDetection meteordetObj in meteors) { Rectangle r2 = new Rectangle(meteordetObj.bbox.xmin, meteordetObj.bbox.ymin, meteordetObj.bbox.xmax - meteordetObj.bbox.xmin, meteordetObj.bbox.ymax - meteordetObj.bbox.ymin); if (r1.IntersectsWith(r2)) { //intersection found...add to set return(skyI.imageSet); } } } } } //no intersections int maxCount = 0; var maxImage = _context.SkyImages.OrderByDescending(u => u.imageSet).FirstOrDefault(); if (maxImage != null) { maxCount = maxImage.imageSet; } maxCount++; return(maxCount); }
public object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview) { if (source == null) { return(null); } var udis = (Udi[])source; var mediaItems = new List <SkyImage>(); if (UmbracoContext.Current == null) { return(source); } var helper = new UmbracoHelper(UmbracoContext.Current); if (udis.Any()) { foreach (var udi in udis) { var item = helper.TypedMedia(udi); if (item != null) { mediaItems.Add(SkyImage.GetFromContent(item)); } } //if (udis.Length > 1) //{ // return mediaItems; //} //else //{ // return mediaItems.FirstOrDefault(); //} return(mediaItems); } return(source); }
public async Task <ActionResult <IEnumerable <SkyImage> > > LoadSkyImages() { var directory = new DirectoryInfo("c:\\meteorsXML\\meteor_corpus"); var files = directory.GetFiles("*.xml"); //.Where(file => file.LastWriteTime >= from_date && file.LastWriteTime <= to_date); int skyObjectId = 0; int resize = 512; //resize to square decimal xFactor = 0; decimal yFactor = 0; int bbId = 0; foreach (FileInfo afile in files) { if (afile != null) { SkyImage si = new SkyImage(); si.detectedObjects = new List <SkyObjectDetection>(); string file = afile.FullName; XElement boxxml = XElement.Load(afile.FullName); foreach (XElement xe in boxxml.Elements()) { if (xe.Name.ToString().ToLower() == "size") { foreach (XElement xeSize in xe.Elements()) { if (xeSize.Name.ToString().ToLower() == "width") { //assuming size comes before detected objects si.width = Convert.ToInt16(xeSize.Value); xFactor = 512 / Convert.ToDecimal(si.width); si.width = 512; } if (xeSize.Name.ToString().ToLower() == "height") { si.height = Convert.ToInt16(xeSize.Value); yFactor = 512 / Convert.ToDecimal(si.height); si.height = 512; } } } } // foreach (XElement xe in boxxml.Elements()) { if (xe.Name.ToString().ToLower() == "filename") { si.filename = xe.Value; } if (xe.Name.ToString().ToLower() == "camera") { si.camera = xe.Value; } if (xe.Name.ToString().ToLower() == "date") { si.date = DateTime.ParseExact(xe.Value, "MM/dd/yyyy hh:mm:ss tt", null); } if (xe.Name == "object") { var newObject = new SkyObjectDetection(); skyObjectId = skyObjectId + 1; //newObject.skyObjectID = skyObjectId; foreach (XElement xe2 in xe.Elements()) { switch (xe2.Name.ToString()) { case "name": newObject.skyObjectClass = xe2.Value; break; case "score": newObject.score = Convert.ToDecimal(xe2.Value); break; case "bndbox": var newBBox = new BoundingBox(); bbId++; foreach (XElement xe3 in xe2.Elements()) { switch (xe3.Name.ToString()) { case "xmin": newBBox.xmin = Convert.ToInt32((Convert.ToDecimal(int.Parse(xe3.Value)) * xFactor)); break; case "xmax": newBBox.xmax = Convert.ToInt32((Convert.ToDecimal(int.Parse(xe3.Value)) * xFactor)); break; case "ymin": newBBox.ymin = Convert.ToInt32((Convert.ToDecimal(int.Parse(xe3.Value)) * yFactor)); break; case "ymax": newBBox.ymax = Convert.ToInt32((Convert.ToDecimal(int.Parse(xe3.Value)) * yFactor)); break; default: break; } } //newBBox.boundingBoxId = bbId; newObject.bbox = newBBox; break; default: break; } } si.detectedObjects.Add(newObject); } } _context.Add(si); } } await _context.SaveChangesAsync(); return(NoContent()); }
public async Task <ActionResult> ReorderImageSet() { //gather all images from the last 60 seconds with same camera foreach (SkyImage si in _context.SkyImages) { si.imageSet = -1; } await _context.SaveChangesAsync(); var allMeteors = _context.SkyImages.Include(x => x.detectedObjects) .ThenInclude(y => y.bbox).OrderBy(y => y.camera).OrderBy(x => x.date); int maxCount = 1; SkyImage anImage = new SkyImage(); anImage.imageSet = 0; anImage.camera = ""; foreach (SkyImage aMeteor in allMeteors) { aMeteor.imageSet = maxCount; DateTime minDate = aMeteor.date - new TimeSpan(0, 0, 15); DateTime maxDate = aMeteor.date + new TimeSpan(0, 0, 15); var allMeteors2 = _context.SkyImages.Where(z => z.date > minDate && z.date < maxDate && z.camera == aMeteor.camera).Include(x => x.detectedObjects) .ThenInclude(y => y.bbox).OrderBy(y => y.camera).OrderBy(x => x.date); foreach (SkyImage aMeteor2 in allMeteors2) { var meteors1 = aMeteor.detectedObjects.Where(x => x.skyObjectClass.Contains("meteor")); var meteors2 = aMeteor2.detectedObjects.Where(x => x.skyObjectClass.Contains("meteor")); foreach (SkyObjectDetection meteordetObj1 in meteors1) { foreach (SkyObjectDetection meteordetObj2 in meteors2) { Rectangle r1 = new Rectangle(meteordetObj1.bbox.xmin, meteordetObj1.bbox.ymin, meteordetObj1.bbox.xmax - meteordetObj1.bbox.xmin, meteordetObj1.bbox.ymax - meteordetObj1.bbox.ymin); Rectangle r2 = new Rectangle(meteordetObj2.bbox.xmin, meteordetObj2.bbox.ymin, meteordetObj1.bbox.xmax - meteordetObj2.bbox.xmin, meteordetObj2.bbox.ymax - meteordetObj1.bbox.ymin); if (r1.IntersectsWith(r2)) { //probably the same object if (aMeteor2.imageSet > 0) { aMeteor.imageSet = aMeteor2.imageSet; } else { aMeteor2.imageSet = aMeteor.imageSet; } } } } // Rectangle r1 = new Rectangle(aMeteor.bbox.xmin, recentdetObj.bbox.ymin, recentdetObj.bbox.xmax - recentdetObj.bbox.xmin, recentdetObj.bbox.ymax - recentdetObj.bbox.ymin); } //await _context.SaveChangesAsync(); maxCount++; } //assign rank await _context.SaveChangesAsync(); int rank = 1; var imageList = _context.SkyImages .FromSqlRaw("Select * from SkyImages a order by (select count(*) from SkyImages c where c.imageSet = a.imageSet),(select max(score) from SkyObjectDetection where skyImageId=a.skyImageId and skyObjectClass like '%meteor') desc") .ToList <SkyImage>(); foreach (SkyImage skyI in imageList) { skyI.rank = rank; rank++; } await _context.SaveChangesAsync(); //no intersections try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { throw; } return(NoContent()); }
public async Task <ActionResult <SkyImage> > PostSkyImage([FromBody] SkyImage skyImage) { if (_context.SkyImages.Contains(skyImage)) { return(BadRequest()); } var si = findImage(skyImage.filename); if (si == null) { //check for image intersections // //new set or existing set var setID = findImageSet(skyImage); skyImage.imageSet = setID; //get file image var imageDataByteArray = Convert.FromBase64String(skyImage.imageData.imageData); //When creating a stream, you need to reset the position, without it you will see that you always write files with a 0 byte length. var imageDataStream = new MemoryStream(imageDataByteArray); imageDataStream.Position = 0; // if (local) { using (FileStream file = new FileStream(Path.Combine("\\home\\site\\wwwroot\\images\\", skyImage.filename), FileMode.Create, System.IO.FileAccess.Write)) { byte[] bytes = new byte[imageDataStream.Length]; imageDataStream.Read(bytes, 0, (int)imageDataStream.Length); file.Write(bytes, 0, bytes.Length); imageDataStream.Close(); } } else { // //save file to azure storage account //string storageConnection = CloudConfigurationManager.GetSetting("BlobStorageConnectionString"); string storageConnection = _configuration.GetSection("myStorage").Value; CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(storageConnection); //create a block blob CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient(); //create a container CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference("found"); //create a container if it is not already exists if (await cloudBlobContainer.CreateIfNotExistsAsync()) { await cloudBlobContainer.SetPermissionsAsync(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob }); } CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference(skyImage.filename); cloudBlockBlob.Properties.ContentType = "image/jpg"; await cloudBlockBlob.UploadFromStreamAsync(imageDataStream); // //generate xml annotation file } } else { //combine detections foreach (SkyObjectDetection sod in skyImage.detectedObjects) { sod.skyObjectID = si.detectedObjects.Max(b => b.skyObjectID) + 1; sod.bbox.boundingBoxId = si.detectedObjects.Max(b => b.bbox.boundingBoxId) + 1; sod.skyObjectClass = "TEST:" + sod.skyObjectClass; sod.skyImageId = skyImage.skyImageId; si.detectedObjects.Add(sod); } } XElement xmlTree = new XElement("annotation"); XElement aFilename = new XElement("filename"); aFilename.Value = skyImage.filename; xmlTree.Add(aFilename); XElement aSize = new XElement("size"); aSize.Add(new XElement("width", skyImage.width)); aSize.Add(new XElement("height", skyImage.height)); aSize.Add(new XElement("depth", "1")); xmlTree.Add(aSize); foreach (SkyObjectDetection sod in skyImage.detectedObjects) { XElement anObject = new XElement("object"); anObject.Add(new XElement("score", sod.score)); anObject.Add(new XElement("name", sod.skyObjectClass)); XElement bndBox = new XElement("bndbox"); bndBox.Add(new XElement("xmin", sod.bbox.xmin)); bndBox.Add(new XElement("ymin", sod.bbox.ymin)); bndBox.Add(new XElement("xmax", sod.bbox.xmax)); bndBox.Add(new XElement("ymax", sod.bbox.ymax)); anObject.Add(bndBox); xmlTree.Add(anObject); } xmlTree.FirstNode.AddAfterSelf(new XElement("camera", skyImage.camera)); xmlTree.FirstNode.AddAfterSelf(new XElement("dateTaken", skyImage.date)); //cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference(skyImage.filename.Replace(".jpg",".xml")); //cloudBlockBlob.Properties.ContentType = "text/xml"; ////updload xml //await cloudBlockBlob.UploadTextAsync(xmlTree.ToString()); // skyImage.imageData.imageData = "";//erase image from database if (si != null) { _context.SkyImages.Update(si); await _context.SaveChangesAsync(); return(CreatedAtAction(nameof(GetSkyImage), new { id = si.skyImageId }, si)); } else { _context.SkyImages.Add(skyImage); await _context.SaveChangesAsync(); return(CreatedAtAction(nameof(GetSkyImage), new { id = skyImage.skyImageId }, skyImage)); } }