Как захватить видеопоток через http с помощью IP-камеры с помощью emgucv в c#

Мне очень трудно найти решение для чего-то, что, как мне кажется, было бы очень простым. Конструктор захвата (строка) в Emgu.CV должен «Создать захват из файла или видеопотока».

Однако я не могу ничего захватить с помощью своего кода на C#, несмотря на то, что моя IP-камера (Axis) разрешает видеопоток следующим образом: Запросить видеопоток Motion JPEG -> http://myserver/axis-cgi/mjpg/video.cgi (Кстати, по словам производителя, "Успешный запрос возвращает непрерывный поток изображений JPEG . Тип содержимого — multipart/x-mixed-replace, и каждое изображение заканчивается граничной строкой .")

К вашему сведению, сервер камеры требует входа в систему с именем пользователя и паролем, которые я еще не смог понять, как включить в Capture... Должен ли я сначала сделать HTTPWebRequest, а затем выполнить Capture, или я должен сделать что-то гораздо более сложное? Не уверен, что вход в систему может быть проблемой, поскольку я не получил конкретной ошибки по этому поводу, но подозреваю, что может потребоваться веб-запрос, который я не знаю, как включить...

Урезанный код в моем form.cs:

Capture _capture = null; //Camera
string sourceURL = "http://192.168.0.90/axis-cgi/mjpg/video.cgi";
_capture = new Capture(sourceURL);
Image<Bgr, Byte> imgOriginal = new Image<Bgr, byte>(_capture.RetrieveBgrFrame().ToBitmap());

Затем я пытаюсь отобразить imgOriginal в ImageBox. Однако на последнем шаге выше он уже выдает ошибку «невозможно создать захват...» или что-то в этом роде.

Разве это не должно быть очень просто с emguCV или я ошибаюсь? Если кто-то может помочь мне понять, как захватить изображение, я могу взять его оттуда с обработкой моих изображений. Заранее спасибо!


person JoeC    schedule 28.04.2015    source источник


Ответы (2)


Может быть, слишком поздно для этого поста, но, надеюсь, он поможет кому-то еще в будущем.

Для видеокодека MJPEG используйте ==> http://root:[email protected]/axis-cgi/mjpg/video.cgi?x.mjpeg

Для кодека H.264 используйте ==> rtsp://root:[email protected]/axis-media/media.amp?videocodec=h264&resolution=640x480

Обратите внимание, что эти URI относятся только к IP-камерам марки AXIS. Для других марок IP-камер я бы посоветовал вам проверить указанный ниже веб-сайт, поскольку у каждого производителя есть свой HTTP или RTSP URI.

http://www.soleratec.com/support/rtsp/rtsp_listing

Что касается кода реализации, вот начало:

private static Capture _cameraCapture;

//Windows form button to start the video stream                
private void btn_play_Click(object sender, EventArgs e)
{            
 Run();                            
} 

private void Run()
{
 if (rdbWebcam.Checked == true) //radio button
 {
  _cameraCapture = new Capture(0); //use local webcam
 }
else
  {
  _cameraCapture = new Capture(txtrtsp.Text); //use rtsp or http uri you typed into a textbox
  }
 Application.Idle += ProcessFrame;
}   

private void  ProcessFrame(object sender, EventArgs e)
 {         
   try
       {
        Mat frame = _cameraCapture.QueryFrame();
        imageBox1.Image = frame; //imagebox to  show live video
        }
       catch (Exception ex)
        {
        MessageBox.Show(ex.Message);
         Application.Exit();
         }
}

//Windows Form FormClosing event
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{     
 if (_cameraCapture != null)
    {
     _cameraCapture.Stop();
     _cameraCapture.Dispose();
    }

}
person rugby2312    schedule 29.12.2016

Есть несколько вещей, которые вы можете попробовать.

  1. Сначала вы можете использовать что-то вроде fiddler (это прокси-сервер для мониторинга вашего веб-трафика), чтобы проверить это, когда приложение делает запрос на сервер, какой ответ возвращается.
  2. Во-вторых, если сервер требует аутентификации, скорее всего, он использует базовую аутентификацию HTTP, вы можете попытаться вызвать URL-адрес что-то вроде

    string sourceURL = "http://username:[email protected]/axis-cgi/mjpg/video.cgi"; _capture = new Capture(sourceURL);

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

  1. Вы можете использовать встроенную функцию cvInvoke, чтобы проверить, помогает ли это. Код будет примерно таким.

    Capture _Capture = new Emgu.CV.CvInvoke.cvCreateFileCapture("http://username:[email protected]/axis-cgi/mjpg/video.cgi");

Пожалуйста, обратитесь к этот ответ SO для получения дополнительной информации

person Shiva    schedule 02.05.2015
comment
Привет Шива, Спасибо за вашу помощь. Я получаю следующую ошибку: Emgu.CV.CvInvoke.cvCreateFileCapture(string) — это «метод», но используется как «тип». Когда я беру новый, я получаю Невозможно неявно преобразовать тип «System.IntPtr» в «Emgu.CV.Capture». Не знаете, как это сделать правильно, поскольку в предыдущей ссылке, которую вы предоставили, не было четко указано, как исправить проблему с InPtr? - person JoeC; 06.05.2015