11

Webcam フィードを表示する必要がある WPF アプリケーションを作成しています。AForge フレームワークでこれを簡単に実行できましたが、あるコンピューターから別のコンピューターに変更すると、同じコードが同じようには機能しません。

最初のものではウェブカメラ フィードは完全に機能しますが、もう 1 つのものではこれが発生せず、フィードに多くの遅延があり、アプリケーションが適切に機能しません。

コードは次のとおりです。

    private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        Bitmap img = (Bitmap)eventArgs.Frame.Clone();

        this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render, (SendOrPostCallback)delegate
            {
                IntPtr hBitmap = img.GetHbitmap();
                System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                    hBitmap,
                    IntPtr.Zero,
                    Int32Rect.Empty,
                    System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

                DeleteObject(hBitmap);

                img.Dispose();
                GC.Collect();
                image1.Source = bitmapSource;

            }, null);

    }

このコードは非常に単純で、webcam から new_frame を の形式で取得し、Bitmapそれを に変換する必要があるBitmapSourceため、WPF の画像フレームに表示できます。この変換が起こっている混乱の原因だと思いますが、なぜそれがコンピューターで機能し、他のコンピューターでは機能しないのか理解できません。

コンピューターのスペックはほぼ同じで、プロセッサもシステム メモリも同じです。

ここでの私の問題はパフォーマンスに関するもので、あるコンピューターのこのコードはスムーズに実行され、Web カメラ フィードは正常に表示されますが、別の PC に移植すると、これは起こりません。

4

4 に答える 4

22

これは、この記事に基づいた作業コードです。

(1)最後の AForge フレームワークをダウンロードしてインストールします。(私はバージョン 2.2.4 を使用しました)

(2) WPF アプリケーション プロジェクトを作成します。

(3) それらの AForge DLL への参照を追加します。(C:\Program Files (x86)\AForge.NET\Framework\Release フォルダーの下にあります)

ここに画像の説明を入力

(4) プロジェクトをビルドします。(私はVS 2012を使用しました)

(5) WPF Image コントロールを追加し、「frameHolder」という名前を付けます。

だからあなたは次のようなものを持っています

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Image HorizontalAlignment="Stretch" Name="frameHolder"  VerticalAlignment="Stretch"  Stretch="Fill"/>
    </Grid>
</Window>

(6) C# コードを追加します。

using AForge.Video;
    using AForge.Video.DirectShow;
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;

/////

namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            VideoCaptureDevice LocalWebCam;
            public FilterInfoCollection LoaclWebCamsCollection; 

        void Cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            try
            {
                System.Drawing.Image img = (Bitmap)eventArgs.Frame.Clone();

                MemoryStream ms = new MemoryStream();
                img.Save(ms, ImageFormat.Bmp);
                ms.Seek(0, SeekOrigin.Begin);
                BitmapImage bi = new BitmapImage();
                bi.BeginInit();
                bi.StreamSource = ms;
                bi.EndInit();

                bi.Freeze();
                Dispatcher.BeginInvoke(new ThreadStart(delegate
                {
                    frameHolder.Source = bi;
                }));
            }
            catch (Exception ex)
            {
            }
        } 

        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            LoaclWebCamsCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            LocalWebCam = new VideoCaptureDevice(LoaclWebCamsCollection[0].MonikerString);
            LocalWebCam.NewFrame += new NewFrameEventHandler(Cam_NewFrame);

            LocalWebCam.Start();
        }
    }
}

(7) プロジェクトを再ビルドすると動作します!

注:デフォルトでは、最初に検出された WebCam が使用されます。WebCam ドライバーがインストールされていて、WebCam が一般的に機能していることを確認してください... :)

于 2013-02-08T18:39:57.333 に答える
2

私のWPF MediaKitには、Web カメラを WPF にレンダリングする VideoCaptureElement というコントロールがあります。新しい画像イベントにフックし、要素に EnableSampleGrabbing を設定することで、サンプルにアクセスすることもできます。

于 2010-01-05T16:40:03.190 に答える
-1

他のコンピューターの Web カメラが壊れているか、故障している可能性がありますか? または、AForge が構築されていると思われる DirectShow API をサポートしていない Web カメラの 1 つを持っています。

于 2010-01-09T18:29:27.747 に答える