Esempio n. 1
0
        //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);
        }
Esempio n. 2
0
        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());
        }
Esempio n. 3
0
        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);
        }
Esempio n. 5
0
        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());
        }
Esempio n. 6
0
        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());
        }
Esempio n. 7
0
        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));
            }
        }