質問があります。私のウェブカメラからのストリームをWPFの画像コンテナにどのように表示できますか?私はすでにEmguでストリームを取得し、それをBitmapSourceに変換しましたが、現在、WebカメラからWPF、Caliburn(MVVM)、すべてのXミリ秒でImageをバインドする方法を理解できません....私のウェブカメラからのビデオストリームをWPFで表示しますか?
答えて
[OK]をソリューションが見つかりました。 私はコード全体を表示することはできませんが、私は少し説明することができ、WPFビューをバインドする:
<Image x:Name="ImageWebcam" />
私のViewModelに私がしなければならない(カリバーンフレームワークを使用したが、これは簡単にMVVMパターンに適合させることができます)同じ名前を持つ関数で画像をバインドします
public WriteableBitmap ImageWebcam
{
get
{
return this.imageWebcam;
}
set
{
this.imageWebcam = value;
this.NotifyOfPropertyChange(() => this.ImageWebcam);
}
}
をそして、私はViewModelにコンストラクタに初期化されなければならないタイマーを使用し、このイメージを更新するには:
public MachinBidule()
{
timeIsRunningOut= new System.Timers.Timer();
timeIsRunningOut.AutoReset = true;
timeIsRunningOut.Interval = 10;
timeIsRunningOut.Elapsed += (sender, e) => { UpdateImage(); };
capture = new Capture(); // Capture the webcam using EmguCV
}
そして今、あなたはディスパッチャを使用してアップデートを管理することができます
// Update the image, method called by the timer every 10 ms
private void UpdateImage()
{
// If capture is working
if(capture.QueryFrame()!= null)
{
//capture an Image from webcam stream and
Image<Bgr, Byte> currentFrame = capture.QueryFrame().ToImage<Bgr, Byte>();
if (currentFrame != null)
{
Application.Current.Dispatcher.BeginInvoke(new System.Action(() => { imageWebcam = new WriteableBitmap(BitmapSourceConvert.ToBitmapSource(currentFrame)); NotifyOfPropertyChange(() => ImageWebcam); }));
}
}
}
あなたは私たちがemguCV Image<Bgr,Byte>
からWPF WriteableBitmap
に変換し、NotifyOfPropertyChange(() => ImageWebcam)
に更新を通知する必要があることに気づくことができます。
質問がある場合は、私に連絡するか、コメントしてください。 あなたが間違いを気付いたなら、私を訂正するのをためらってください(文法&コード)。
あなたがいないImage
制御、映像を表示するためにMediaElement
を使用する必要があります。
XAML:
<MediaElement Source="{Binding VideoAddress}" />
のViewModel:
private URI videoAddress=new URI("C:\video.wmv");
public URI VideoAddress
{
get { return videoAddress; }
set
{
videoAddress = value;
OnPropertyChanged("LeafName");
}
}
また、WPF-MediaKitを使用すると、WebCamのビデオを表示できます。またはsee this tutorial。
更新:
あなたは画像を表示するために、Image
を使用する必要があります。
<Image x:Name="imageWebcam" />
とC#:
BitmapImage logo = new BitmapImage();
logo.BeginInit();
logo.UriSource = new Uri("C:/1.png");
logo.EndInit();
imageWebcam.Source = logo;
は、あなたの画像要素のソースとしてWriteableBitmapを使用してください。ビューモデルで新しいフレームごとにフレームデータを渡すコールバックを提供する必要があります。このコールバックをコードビューで購読してください。各フレームをビットマップに書き込むことができます。私はデータバインディングがこの場合には良いアプローチだとは思わない。
はるかにWPFで最良の選択肢であるWriteableBitmapビデオ・フレームのストリームを扱う:
EmguCVは「Bgrイメージフレーム」をキャプチャするので、実際にビデオとして使用できますか? –
画像を表示するには、更新されたセクションを参照してください。 – StepUp
@EstebanChamard質問はお気軽に。私の返事があなたに役立つと感じたら、私の返事を答えとしてマークして、将来の他の人の検索を簡単にすることができます。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-workをご覧ください。 – StepUp