roboforum.ru

Технический форум по робототехнике.

артефакты при грабе видео с IP камеры

артефакты при грабе видео с IP камеры

z10 » 31 июл 2015, 14:11

Почему при подключении к айпи камере нормальную картинку я получаю первые 3-5 секунд. Далее - сплошные артефакты. Пробовал как чистый OpenCV, так и EmguCV. Что вывод в свое окно, что вывод в созданное библиотечкой окно - все одинаково:

Изображение

Самая верхушка нормально, а ниже - бяка. Ну иногда еще зеленые артефакты бывают. Я поначалу грешил на то, что беру картинку с камеры, проброшенной по ВПН, но нет, в родной сети та же история. Но HVRServer/ILDVR Live Center показывают нормальную картинку. Хотя используют ту же OpenCV (что по ВПН, что в родной сети).

Небольшой набросок кода на шарпе:
Код: Выделить всёРазвернуть
private Emgu.CV.Capture _cap = null;
        private Graphics _gtr = null;   // холст
        private Rectangle _rct;         // клиентская область холста
        private Bitmap _bmp = null;     // картинка от камеры для сохранения и вывода

        private void Form1_Load(object sender, EventArgs e)
        {
            // получаем холст и его клиентскую область
            _gtr = this.pictureBox1.CreateGraphics();
            _rct = this.pictureBox1.ClientRectangle;

            // подключаемся к камере и показываем в заголовке размеры каринки
            _cap = new Emgu.CV.Capture(@"rtsp://admin:admin@192.168.40.121:554");
            this.Text = string.Format("{0} x {1}", _cap.Width, _cap.Height);
           
            // считаем число кадров в секунду для таймера
            int _rate = (int)(1000 / _cap.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps);

            // таймер
            Timer _tmr = new Timer();
            _tmr.Interval = _rate == 0 ? 100 : _rate; // интервал - число кадров в сек.
            _tmr.Tag=(object)0; // для имени файла

            // срабатывание таймера
            _tmr.Tick+=(s, ea) =>
                {
                    lock (this.sync)
                    {
                        // читаем картинку и если не вышло - выход из события
                        Emgu.CV.Mat mt = _cap.QuerySmallFrame();
                        if (mt == null)
                            return;

                        // один раз получаем картинку
                        _bmp = mt.Bitmap;

                        // рисуем ее
                        _gtr.DrawImage(_bmp, _rct);

                        // сохраняем в файл
                        int x = (int)_tmr.Tag;
                        _bmp.Save(string.Format("IMG_{0}.jpg", x),System.Drawing.Imaging.ImageFormat.Jpeg);
                        x++;
                        _tmr.Tag = (object)x;

                        // удаляем полученную картинку
                        _bmp.Dispose();

                    }
                };

            // стартуем таймер
            _tmr.Start();

        } // private void Form1_Load


Ради эксперимента сбрасываю кадры в файлы... То есть проблема в получении картинки либо в обработке ее самой OpenCV. Может я чего-то недопонял? :sorry:


Rambler\'s Top100 Mail.ru counter