我有2个IP摄像机,它们是不同的型号,并且都来自同一制造商。让我们将它们称为 Cam1 Cam2 。我想通过它们的网络地址从这些摄像机中检索帧,但是存在一些问题。

凸轮1:

当使用frame = capture.RetrieveBgrFrame(); 框架时,始终为

当使用frame = capture.QueryFrame(); 框架时 OK

Cam2 (与我的PC在同一网络中):

当使用frame = capture.RetrieveBgrFrame(); 框架时,始终为

使用frame = capture.QueryFrame(); 时,WinForm 被冻结,并且计算机(i7 3,3GHz,6GB RAM)被冻结。

两个流地址都可以。我试图用VLC和OpenCV C++平台打开它们。

这里可能有什么问题?

这是代码:

using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using Emgu.CV.UI;

namespace IPcamera
{
    public partial class Form1 : Form
    {
        private Capture capture;
        private Image<Bgr, Byte> frame;

        public Form1()
        {
            InitializeComponent();

            try
            {
                capture = new Capture(camera_address);
            }
            catch (NullReferenceException exception)
            {
                MessageBox.Show(exception.Message);
            }

            if (capture != null)
            {
                Application.Idle += ProcessFrame;
            }
        }

        void ProcessFrame(object sender, EventArgs e)
        {
            frame = capture.RetrieveBgrFrame();
            if (frame != null)
            {
                pictureBox1.Image = frame.ToBitmap();
            }
        }
    }
}

最佳答案

我通常不使用IP摄像机,但是我怀疑它们在初始化时不会开始拍摄图像。 RetrieveBgrFrame()返回相机拍摄的las图像,因此,如果我没错,RetrieveBgrFrame()将返回null,因为相机本身不是在拍摄图像。尝试将ProcessFrame处理程序添加到相机事件捕获中。ImageGrabbed代替Application.Idle并检查它是否被调用。

关于冻结,如果是“低fps”冻结,则可能是由于摄像机速度慢或试图通过慢速总线发送大图像。如果它永远死机,请检查是否有其他应用程序可以使用该相机并且释放了资源(您是在cam2之前尝试cam1还是在新运行中尝试cam2?)

关于c# - 从IP摄像机检索帧时出现各种问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22475883/

10-10 16:13