С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Lagolass
2 / 2 / 0
Регистрация: 02.06.2012
Сообщений: 60
1

Следящая система с помощью веб-камеры с использованием алгоритма выделения края

24.05.2014, 12:51. Просмотров 1272. Ответов 10
Метки нет (Все метки)

Делаю программу для диплома на подобие следящей системы с помощью веб-камеры с использованием алгоритма выделения края. Получаем изображение веб-камеры на PictureBox, а подключаемся с помощью библиотеки AForge. Опишу принцип работы программы и то что сделал: допустим на полученном изображении с веб-камеры размещено несколько объектов
Следящая система с помощью веб-камеры с использованием алгоритма выделения края

потом мы выделяем эти объекты Оператором Кэнни, а дальше пользователю надо выбрать мышкой за каким объектом следить программе.
правой кнопкой мышки мы можем выделять овальные объекты
Следящая система с помощью веб-камеры с использованием алгоритма выделения края

а левой кнопкой мышки прямоугольные
Следящая система с помощью веб-камеры с использованием алгоритма выделения края

ну а потом начинать следить, если, например, объект сместилса с места то мы скриним изображение.
Так вот мне осталось реализовать слежение за обектом, возможно ли так сделать как я написал?
Как я понимаю, для слежения можно сравнивать пиксели, только как сделать чтобы это сравнение выполняло определеного участка пикселей на PictureBox'e, тоисть того участка что мы выделяем мышкой?
Прилагаю исходник проэктаWebCam_Diplom.rar
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2014, 12:51
Ответы с готовыми решениями:

Видео с веб камеры
Как получить видео с веб камеры в С# без сторонних библиотек типа Emgu?

Получить снимок с веб камеры
На данный момент смешал эти коды...

Как получить изображение с веб-камеры
Как получить изображение с веб-камеры?

Как делать снимок с веб камеры
Подскажите WinAPI функцию, с помощью которой можно сделать снимок с веб камеры....

Как сохранять видео с веб-камеры
Нужно сохранять видео с веб-камеры в MP4 формате. нужно в mp4 так как WMV...

10
Lagolass
2 / 2 / 0
Регистрация: 02.06.2012
Сообщений: 60
24.05.2014, 17:21  [ТС] 2
неужели нету что подсказать
0
Rock_STAR
Заблокирован
24.05.2014, 17:44 3
Сделайте какой либо массив характеристик если данные из массива на протяжении 1-2 секунд изменились больше чем на сколько то процентов тогда что то писать. Массивы можно сравнить с помошью корреляции....
0
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
24.05.2014, 18:10 4
Lagolass, http://habrahabr.ru/post/97345/
0
IamRain
1376 / 1230 / 387
Регистрация: 02.08.2011
Сообщений: 3,628
24.05.2014, 18:21 5
Интересная тема. Сам с таким никогда не работал. Вот еще интересные материалы:
http://habrahabr.ru/post/116824/

Добавлено через 6 минут
Там ссылки на исходники есть.
0
Lagolass
2 / 2 / 0
Регистрация: 02.06.2012
Сообщений: 60
28.05.2014, 17:33  [ТС] 6
вот как я по пробовал решить проблему
создал клас масива в который будет записываться выделенную область на ПикчерБоксе
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
 
public class nComparePxl
        {
            private Point pxlPoint;
            private Color pxlColor;
 
            public Point PxlPoint
            {
                get { return pxlPoint; }
                set { pxlPoint = value; }
            }
           
            public Color PxlColor
            {
                get { return pxlColor; }
                set { pxlColor = value; }
            }
            public nComparePxl() { }
            public nComparePxl(Point pn, Color clr1)
            {
                this.PxlPoint = pn;
                this.PxlColor = clr1;
            }
        }
 
public List<nComparePxl> ArrPixelList(Bitmap bmp1)
            {
                List<nComparePxl> list = new List<nComparePxl>();
                                
                for (int y = y_MouseDown; y < y_Md; y++)
                {
                    for (int x = x_MouseDown; x < x_Md; x++)
                    {
                        nComparePxl ncp = new nComparePxl(new Point(x, y), bmp1.GetPixel(x, y));
                            list.Add(ncp);                        
                    }
                }
                return list;               
            }
 
public List<nComparePxl> ArrPixelList2(Bitmap bmp2)
        {
            List<nComparePxl> list2 = new List<nComparePxl>();
 
            for (int y = y_MouseDown; y < y_Md; y++)
            {
                for (int x = x_MouseDown; x < x_Md; x++)
                {
                    nComparePxl ncp2 = new nComparePxl(new Point(x, y), bmp2.GetPixel(x, y));
                    list2.Add(ncp2);
                }
            }
            return list2;
        }
перехват координат выделения беру из события MouseDown и MouseMove
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
public int x_MouseDown, y_MouseDown, x_Md, y_Md, allPixels;
 
        private void pictureBox2_MouseDown(object sender, MouseEventArgs e)
        {
            x_MouseDown = e.X;
            y_MouseDown = e.Y;           
        }      
 
        private void pictureBox2_MouseMove(object sender, MouseEventArgs e)
        {   
            if (e.Button == MouseButtons.Left)
            {                
                pictureBox2.Refresh();
                //Выбираем перо "myPen" красного цвета
                //толщиной в 2 пикселя:
                Pen myPen = new Pen(Color.Red, 2);
                //Объявляем объект "g" класса Graphics и предоставляем
                //ему возможность рисования на pictureBox2:
                Graphics g = Graphics.FromHwnd(pictureBox2.Handle);
                //Рисуем прямоугольник:  
                x_Md = e.X - x_MouseDown;
                y_Md = e.Y - y_MouseDown;
                g.DrawRectangle(myPen, x_MouseDown, y_MouseDown, x_Md, y_Md);
                allPixels = (e.X - x_MouseDown) * (e.Y - y_MouseDown);
                label2.Text = ""+(e.X - x_MouseDown) * (e.Y - y_MouseDown);
                
            }          
        }
потом вычесляю процент совпадания двох масивов по таймеру
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
List<nComparePxl> list = new List<nComparePxl>();
        private void button_follow_Click(object sender, EventArgs e)
        {            
            if (pictureBox2.Image != null)
            {                
                Bitmap bmp1 = new Bitmap(pictureBox2.Image);
                list = ArrPixelList(bmp1);                
                timer.Start();
            }
            else MessageBox.Show("Выберите нужные изображения");
        }
 
        int result=0;
         private void timer_Tick(object sender, EventArgs e)
        {
            int equalPixels = 0;
           
            canny();
            List<nComparePxl> list2 = new List<nComparePxl>();
            Bitmap bmp2 = new Bitmap(pictureBox2.Image);        
            list2 = ArrPixelList2(bmp2);
            for (int i = 0; i < list.Count; i++)
            {
                for (int j = 0; j < list2.Count; j++)
                {
                    if (list[i].PxlColor == list2[j].PxlColor)
                    {
                        equalPixels++;
                    }
                }
            }
            label3.Text = "" + (equalPixels);    
            result=(equalPixels / allPixels) * 100;
            label6.Text = "% " + result;   
            if (result >= 80)
            { MessageBox.Show("обьект на месте"); }
            else { MessageBox.Show("обьекта нет"); timer.Stop(); }   
                   
        }
только неочень работает, помогите, может где то я неправильно обьявил чтото

Добавлено через 12 минут
Цитата Сообщение от Lagolass Посмотреть сообщение
вот как я по пробовал решить проблему
создал клас масива в который будет записываться выделенную область на ПикчерБоксе
вот как я по пробовал решить проблему
создал клас через который будет записываться два масива выделенной области на ПикчерБоксе, кто муже первый масив у нас типо как константа для сравнения, а второй масив должен через определёный интервал таймера перезаписыватса
0
Lagolass
2 / 2 / 0
Регистрация: 02.06.2012
Сообщений: 60
28.05.2014, 17:55  [ТС] 7
на label's чисто для себя вывожу некоторые результаты:
C#
1
label2.Text = ""+(e.X - x_MouseDown) * (e.Y - y_MouseDown); //количество пикселей выделеной области
C#
1
label3.Text = "" + (equalPixels); //количество совпавших пикселей двух масивов
C#
1
label6.Text = "% " + result;  // % совпадания двох масивов
так вот последние два результата показывают уменя неверно, например, у меня количество совпавших пикселей показывает больше чем количество выделеных

исходник проэкта:WebCam_Diplom.rar
0
Lagolass
2 / 2 / 0
Регистрация: 02.06.2012
Сообщений: 60
28.05.2014, 22:32  [ТС] 8
мда уж, дождешса помощи
0
Lagolass
2 / 2 / 0
Регистрация: 02.06.2012
Сообщений: 60
03.06.2014, 18:05  [ТС] 9
Psilon, взял исходник проэкта из статьи которой вы мне предложили, когда пытаюсь подключить камеру, то выскакует вот такая ошибка:
"Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "statusBar" не из того потока, в котором он был создан."
иза этого кода:
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
private void videoSourcePlayer_NewFrame(object sender, ref Bitmap image)
        {
            lock (this)
            {
                if (detector != null)
                {
                    float motionLevel = detector.ProcessFrame(image);
 
                    if (motionLevel > motionAlarmLevel)
                    {
                        // flash for 2 seconds
                        flash = (int)(2 * (1000 / alarmTimer.Interval));
                    }
 
                    // check objects' count
                    if (detector.MotionProcessingAlgorithm is BlobCountingObjectsProcessing)
                    {
                        BlobCountingObjectsProcessing countingDetector = (BlobCountingObjectsProcessing)detector.MotionProcessingAlgorithm;
                    }
 
                    // HERE!!!
 
                    objectCenterLabel.Text = string.Format("Center: {0}", _colorDetection.Center);
 
                    Rectangle a = _colorDetection.BoundsBox;
                    objectsBoundaryLabel.Text = string.Format("Left:{0}, Top:{1}, Right:{2}, Bottom:{3}", a.Left, a.Top, a.Right, a.Bottom);
///////////////////вот иза этого куска кода выскакует ошибка
///////////////////                   Color newColor = _colorDetection.ObjectColor;
///////////////////
///////////////////                    BeginInvoke(_changeColorDelegate, newColor);
///////////////////
///////////////////                    // accumulate history
///////////////////                    motionHistory.Add(motionLevel);
///////////////////                    if (motionHistory.Count > 300)
///////////////////                   {
///////////////////                        motionHistory.RemoveAt(0);
///////////////////                    }                    
                }
            }
        }
помогите исправить
0
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
03.06.2014, 19:40 10
Lagolass, правильно, потому что нужно использовать православный BeginInvoke для доступа к элементам формы из других потоков.

Добавлено через 44 секунды
хотя он у вас тут написан, но значит где-то вы в него обернуть что-то забыли.

Добавлено через 32 секунды
и да, программа выскакивает не из-за куска, а на конкретной строчке.
0
Lagolass
2 / 2 / 0
Регистрация: 02.06.2012
Сообщений: 60
04.06.2014, 14:04  [ТС] 11
ну если я убираю тот кусок кода, то тогда работает(веб-камера подключаетса)

Добавлено через 17 часов 36 минут
Цитата Сообщение от Psilon Посмотреть сообщение
хотя он у вас тут написан, но значит где-то вы в него обернуть что-то забыли.
а откуда его обернуть, эту ошибку не я сделал, она уже была в исходнике который скачал, не получаетса исправить
0
04.06.2014, 14:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2014, 14:04

Как получить изображение с веб-камеры
Подскажите пожалуйста, как получить изображение с веб-камеры и запихать его в...

Трансляция видео потока с веб камеры и управление
Есть необходимость получения с веб камеры изображения и трансляция его на...

Возможно ли реализовать тепловизор с помощью обычной веб камеры от ноутбука
Здравствуйте,у меня возник вопрос,возможно ли реализовать тепловизор в матлаб с...


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

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

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