Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771

Кто чем и как воспроизводит потоки с ip камер

07.03.2021, 20:25. Показов 6260. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пробовал много библиотек для показа видео с ip камер у всех свои плюсы и минусы, но чего то прям идеального не нашел.
TVideoGrabber SDK пока фаворит хоть и платный, там есть проблемы с контролом wpf.
Хочу узнать мнение людей с опытом. Какой способ или библиотека лучше всего справляется с этим.
Главный критерии для меня это : минимальная задержка, возможность в любой момент взять кадр, не умирание при работе до 4 камер и конечно не 80% нагрузки на процессор от 1 камеры. желательно не нарушать MVVM
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.03.2021, 20:25
Ответы с готовыми решениями:

Bass.dll не воспроизводит m3u и другие потоки
Уважаемые форумчане помогите пожалуйста решить проблему с воспроизведением радиостанций. Почему то при попытке воспроизвести радиостанции...

Кто-нибудь создаёт потоки как в MSDN?
Приветствую, жизнь заставила писать на 2005м MVS и использовать MS SQL SERVER (требует ObjectARX). Вообщем, раньше было какое-то...

Чем заменить таймер при работе с видеопотоками с камер
Добрый день! Пишу программу для работы с несколькими потоками видео (пользуюсь AForge.NET) и столкнулся с проблемой работы таймера. На...

39
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
10.03.2021, 16:52  [ТС]
Студворк — интернет-сервис помощи студентам
с вашим конвертором и правда меньше просадок , но мусоросборщик очищает по 200 мегабайт каждую секунду. это нормально?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,185
Записей в блоге: 2
10.03.2021, 16:57
Цитата Сообщение от Midian Посмотреть сообщение
Весит 45 мб, куда его можно залить, чтобы выложить здесь?
Лучше в публичный NuGet.
Проще будет чем любой другой вариант.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
10.03.2021, 16:58  [ТС]
начал переносить из бехайнда. столкнулся с проблемой
прибиндил к image
C#
1
2
3
4
5
6
7
8
9
10
 private ImageSource _cam1sourse;
        public ImageSource cam1sourse
        {
            get { return _cam1sourse; }
            set
            {
                _cam1sourse = value;
                RaisePropertyChanged(() => cam1sourse);
            }
        }
но изображения нет
по моему это из-за потока в котором приходят кадры. ui поток как будто ничего не получает
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,185
Записей в блоге: 2
10.03.2021, 16:59
Цитата Сообщение от onimor Посмотреть сообщение
когда жму скачать "404 Не Найдено"
Цитата Сообщение от Midian Посмотреть сообщение
Только что проверил, все качает
У меня вроде тоже закачка начинается нормально.
Но целиком закачивать не стал.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
10.03.2021, 17:02  [ТС]
Цитата Сообщение от onimor Посмотреть сообщение
по моему это из-за потока в котором приходят кадры. ui поток как будто ничего не получает
если использовать стандартный конвертер то вообще пишет "Необходимо создать DependencySource в том же потоке, в котором создан DependencyObject" dispatcher просит ссылку на объект. у вас были проблемы привязкой?
0
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,717
10.03.2021, 17:15
Цитата Сообщение от onimor Посмотреть сообщение
если использовать стандартный конвертер то вообще пишет "Необходимо создать DependencySource в том же потоке, в котором создан DependencyObject" dispatcher просит ссылку на объект. у вас были проблемы привязкой?
Оберните присвоение к проперти в UIHelper:
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 UIHelper
    {
        /// <summary>
        /// Update UI with invocation to <see cref="Application.Current"/>'s <see cref="Dispatcher"/>.
        /// </summary>
        /// <param name="action"><see cref="Action"/> to invocation.</param>
        /// <exception cref="Exception">a <paramref name="action"/>'s callback throws an exception.</exception>
        public static void UpdateUI(Action action)
        {
            if (action == null || Application.Current == null)
            {
                return;
            }
 
            var dispatcher = Application.Current.Dispatcher;
            if (dispatcher.CheckAccess())
            {
                action();
            }
            else
            {
                try
                {
                    dispatcher.Invoke(action);
                }
                catch (TaskCanceledException) { }
            }
        }
 
        /// <summary>
        /// Begin update UI with invocation to <see cref="Application.Current"/>'s <see cref="Dispatcher"/>.
        /// </summary>
        /// <param name="action"><see cref="Action"/> to begin invocation.</param>
        /// <param name="checkAccess">check access before invoke if call in main thread.</param>
        /// <param name="priority"><see cref="DispatcherPriority"/> to invoke into UI with.</param>
        /// <exception cref="Exception">a <paramref name="action"/>'s callback throws an exception.</exception>
        public static void BeginUpdatesUI(Action action, bool checkAccess = true, DispatcherPriority priority = DispatcherPriority.Normal)
        {
            if (action == null || Application.Current == null)
            {
                return;
            }
 
            var dispatcher = Application.Current.Dispatcher;
            if (checkAccess && dispatcher.CheckAccess())
            {
                action();
            }
            else
            {
                dispatcher.BeginInvoke(priority, action);
            }
        }
    }
Использовать примерно вот так:
C#
1
UIHelper.UpdateUI(() => Frame = frame);
Добавлено через 6 минут
Цитата Сообщение от onimor Посмотреть сообщение
с вашим конвертором и правда меньше просадок , но мусоросборщик очищает по 200 мегабайт каждую секунду. это нормально?
Ну примерно каждую секунду вы получаете новый кадр, старый кадр становится устаревшим и сборщик его удаляет, вполне себе нормальное поведение для Garbage Collector
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
10.03.2021, 17:36  [ТС]
Цитата Сообщение от Midian Посмотреть сообщение
UIHelper.UpdateUI(() => Frame = frame);
C#
1
2
3
4
var mat = new Mat();
            _videoCapture1.Retrieve(mat);
 
            UIHelper.UpdateUI(() => _cam1sourse = Convertor.ByteToBitmapSource(mat.GetRawData(), mat.Width, mat.Height));
не появляется
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,185
Записей в блоге: 2
10.03.2021, 18:31
Цитата Сообщение от onimor Посмотреть сообщение
"Необходимо создать DependencySource в том же потоке, в котором создан DependencyObject"
Обратите внимание на bitmapImage.Freeze() в коде Midian.
BitmapImage - это тоже DependencyObject.
И работать с ним надо только в том же потоке в котором он был создан.
То есть в том где вызывается оператором new его конструктор.
Поэтому просто задать его в потоке события и потом передать в View для отображения не получится.

Но BitmapImage - это так же и Freezable.
А объекты Freezable можно заморозить и после это работать с ними в любом потоке.

Поэтому проследите, что чтобы сформированный кадр перед возвратом из метода был заморожен.
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
10.03.2021, 19:45  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поэтому проследите, что чтобы сформированный кадр перед возвратом из метода был заморожен.
он замораживается в конвенторе , перед тем как вернуть. при запуске появляется первый кадр и больше не обновляется
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,185
Записей в блоге: 2
10.03.2021, 20:07
Цитата Сообщение от onimor Посмотреть сообщение
при запуске появляется первый кадр и больше не обновляется
Значит где-то не проходит событие PropertyChanged.
Проследите цепочку.

Добавлено через 6 минут
Цитата Сообщение от onimor Посмотреть сообщение
C#
4
        UIHelper.UpdateUI(() => _cam1sourse = Convertor.ByteToBitmapSource(mat.GetRawData(), mat.Width, mat.Height));
Уберите нижний слеш.
Вы присваиваете значение полю, а нужно присваивать свойству.

Чтобы не было таких случайных ошибок соблюдайте Правила Именования.
Имена типов, методов и свойств должны начинаться с ПРОПИСНОЙ буквы.
С нижнего слеша допускается именовать только поля хранящие значения одноимённых свойств.
И к таким полям можно обращаться ТОЛЬКО в теле их СВОЙСТВА, больше в коде к ним нигде НЕЛЬЗЯ ОБРАЩАТЬСЯ.
Без всяких исключений.
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
10.03.2021, 20:19  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы присваиваете значение полю, а нужно присваивать свойству
Да точно... похоже когда из каши с тестами переносил, случайно не то скопировал и не увидел.
С именованием в рабочем проекте все нормально.

спасиб)

Добавлено через 35 секунд
работает без UIHelper.UpdateUI благодаря конвертеру от Midian с Freeze.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,185
Записей в блоге: 2
10.03.2021, 20:22
Цитата Сообщение от onimor Посмотреть сообщение
работает без UIHelper.UpdateUI
Да, так и должно быть.
UIHelper нужен если идёт обращение к UI элементу или изменяется коллекция (ObservableCollection), которая привязана в View.
Для PropertyChanged перехода в UI поток не нужно.
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
10.03.2021, 20:59  [ТС]
Лучший ответ Сообщение было отмечено Элд Хасп как решение

Решение

как итог если кто-то такой же как я тугой )

VM
Кликните здесь для просмотра всего текста

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
 class MainWindowsVM : ViewModelBase
    {
 
        private ImageSource _cam1sourse;
        public ImageSource cam1sourse
        {
            get { return _cam1sourse; }
            set
            {
                _cam1sourse = value;
                RaisePropertyChanged(() => cam1sourse);
            }
        }
       
 
        private VideoCapture _videoCapture1=null;
 
        private Mat _frame1;
     
        public MainWindowsVM()
        {
            _frame1 = new Mat();
           
            CvInvoke.UseOpenCL = false;
            start();
        }
        public void start()
        {
            Task.Run(() =>
            {
                _videoCapture1 = new VideoCapture(@"http://192.168.31.187:8080/video");
                //_videoCapture1 = new VideoCapture(@"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov");
 
                _videoCapture1.ImageGrabbed += ProcesImageGrabbed;
                _videoCapture1.Start();
            });
               
        }
 
       
        public void ProcesImageGrabbed(object sender, EventArgs e)
        {
            
           
            var mat = new Mat();
            _videoCapture1.Retrieve(mat);
 
 
            //вариант с конвертацией от Midian задержка ~1-2  сек. нет скачков оперативной памяти
            //cam1sourse = Convertor.ByteToBitmapSource(mat.GetRawData(), mat.Width, mat.Height);
 
            //вариант с конвертацией из документации но слегка изменен. нет задержки. есть скачки оперативной памяти
            UIHelper.UpdateUI(() => cam1sourse = Convertor.ToBitmapSource(mat));
 
        }
    }


Convert
Кликните здесь для просмотра всего текста

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
112
113
114
115
116
117
 public  class Convertor
    {
        #region ИЗ ДОКУМЕНТАЦИИ БЕЗ ЗАДЕРЖКИ, НО СКАЧКИ В ОПЕРАТИВНОЙ ПАМЯТИ
        /// <param name="o"></param>
        /// <returns></returns>
        [DllImport("gdi32")]
        private static extern int DeleteObject(IntPtr o);
 
        /// <summary>
        /// Convert an IImage to a WPF BitmapSource. The result can be used in the Set Property of Image.Source
        /// </summary>
        /// <param name="image">The Emgu CV Image</param>
        /// <returns>The equivalent BitmapSource</returns>
        public static BitmapSource ToBitmapSource(Mat image)
        {
            using (System.Drawing.Bitmap source = image.ToBitmap())
            {
                IntPtr ptr = source.GetHbitmap(); //obtain the Hbitmap
 
                BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                     ptr,
                     IntPtr.Zero,
                     Int32Rect.Empty,
                     System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
 
                DeleteObject(ptr); //release the HBitmap
                return bs;
            }
        }
        #endregion
 
 
 
        #region БЕЗ ПРОСАДОК НО С ЗАДЕРЖКОЙ ОТ Midian 
        private const int Resolution = 282;
        public static BitmapSource ByteToBitmapSource(byte[] buff, int width, int height)
        {
            if (buff == null)
            {
                return null;
            }
 
            var bmpFrame = ByteToBitmap(buff, width, height);
 
            var bitmapImage = new BitmapImage();
 
            try
            {
                using (var stream = new MemoryStream())
                {
                    bmpFrame.Save(stream, ImageFormat.Bmp);
 
                    try
                    {
                        bitmapImage.BeginInit();
                        bitmapImage.StreamSource = stream;
                        bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                        bitmapImage.EndInit();
 
                        if (bitmapImage.CanFreeze)
                        {
                            bitmapImage.Freeze();
                        }
                    }
                    catch (Exception ex)
                    {
 
                        bitmapImage = null;
                    }
                }
 
                bmpFrame.Dispose();
            }
            catch (Exception ex)
            {
 
            }
 
            return bitmapImage;
        }
 
        private static Bitmap ByteToBitmap(byte[] buff, int width, int height, float zoom = 1)
        {
            if (buff == null)
            {
                return null;
            }
 
            bool isHr = width > 2000;
 
            int baseResolution = isHr ? Resolution : Resolution / 2;
            float resolution = baseResolution * (zoom >= 1 ? zoom : 1);
 
            Bitmap result = null;
 
            var bmpFrame = new Bitmap(width, height, PixelFormat.Format24bppRgb);
            bmpFrame.SetResolution(resolution, resolution);
 
            try
            {
                var a = bmpFrame.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                var p = a.Scan0;
                Marshal.Copy(buff, 0, p, buff.Length);
                bmpFrame.UnlockBits(a);
 
                result = bmpFrame;
            }
            catch (Exception ex)
            {
 
            }
 
            return result;
        }
        #endregion
 
    }


класс для обновления UI из другого потока
Кликните здесь для просмотра всего текста

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 UIHelper
    {
        /// <summary>
        /// Update UI with invocation to <see cref="Application.Current"/>'s <see cref="Dispatcher"/>.
        /// </summary>
        /// <param name="action"><see cref="Action"/> to invocation.</param>
        /// <exception cref="Exception">a <paramref name="action"/>'s callback throws an exception.</exception>
        public static void UpdateUI(Action action)
        {
            if (action == null || Application.Current == null)
            {
                return;
            }
 
            var dispatcher = Application.Current.Dispatcher;
            if (dispatcher.CheckAccess())
            {
                action();
            }
            else
            {
                try
                {
                    dispatcher.Invoke(action);
                }
                catch (TaskCanceledException) { }
            }
        }
 
        /// <summary>
        /// Begin update UI with invocation to <see cref="Application.Current"/>'s <see cref="Dispatcher"/>.
        /// </summary>
        /// <param name="action"><see cref="Action"/> to begin invocation.</param>
        /// <param name="checkAccess">check access before invoke if call in main thread.</param>
        /// <param name="priority"><see cref="DispatcherPriority"/> to invoke into UI with.</param>
        /// <exception cref="Exception">a <paramref name="action"/>'s callback throws an exception.</exception>
        public static void BeginUpdatesUI(Action action, bool checkAccess = true, DispatcherPriority priority = DispatcherPriority.Normal)
        {
            if (action == null || Application.Current == null)
            {
                return;
            }
 
            var dispatcher = Application.Current.Dispatcher;
            if (checkAccess && dispatcher.CheckAccess())
            {
                action();
            }
            else
            {
                dispatcher.BeginInvoke(priority, action);
            }
        }
    }

само окно
Кликните здесь для просмотра всего текста

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:main="clr-namespace:WpfApp1.ViewModel"
      
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        
        mc:Ignorable="d"
        Background="Black"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
 
        <main:MainWindowsVM x:Name="MainWindowsViewModel"/>
    </Window.DataContext>
    <Grid>
       
      <Image Stretch="Fill" Source="{Binding cam1sourse,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged }"></Image>
 
    </Grid>
</Window>


большое спасибо всем. отдельное огромное Midian

Добавлено через 7 минут
осталось понять почему так прыгает оперативная память. но уже не сегодня
1
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,717
11.03.2021, 09:12
Цитата Сообщение от onimor Посмотреть сообщение
Convertor.ByteToBitmapSource(mat.GetRawD ata(), mat.Width, mat.Height))
Я бы вынес это из UIHelper, пускай конвертирует в потоке, а в UI оставил бы только присвоение в проперти
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
11.03.2021, 20:50  [ТС]
Цитата Сообщение от Midian Посмотреть сообщение
Я бы вынес это из UIHelper, пускай конвертирует в потоке, а в UI оставил бы только присвоение в проперти
особо ничего не поменялось.

весь день потратил чтоб работало 3 камеры без лагов так ничего и не получилось.

процессор грузится до ~19% от 1 камеры 720p и ~31% от 1080p. 3 камеры уже почти 100%.
учитывая что помимо этой программы есть еще другие - то проц умирает и начинаются лаги.

получилось убрать задержку и процессор меньше нагружался, но при таком раскладе жралось 500-1000 мб оперативы

либо была задержка в кадрах и жрался проц , оперативная память в районе 200

максимум 3 камеры с не очень стабильной работой вышло запустить.

пробовал обертку OpenCvSharp.
их пример
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
using var capture = new VideoCapture(@"rtsp://192.168.1.10/video");
            if (!capture.IsOpened())
                return;
 
            //capture.FrameWidth = 1920;
            //capture.FrameHeight = 1280;
           // capture.AutoFocus = true;
 
            const int sleepTime = 10;
 
            using var window = new Window("capture");
            var image = new Mat();
            
            while (true)
            {
                capture.Read(image); 
                if (image.Empty())
                    break;
 
                window.ShowImage(image);
                int c = Cv2.WaitKey(sleepTime);
                if (c >= 0)
                {
                    break;
                }
            }
нагрузка процессора 8-12% , оперативная память 38мб и не скачет вообще
как только я переношу в wpf (использую их конвертор) получается тоже самое, что и в emgu. чуть по лучше, но все же 25% это не 8 как в примере

Добавлено через 12 минут
завтра буду снова пробовать, пока не получится 3 камеры не лагающие.
потому что железо может быть хуже чем мое . если у меня еле как 3 камеры, то на другом пк уже 2 это 100% нагрузка и лаги
vlc в этом плане 10 из 10 , но с него кадры нельзя брать

Добавлено через 25 минут
Как вариант мб засунуть контрол imageviewer из emgu.cv.ui в WindowsFormsHost
Завтра скажу что вышло
0
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,717
11.03.2021, 21:00
Цитата Сообщение от onimor Посмотреть сообщение
завтра буду снова пробовать, пока не получится 3 камеры не лагающие.
потому что железо может быть хуже чем мое . если у меня еле как 3 камеры, то на другом пк уже 2 это 100% нагрузка и лаги
А что за железо у вас?

Добавлено через 1 минуту
Цитата Сообщение от onimor Посмотреть сообщение
(использую их конвертор)
так не используйте их конвертор

Добавлено через 3 минуты
Цитата Сообщение от onimor Посмотреть сообщение
процессор грузится до ~19% от 1 камеры 720p и ~31% от 1080p. 3 камеры уже почти 100%.
я у себя вроде понижал качество картинки, 720p может быть много, выводите вообще 800 на 600, или прям вот критично такое качество?

Добавлено через 4 минуты
если вы выводите 3 или более картинки с камер на экране, то явно что они будут размещены в небольших окнах, понижайте тогда качество картинок до минимального, тогда будет работать шустро, как только вы выбираете какую-то конкретную камеру и она открывается в максимально в окне, тогда можете для нее одной делать качество получше, это решит вашу проблему, а так вы пытаетесь слабенький ПК нагрузить потоками с 3 камер
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
12.03.2021, 11:47  [ТС]
Цитата Сообщение от Midian Посмотреть сообщение
А что за железо у вас?
Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz 2.71 GHz
8,00 ГБ Ram

Цитата Сообщение от Midian Посмотреть сообщение
так не используйте их конвертор
он нормальный)

читал вопросы на гите emgu. у всех жрет процессор конвертация в wpf
и якобы эффективнее использовать CvInvoke.Imdecode пока не успел проверить

Цитата Сообщение от Midian Посмотреть сообщение
если вы выводите 3 или более картинки с камер на экране, то явно что они будут размещены в небольших окнах, понижайте тогда качество картинок
думал вчера , сегодня попробовал
C#
1
2
3
4
5
6
             if (camera2.Retrieve(mat))
            {
               
                CvInvoke.Resize(mat, mat2, new System.Drawing.Size(320, 240));
                UIHelper.UpdateUI(()=> cam1sourse = Convertor.ToBitmapSource(mat2));
            }
при этом если менять размер и сразу сливать в этот же mat то нагрузка на цп чуть больше
пробовал и bitmap менять в принципе результат такой же
10-11% загрузки процессора с 1 камеры
пробовал понизить частоту кадров до 15
C#
1
camera2.SetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps, 15);
не работает, может там авторизация нужна не знаю..
понизил фпс через onvif менеджер - нагрузка снизилась до 5%
15 фпс приемлемо для меня. размер видео можно привязать к размеру image в UI , но хотелось бы все таки 720p

осталось понять как понизить фпс и что-то придумать с 720p

Добавлено через 2 минуты
кстати у меня 3 камеры при 15 фпс жрали 31% и работали более менее нормально хоть и мыло 720p *0,5
решил проверить на более слабом ноутбуке. в итоге 60% нагрузка и почему то лагающие зависшие камеры
0
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,717
12.03.2021, 12:49
Цитата Сообщение от onimor Посмотреть сообщение
и якобы эффективнее использовать CvInvoke.Imdecode пока не успел проверить
я это не использовал, поэтому как вариант попробуйте
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
03.04.2021, 09:49  [ТС]
Вообщем 3 важных параметра, которые убирают нагрузку с процессора:

1) Разрешение видео - не очень сильно влияет, если только сделать 320х240 , но нагрузка понижается.
2) Частота кадров(fps)- очень сильно влияет. Понижение 30 кадров до 15 кадров уменьшает нагрузку в 2 раза(логично).
3) Наличие Видеокарты от nVidia - забирает всю нагрузку на себя. Можно 1080p, 30 кадров спойконо показывать 3 камеры. Нагрузка на процессор у меня 10-20% , на видео карту ~50%.

3тьего пункта у меня и не было. По этому была нагрузка 100%
1
 Аватар для Midian
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,717
03.04.2021, 15:53
Цитата Сообщение от onimor Посмотреть сообщение
3тьего пункта у меня и не было. По этому была нагрузка 100%
Ну вот, у меня ПК был с 1080Ti на работе, поэтому все работало быстро
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.04.2021, 15:53

(потоки )не работает так как должен в чем причина
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;thread&gt; using namespace std; // Функция для выполнения в дочернем потоке: void...

Админ-ры БД, разработчики приложений, разработчики БД, конечные пользователи-кто есть кто, кто чем занимается?
Собственно теория... Пользователи СУБД делятся на четыре различные группы: •1)администраторы баз данных. •2)разработчики приложений; ...

пожалуйста, посмотрите.у меня тут анимация со скринов с музыкой, но почему-то музыку не воспроизводит, в чём дело не могу понять
program akuna_matata; uses GraphABC, Sounds; const p=80; var i,x,m: integer; begin m:=loadSound('m.wma'); ...

Подскажите кто знает, как и чем создать образ !!!
Мне нужен не простой образ диска, а образ диска &quot;С&quot; -с последующим залитеем опять же на этот диск &quot;С&quot; только не при помощи...

Visual C# потоки, может кто подскажет
не могу понять, как с потоком разобраться public void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru