【发布时间】:2014-08-29 13:10:41
【问题描述】:
我正在尝试创建一个 WPF 应用程序,它允许我逐帧单击视频。我正在使用 Emgu.CV 框架 Capture 类。我可以点击 20 到 30 帧然后它停止工作。
基本上我正在做的是单击一个开始捕获的按钮 Capture.Start()。在帧处理程序中,我抓取帧并调用 Capture.Pause()。我再次单击按钮以再次开始该过程。我可以这样做一段时间,他们停止工作。如果只是开始捕获并且不暂停并重新启动它,我可以一直播放视频。 这是我正在使用的代码。
private void btnCapture_Click(object sender, RoutedEventArgs e) {
capture = new Capture("C:\\AAAAA\\testVideo.mp4");
capture.ImageGrabbed += ProcessFrame;
webCamDisplay.DataContext = webCamManager;
capture.Start();
}
private void btnNextFrame_Click(object sender, RoutedEventArgs e) {
try {
capture.Start();
} catch (Exception ex ) {
string msg = ex.Message;
}
}
private void ProcessFrame(object sender, EventArgs arg) {
try {
Image<Bgr, Byte> frame = capture.RetrieveBgrFrame();
try {
this.Dispatcher.Invoke((Action)(() => {
webCamDisplay.Source = BitmapSourceConvert.ToBitmapSource(frame);
webCamManager.Update(frame);
}));
} catch (Exception ex) {
string msg = ex.Message;
}
capture.Pause();
} catch (Exception ex) {
string msg = ex.Message;
}
}
public class BitmapSourceConvert {
public static BitmapImage ToBitmapSource(IImage image) {
using (System.Drawing.Bitmap source = image.Bitmap) {
System.Windows.Media.Imaging.BitmapImage bImg = new System.Windows.Media.Imaging.BitmapImage();
try {
MemoryStream ms = new MemoryStream();
source.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
bImg.BeginInit();
bImg.StreamSource = new MemoryStream(ms.ToArray());
bImg.EndInit();
return bImg;
} catch (Exception ex) {
string ms = ex.Message;
throw new Exception(ms);
}
}
}
}
【问题讨论】:
-
你遇到了什么异常。
-
您有 2 个错误 1) 设置
bImg.CacheOption = BitmapCacheOption.OnLoad;2) 将using添加到MemoryStream ms = new MemoryStream() -
例外是“堆已损坏”。我把你的改变,仍然得到错误。感谢您的回复。
-
我也会在这一行得到“System.AccessViolationException”异常,source.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
-
在这一行删除
usingusing (System.Drawing.Bitmap source = image.Bitmap)。因为你在处理后使用frame。并在这一行添加usingImage<Bgr, Byte> frame = capture.RetrieveBgrFrame();