Обнаружение объекта на изображении на основе геометрической формы

Нет необходимости писать так много if ... else if ... else if ... else if ..., чтобы получить связанные имена полей.

Лучший способ -

  1. Использовать список полей (IList) в качестве параметра.
  2. А затем сгенерировать требуемый список полей по intersect.
  3. Наконец, мы могли бы использовать отражение, чтобы получить все связанные значения.

Реализация

    public IActionResult DownloadExcel(IList fields)
    {
        // get the required field list
        var userType = typeof(UserTable);
        fields = userType.GetProperties().Select(p => p.Name).Intersect(fields).ToList();

        if(fields.Count == 0){ return BadRequest(); }

        using (ExcelPackage package = new ExcelPackage())
        {
            IList userList = _context.UserTable.ToList();
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("DbTableName");

            // generate header line
            for(var i= 0; i< fields.Count; i++ ){
                var fieldName = fields[i];
                var pi= userType.GetProperty(fieldName);
                var displayName =  pi.GetCustomAttribute()?.DisplayName;
                worksheet.Cells[1,i+1].Value = string.IsNullOrEmpty(displayName ) ? fieldName : displayName ;
            }

            // generate row lines
            int totalUserRows = userList.Count();
            for(var r=0; r< userList.Count(); r++){
                var row = userList[r];
                for(var c=0 ; c< fields.Count;c++){
                    var fieldName = fields[c];
                    var pi = userType.GetProperty(fieldName);
                    // because the first row is header 
                    worksheet.Cells[r+2, c+1].Value = pi.GetValue(row);
                }
            }
            var stream = new MemoryStream(package.GetAsByteArray());
            return new FileStreamResult(stream,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        }
    }

Вы можете настроить отображаемое имя, используя DsiplayNameAttribute :

    public class UserTable
    {
        public int Id{get;set;}

        [DisplayName("First Name")]
        public string fName { get; set; }

        [DisplayName("Last Name")]
        public string lName { get; set; }

        [DisplayName("Gender")]
        public string gender { get; set; }

    }

Это Можно добавить любые свойства по своему усмотрению без жесткого кодирования в вашем методе DownloadExcel.

Демонстрация :

при прохождении списка полей fields[0]=fName&fields[1]=lName&fields[2]=Non-Exist генерирует Excel следующим образом:

enter image description here [ 1127]

[Обновить]

Чтобы экспортировать все поля, можно предположить, что клиент не передаст параметр fields. Это означает, что когда поля равны null или fields.Count==0, мы экспортируем все поля:

    [HttpGet("download")]
    public IActionResult DownloadExcel(IList fields)
    {
        // get the required field list
        var userType = typeof(UserTable);
        var pis= userType.GetProperties().Select(p => p.Name);

        if(fields?.Count >0){
            fields = pis.Intersect(fields).ToList();
        } else{
            fields = pis.ToList();
        }

        using (ExcelPackage package = new ExcelPackage()){
           ....
        }
    }

A

10
задан Cœur 10 October 2017 в 17:23
поделиться

4 ответа

Я рекомендую использовать Hough, преобразовывают, который позволяет Вам находить любой данный шаблон описанным уравнением. То, что является больше Hough, преобразовывают, также работает отлично для деформированных объектов.

Алгоритм и сама реализация довольно просты. Больше деталей может быть найдено здесь: http://en.wikipedia.org/wiki/Hough_transform, даже исходный код для этого алгоритма включен на странице, на которую ссылаются (http://www.rob.cs.tu-bs.de/content/04-teaching/06-interactive/HNF.html).

Я надеюсь, что это помогает Вам.

5
ответ дан 3 December 2019 в 20:44
поделиться

Я посмотрел бы на Вашу проблему на двух шагах:

  • сначала находя внешнюю границу Вашего объекта: я предполагаю, что Вы контрастировали достаточно изображения, что Вы можете легко порог для получения двухуровневого изображения объекта. Необходимо извлечь цепочечный код границы объекта.

  • затем анализируя форму границы для выведения формы (круг, полигон...): можно вычислить искривление в каждой точке граничной цепочки и таким образом определить, сколько резких углов (т.е. высокое значение искривления) существует в форме. Несколько резких углов означают, что у Вас есть полигон, ни один не означает, что у Вас есть круг (постоянная кривизна).

Можно найти описание о том, как получить границу объекта из двухуровневого изображения и способов проанализировать его в Цифровой обработке изображений Gonzalez, главе 11.

Я также нашел эту проницательную презентацию двухуровневого изображения analyis (PPT) и matlab сценария, который реализует некоторые методы, что Gonzalez говорит о в DIP.

3
ответ дан 3 December 2019 в 20:44
поделиться

Вы можете попробовать использовать гистограммы ориентированных градиентов (также называемые гистограммами ориентации краев). Мы использовали их для обнаружения дорожных знаков. http://en.wikipedia.org/wiki/Histogram_of_oriented_gradients и статьи Билла Триггса должны помочь вам начать.

7
ответ дан 3 December 2019 в 20:44
поделиться

Я настоятельно рекомендую вам использовать OpenCV , это отличная библиотека компьютерного зрения, которая очень помогает во всем, что связано с компьютерным зрением. Их веб-сайт не очень привлекателен и не полезен, но API действительно мощный.

Книга, которая мне очень помогла, так как в сети не так много документации, - это Learning OpenCV . Документация, поставляемая с API, хороша, но не очень хороша для изучения того, как ее использовать.

В связи с вашей проблемой вы можете использовать детектор Canny Edge, чтобы найти границу вашего элемента, а затем проанализировать ее, или вы можете продолжить с помощью и преобразованием Хафа для поиска линий или окружностей.

1
ответ дан 3 December 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: