一、界面布局
- 两个
Button
- 一个
PictureBox
- 一个
BackgroundWorker cameraWorker
二、功能实现
2.1 打开视频文件
- 打开文件夹
- 选择视频文件
- 判断文件是否打开,否:提示并退出
- 文件后台任务
fileWorker
开始运行
private void openFileBtn_Click(object sender, EventArgs e)
{
if (fileWorker.IsBusy)
{
closeFile();
}
else
{
openFile();
}
}
private void openFile()
{
OpenFileDialog openfiledialog = new OpenFileDialog();
//openfiledialog.Title = "打开文本文件";
openfiledialog.Filter = "All Files(*.*)|*.*|mp4 Files(*.mp4)|*.mp4";
openfiledialog.FilterIndex = 2;//根据文件类型索引设置文件过滤类型
openfiledialog.RestoreDirectory = true;//设置对话框是否记忆之前打开的目录
if (openfiledialog.ShowDialog() == DialogResult.OK)
{
Console.WriteLine(openfiledialog.FileName);
capture.Open(openfiledialog.FileName, VideoCaptureAPIs.ANY);
if (!capture.IsOpened())
{
Close();
MessageBox.Show("打开视频文件失败");
return;
}
openFileBtn.Text = "关闭视频文件";
fileWorker.RunWorkerAsync();
}
}
private void closeFile()
{
openFileBtn.Text = "打开视频文件";
fileWorker.CancelAsync();
capture.Release();
pictureBox1.Image = null;
}
2.2 运行文件后台任务
while
死循环- 获取文件
frameMat
- 判断
frameMat
是否为空,是:则跳出循环 - 转换成
Bitmap
- 复制给
pictureBox1
private void fileWorker_DoWork(object sender, DoWorkEventArgs e)
{
int sleepTime = (int)Math.Round(1000 / capture.Fps);
var bgWorker = (BackgroundWorker)sender;
while (!bgWorker.CancellationPending)
{
using (var frameMat = capture.RetrieveMat())
{
if (frameMat.Empty())
break;
var frameBitmap = BitmapConverter.ToBitmap(frameMat);
bgWorker.ReportProgress(0, frameBitmap);
}
Thread.Sleep(sleepTime);
}
Console.WriteLine("fileWorker_DoWork end");
}
private void fileWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
var frameBitmap = (Bitmap)e.UserState;
pictureBox1.Image?.Dispose();
pictureBox1.Image = frameBitmap;
}
private void fileWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("fileWorker_RunWorkerCompleted");
openFileBtn.Text = "打开视频文件";
}
三、异常报错
System.TypeInitializationException:““OpenCvSharp.Internal.NativeMethods”的类型初始值设定项引发异常。”
内部异常
DllNotFoundException: 无法加载 DLL“OpenCvSharpExtern”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。
因为还少了一点dll
- 点击下载OpenCVSharp dll.zip
- 放到
\bin\Debug\下面
四、运行
- 堪称完美
五、Demo源码
觉得好,就一键三连呗(点赞+收藏+关注)