Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.61
NoBODY18
25 / 16 / 1
Регистрация: 20.12.2012
Сообщений: 122
#1

Работа с OpenCvSharp: определение автомобильного номера - C#

29.10.2014, 14:23. Просмотров 3378. Ответов 2
Метки нет (Все метки)

Всем добрый день, помогите новичку пожалуйста начал осваивать библиотеку OpenCvSharp, нашел рабочий пример - .
http://derindelimavi.wordpress.com/2010/01/31/plaka-okuma-ii/
На данный момент распознавание меня не интересует, меня интересует только ОПРЕДЕЛЕНИЕ номера на картинке.

У меня два вопроса:

1) Как убирать лишние прямоугольники, чтоб красным был выделен, только номер( пример на картинке)

2) С какими параметрами надо "поиграть" чтоб определяло номер, как на вот этой картинке.

Вот код, в котором я пытался разобраться.

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
using System.IO;
using System.Diagnostics;
using System.Collections.Generic;
using OpenCvSharp;
using OpenCvSharp.Blob;
using System;
using System.Drawing;
 
namespace AutoNumberDetection
{
 
    class AutoDetection
    {
 
        public IplImage src; // Исходное изображение
        IplImage timg;
        IplImage pimg;
        CvBlobs blobs;
        public List<IplImage> plate = new List<IplImage>();
        public List<string> plateList = new List<string>();
        List<Point> listPoint = new List<Point>();
        bool imageready = false;
 
        #region Метод проверки наличия изображения
        public bool LoadImage(string fname)
        {
            src = new IplImage(fname, LoadMode.Color);
            if (src != null)
                imageready = true;
 
            return imageready;
        }
        #endregion
 
        #region Метод проверки полученного изображения
        public void SetImage(IplImage tsrc)
        {
            if (src != null)
                Cv.ReleaseImage(src);
            src = tsrc;
        }
 
        #endregion
 
        #region Метод обработки изображения для определения наличия номера на картинке
        public void PreProcess()
        {
            IplConvKernel element = Cv.CreateStructuringElementEx(21, 3, 10, 2, ElementShape.Rect, null); // Создаём структурирующий элемент(ядро) для работы с изображением
            timg = new IplImage(src.Size, BitDepth.U8, 1); // Линейная коррекция результатов
            IplImage temp = timg.Clone();// temp - для промежуточного хранения результатов 
            IplImage dest = timg.Clone(); // dest - изображения для сохранения результата
            src.CvtColor(timg, ColorConversion.RgbaToGray);//преобразование цветового пространства (из цветного в градации серого)
            pimg = timg.Clone();
            Cv.Smooth(timg, timg, SmoothType.Gaussian); // Сглаживание изображения по гауссине(гауссина-математическая функция)
            Cv.MorphologyEx(timg, dest, temp, element, MorphologyOperation.TopHat, 1);// Выполняет сложные морфлогические преобразования, а конкретно изолирует яркие локальные пики
            Cv.Threshold(dest, timg, 0, 255, ThresholdType.Binary | ThresholdType.Otsu);//приведение точек, которые темнее/светлее определенного уровня(50) к черному(0) или белому цвету(255)
            Cv.Dilate(dest, dest, element, 2); // Морфологическая операция, растягивание изображения
           
          
 
        }
        #endregion
        
        #region Метод поиска наличия номера на картинке
        public int FindPlates()
        {
            
            blobs = new CvBlobs(); // Инициализация конструктора для которые содержат информацию о фрагментах изображений
            plate.Clear(); // Очистка списка изображений
            CvBlobLib.Label(timg, blobs);
            CvBlobLib.FilterByArea(blobs, 300, 5000);// Фильтрует части изображения, те части изображения которые не входят в диапазон - будут удалены
            
            IplImage srctemp = src.Clone();
            listPoint.Clear();
            
            
            foreach (var item in blobs) // Перебор значений в фрагментах изображений
            {
                item.Value.SetImageRoiToBlob(pimg);
                
                double ratio = (double)item.Value.Rect.Width / (item.Value.Rect.Height); // Коэффициент вычисления отношения ширины и высоты прямоугольника
                double angle = (double)item.Value.Angle();
                if (ratio > 3.4 && ratio < 6.6 && angle > -15 && angle < 15)// Прямоугольник с отношением ширины и высоты, а также угол обзора
                {
                    IplImage platetemp = new IplImage(new CvSize(pimg.ROI.Width, pimg.ROI.Height), pimg.Depth, pimg.NChannels); // Создание нового изображения с точным размером прямоугольника
                    Cv.Resize(pimg, platetemp); // Изменение размера изображения
                    listPoint.Add(new Point(item.Value.Rect.X, item.Value.Rect.Y)); // Добавление координат на картинку
                    plate.Add(platetemp); // Добавление изображения в список
                    src.Rectangle(item.Value.Rect, new CvScalar(0, 0, 255), 4, LineType.Link4);
                }
 
               
            }
 
            src.ResetROI();
            return plate.Count;
 
        }
 
        #endregion
 
        public List<Point> FindCoordinates() // Функция поиска координат
        {
 
            return listPoint;
           
           
        }
 
    }
}


Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
using OpenCvSharp.Extensions;
using System;
using System.IO;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Drawing;
 
 
namespace AutoNumberDetection
{
 
 
    public partial class MainForm : Form
    {
        AutoDetection Detect = new AutoDetection(); // Создание экземпляра класса
 
        public MainForm()
        {
            InitializeComponent();
        }
 
        #region Событие - загрузка изображения
        private void btn_open_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFile = new OpenFileDialog();
            openFile.Title = "Выберите картинку";
            openFile.FileName = "*.jpg";
            if (openFile.ShowDialog() == DialogResult.OK)
            {
                if (Detect.LoadImage(openFile.FileName))
                {
                    pict_box_first.Image = BitmapConverter.ToBitmap(Detect.src);
                    btn_detect.Enabled = true;
                    numericUpDown1.Enabled = false;
                    numericUpDown1.Value = 1;
                    pict_box_last.Image = null;
                    lstbox_cordin.DataSource = null;
                    lstbox_cordin.Items.Clear();
                }
            }
 
 
        }
        #endregion
        List<Point> lstPoint=new List<Point>();
        #region Событие - обработка изображения
        private void btn_detect_Click(object sender, EventArgs e)
        {
            
            Detect.PreProcess();// Запусk метода обработки картинки
            int n = Detect.FindPlates(); // присваивание переменной и запуск метода нахождения номеров
            if (n == 0) return;
            pict_box_first.Image = BitmapConverter.ToBitmap(Detect.src);// Конвертирования исходного изображения 
            btn_save.Enabled = true; //Активация кнопки сохранения изображения
            numericUpDown1.Enabled = true;
            numericUpDown1.Maximum = n;
            numericUpDown1.Value = 1; // Изначальное значение
            pict_box_last.Image = BitmapConverter.ToBitmap(Detect.plate[0]);
            lstPoint = Detect.FindCoordinates();
            lstbox_cordin.DataSource = lstPoint;
 
 
 
        }
        #endregion
 
        #region Метод просмотра полученных изображений с помощью numericUpDown
        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            pict_box_last.Image = BitmapConverter.ToBitmap(Detect.plate[(int)numericUpDown1.Value - 1]);
            lstbox_cordin.SelectedIndex = Convert.ToInt32(numericUpDown1.Value)-1;
        }
        #endregion
 
        #region Событие - сохранение файла на пк
        private void btn_save_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFile = new SaveFileDialog(); // Инициализация класса, который предлагает пользователю сохранить данное изображение
            
            saveFile.Filter = "Images(*.jpg; *.jpeg; *.mjpeg)|*.jpg;*.jpeg;*.mjpeg;| JPG(*.jpg;)|*.jpg;";
            if (saveFile.ShowDialog() == DialogResult.OK)
            {
                pict_box_last.Image.Save(saveFile.FileName);
            }
        }
        #endregion
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        private void numericUpDown1_KeyDown(object sender, KeyEventArgs e)
        {
            lstbox_cordin.SelectedItem = e.KeyValue;
        }
 
        private void btn_exit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
    }
}

http://www.cyberforum.ru/csharp-beginners/thread2108609.html
0
Миниатюры
Работа с OpenCvSharp: определение автомобильного номера   Работа с OpenCvSharp: определение автомобильного номера  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2014, 14:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с OpenCvSharp: определение автомобильного номера (C#):

OpenCVSharp определение контуров
Доброго времени суток! Нужен код определения контуров(пишу диплом-...

Определение номера числа фибоначчи С#
Здравствуйте.. Писал задачу чтобы вывести на консоль число фибоначчи большее...

Установка opencvsharp
Привет всем) Я уже все перепробовал и не получается( Подскажите как установить...

Не работает OpenCVSharp
Добрый день. В попытках поставить OpenCvSharp столкнулся с проблемой. Ставил...

ошибка OpenCVSharp
При запуске и компиляции данного проекта Происходит запуск, но стоит через...

2
sam_8
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 7
31.03.2016, 17:29 #2
Не подскажешь как делал подключение библиотеки openCVSHARP?
0
fufel
13 / 13 / 6
Регистрация: 28.02.2011
Сообщений: 307
07.02.2017, 13:04 #3
NoBODY18, - Привет, как успехи? разобрался?
Что интересного нашел? )))
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2017, 13:04
Привет! Вот еще темы с решениями:

OpenCV, Visual Studio 12, OpencvSharp - как это все подружить?
Доброго времени суток! Есть проблемма - уже лопату сломал в поисках нормальной...

OpenCvSharp. Не удается загрузить DLL "opencv_core240": Не найден указанный модуль
Добавил через Nuget. Выдает такую ошибку: DllNotFoundException: Не удается...

Перевод кода из Pascal в C# (работа с файлом, определение наименьшего года)
Здравствуйте, помогите пожалуйста перевести код в C# uses crt; var f:text; ...

Распознавание автомобильного номера на картинке
Всем привет! Решил разобраться с библиотеками в .NET, а именно OpenCV и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru