Как получить изображения в формате JPEG с более высоким Fps с IP-камеры - PullRequest
1 голос
/ 12 апреля 2011

Hy Every!

У меня проблема с захватом изображений с IP-камеры Panasonic в формате JPEG, потому что проблема с fps, потому что fps всегда остается на 1 или 2, но не больше, но infact-камера поддерживает до 30, модель камеры Panasonic WV-SP302E Я использую следующий код C #, чтобы захватить изображение и отобразить его в моем приложении winforms

public partial class Form1 : Form
{
    // indicates wether to prevent caching in case of a proxy server or not
    private bool preventCaching = false;                

    public Form1()
    {
        InitializeComponent();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        while (true)
        {
            this.pictureBox1.Image = this.GetSingleFrame(@"http://ipaddress/SnapshotJPEG?Resolution=320x240&Quality=Standard");                
        }
    }

    /// <summary>
    /// Get a single JPEG frame from the camera
    /// </summary>
    /// <param name="source">JPEG Stream source</param>
    /// <exception cref="WebException">If the IP camera is not receable or an error is occured</exception>
    /// <exception cref="Exception">If an unknown error occured</exception>
    public Bitmap GetSingleFrame(string source)
    {
        byte[] buffer = new byte[512 * 1024];   // buffer to read stream
        HttpWebRequest req = null;
        WebResponse resp = null;
        Stream stream = null;
        Random rnd = new Random((int)DateTime.Now.Ticks);

        try
        {
            int read, total = 0;

            // create request
            if (!preventCaching)
            {
                req = (HttpWebRequest)WebRequest.Create(source);
            }
            else
            {
                req = (HttpWebRequest)WebRequest.Create(source + ((source.IndexOf('?') == -1) ? '?' : '&') + "fake=" + rnd.Next().ToString());
            }
            // set login and password                
            req.Credentials = new NetworkCredential("root", "a");                

            req.Timeout = -1;

            resp = req.GetResponse();

            // get response stream
            stream = resp.GetResponseStream();

            // loop
            do
            {
                read = stream.Read(buffer, total, 1024);

                total += read;
            }
            while (read != 0);

            Bitmap bmp = (Bitmap)Bitmap.FromStream(new MemoryStream(buffer, 0, total));

            return bmp;
        }
        catch (WebException ex)
        {
            string s = ex.ToString();
            return null;
        }
        catch (Exception ex)
        {
            string s = ex.ToString();
            return null;
        }
        finally
        {
            // abort request
            if (req != null)
            {
                req.Abort();
                req = null;
            }
            // close response stream
            if (stream != null)
            {
                stream.Close();
                stream = null;
            }
            // close response
            if (resp != null)
            {
                resp.Close();
                resp = null;
            }
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.backgroundWorker1.RunWorkerAsync();
    }
}

Я даже использую компонент backgrounworker для захвата изображений в другом потоке, но по-прежнему 2 кадра в секунду. Есть идеи как увеличить fps

Ответы [ 4 ]

1 голос
/ 27 октября 2018

Обычно вы не можете запросить больше, чем несколько изображений JPEG / секунду с IP-камеры. Если вам нужен видеопоток с частотой 30 кадров в секунду, вам нужно запросить «видеопоток», такой как motion jpeg, а не поток снимков.

1 голос
/ 04 октября 2011

Прошло довольно много времени с момента вопроса, но с тех пор все так же.

Камера обеспечивает до 30 кадров в секунду в потоковом режиме, однако это не обязательно относится к JPEGчастота кадров снимка.В зависимости от модели камеры эффективная скорость JPEG может быть более или менее медленной по сравнению с потоковой передачей на полной скорости.

Мало что можно с этим поделать (это типично для камеры MPEG-4 / H.264 для отправкиJPEG с более низкой скоростью), вы можете выбрать следующие параметры:

  • получать изображения с камеры посредством получения видеопотока (который может быть стандартным протоколом, таким как RTSP, или проприетарным протоколом через SDK, или с помощью элемента управления ActiveX отпоставщик камеры)
  • замените камеру на более подходящую модель, которая дает вам больше снимков JPEG в секунду
0 голосов
/ 12 апреля 2011

Убедитесь, что вы правильно освещаете сцену. Простое и несколько неточное объяснение состоит в том, что цифровые камеры в режиме автоэкспозиции будут ждать, пока они не захватят достаточно света, что в темной сцене (например, темной комнате ночью) с неэффективным датчиком займет некоторое время. Попробуйте камеру в более светлом помещении или на улице при дневном свете, и посмотрите, улучшится ли ваша частота кадров.

0 голосов
/ 12 апреля 2011

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

Скорее всего, поможет чтение нескольких кадров после начала потока (т.е. получение растровых изображений из цикла сбора данных). К вашему сведению, вы не должны вызывать операции с графическим интерфейсом из не-графического потока. Используйте ReportProgress для отправки данных обратно.

Вы уверены, что захват занимает время, а не показывает его? Вы пытались удалить код чертежа для проверки?

...