ほぼ下のサイトのコピーですが。。。
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); } } } } }
0 件のコメント:
コメントを投稿