【问题标题】:How to capture video stream via http with an IP camera using emgucv in c#如何在 c# 中使用 emgucv 使用 IP 摄像机通过 http 捕获视频流
【发布时间】:2015-07-06 18:08:01
【问题描述】:

我很难为我认为非常简单的事情找到解决方案。 Emgu.CV 中的捕获构造函数(字符串)应该“从文件或视频流创建捕获”。

但是,尽管我的 IP 摄像头(轴)允许以下视频流,但我无法使用 C# 中的代码捕获任何内容: 请求 Motion JPEG 视频流 -> http://myserver/axis-cgi/mjpg/video.cgi (顺便说一句,根据制造商的说法,“一个成功的请求会返回一个连续的JPEG图像流。内容类型是multipart/x-mixed-replace,每个图像都以一个边界字符串结尾。”)

仅供参考,相机服务器确实需要用户名和密码登录,我还无法弄清楚如何将其包含在 Capture 中,要么...... 我应该先创建一个 HTTPWebRequest,然后再进行 Capture,还是应该做一些更复杂的事情?不确定登录是否可能是一个问题,因为我没有得到具体的错误,但怀疑可能需要一个 webrequest,我不知道如何包含......

在我的 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());

然后我尝试在 ImageBox 中显示 imgOriginal。但是,在上面的最后一步中,它已经生成了一个错误,显示“无法创建捕获...”或类似的内容。

这对于 emguCV 不应该很简单还是我弄错了?如果有人可以帮助我弄清楚如何捕获图像,我可以从那里处理我的图像。提前谢谢!

【问题讨论】:

    标签: c# video stream emgucv capture


    【解决方案1】:

    这篇文章可能为时已晚,但希望它会在未来对其他人有所帮助。

    对于 MJPEG 视频编解码器使用 ==> http://root:pass@172.16.10.38/axis-cgi/mjpg/video.cgi?x.mjpeg

    对于 H.264 编解码器使用 ==> rtsp://root:pass@172.16.10.38/axis-media/media.amp?videocodec=h264&resolution=640x480

    请注意,这些 URI 仅适用于 AXIS 品牌 IP 摄像机。对于其他 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();
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      您可能想尝试一些事情。

      1. 首先,您可以使用类似fiddler(它是监控您的网络流量的代理)来检查应用程序向服务器发出请求时返回的响应是什么。
      2. 其次,如果服务器需要身份验证,它很可能使用 HTTP Basic 身份验证,您可能想尝试调用类似的 url

        string sourceURL = "http://username:password@192.168.0.90/axis-cgi/mjpg/video.cgi"; _capture = new Capture(sourceURL);

      否则你将不得不在 Authorization Header 中发送参数

      1. 您可以使用本机cvInvoke 函数来检查它是否有帮助。代码将是这样的。

        Capture _Capture = new Emgu.CV.CvInvoke.cvCreateFileCapture("http://username:password@192.168.0.90/axis-cgi/mjpg/video.cgi");

      更多信息请参考this SO answer

      【讨论】:

      • 嗨湿婆,感谢您的帮助。我收到以下错误:“Emgu.CV.CvInvoke.cvCreateFileCapture(string)' 是一种'方法',但它被用作'类型'”。当我取出“新”时,我得到“无法将类型'System.IntPtr'隐式转换为'Emgu.CV.Capture'”。不确定如何正确执行此操作,因为您提供的先前参考似乎没有明确说明如何解决 InPtr 问题?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多