RTSP流的捕获图像模糊/损坏

3
我正在使用Emgu CV 2.4.10创建一个实时流查看器,最终将与IP摄像机一起使用。由于我还没有摄像机,因此我正在使用VLC(Windows GUI)从视频文件中创建流进行测试。
:sout=#duplicate{dst=rtp{sdp=rtsp://:8554/stream},dst=display} :sout-all :sout-keep

我正在本地进行所有测试。
这是我的截取代码:
private void ProcessFrame(object sender, EventArgs arg) {
    try {
        frame = _capture.QueryFrame();
        pictureBox1.Image = frame.ToBitmap();
    }
    catch (Exception ex) {
        MessageBox.Show(ex.Message.ToString());
    }
}

使用此事件处理程序调用此方法:

_capture = new Capture("rtsp://localhost:8554/stream");
Application.Idle += ProcessFrame;
_capture.Start();

捕捉到的内容出现了随机的“模糊”现象,总是发生在帧的下部。

screencapture showing smearing on the lower half of the captured video frame

我看到有几个人在去年12月份以来报告了这个问题,但是没有找到解决方法或适合我的方法:

为了缩小问题范围,我从命令行运行了ffplay,捕捉效果完美。我运行了另一个VLC实例来捕获RTSP流,并且它显示得很完美。所以这显然是OpenCV / Emgu CV中的问题。

我一时兴起,将VLC更改为使用HTTP进行流传输。

:sout=#duplicate{dst=http{mux=ffmpeg{mux=flv},dst=:8080/stream},dst=display} :sout-all :sout-keep

这在我的代码中显示得很好,但帧率明显较低,无法满足我的应用需求。我真的很感激任何解决此问题的提示。谢谢。
1个回答

0

我不知道你是否解决了问题,但我建议你不要在应用程序的idle事件中进行处理。相反,使用线程。创建另一个线程并在其中执行进程。以下是C#代码示例:

Thread t = new Thread(new ThreadStart(()=>{ while(true) {frame = _capture.QueryFrame();
        pictureBox1.Image = frame.ToBitmap();}}));  t.IsBackGround = true; t.Start();

感谢您的回复。我最终更新到了最近发布的Emgu.CV-3.0.0-rc1版本。令我惊讶的是,这似乎解决了我所有的模糊问题。目前为止一切都很顺利。 - 4mla1fn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接