WPF(Livet)とOpenCVSharpで動画再生

動画の再生を行います。

ほぼ下のサイトのコピーですが。。。
http://sourcechord.hatenablog.com/entry/2014/10/05/022144


まずはXAMLです。
    



次はModelViewです。
ボタンを押すとファイル選択ダイヤログを表示して、
動画ファイルを選択すると 自動的に動画再生を行うようになります。

また、動画再生中にウィンドウがフリーズしないよう、async,awaitで非同期処理を行っています。

using Microsoft.Win32;
using System.Windows;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace LivetSample.ViewModels
{
public class MainWindowViewModel : ViewModel
{
public void Initialize()
{
}

#region FileUri変更通知プロパティ
private string _FileUri;

public string FileUri
{
get
{ return _FileUri; }
set
{
if (_FileUri == value)
return;
_FileUri = value;
RaisePropertyChanged();
}
}
#endregion

#region WBitmap変更通知プロパティ
private WriteableBitmap _WBitmap;

public WriteableBitmap WBitmap
{
get
{ return _WBitmap; }
set
{
if (_WBitmap == value)
return;
_WBitmap = value;
RaisePropertyChanged();
}
}
#endregion

#region FileOpenCommand
private ViewModelCommand _FileOpenCommand;

public ViewModelCommand FileOpenCommand
{
get
{
if (_FileOpenCommand == null)
{
_FileOpenCommand = new ViewModelCommand(FileOpen);
}
return _FileOpenCommand;
}
}

public async void FileOpen()
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "ファイルを開く";
dlg.Filter = "動画ファイル|*.avi";
if (dlg.ShowDialog() == true)
{
FileUri = dlg.FileName;
await ShowImage();
}
}
#endregion

private async Task ShowImage()
{
using (var cap = new CvCapture(FileUri))
{
int interval = (int)(1000 / cap.Fps);
IplImage img;
while ((img = cap.QueryFrame()) != null)
{
WBitmap = img.ToWriteableBitmap();
await Task.Delay(interval);
}
}
}
}
}