我有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/