none
Tasks widerholt aufrufen RRS feed

  • Frage

  • Hallo,

    ich versuche derzeitig mit der HoloLens\Laptop-Webcam widerholt Bilder zu erstellen. Ein einmaliger Aufruf ist kein Problem und ich erhalte ein Bild, lediglich der wiederholte Aufruf bereit mir Probleme.

    Mit Schleifen oder einem ThreadPoolTimer kam ich leider auch nicht weiter. Das einzige was funktioniert ist durch widerholtes drücken eins Knopfs aber leider brauche ich dafür eine automatische Lösung.

    Hat jemand schon ein ähnliches Problem gelöst?

    Dienstag, 3. September 2019 09:31

Antworten

  • Hallo,

    so sollte es gehen

    XAML in MainPage.xaml

    <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="40" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
    
            <StackPanel Orientation="Horizontal">
                <Button Content="Start" Click="BtnStart_Click" />
                <Button Content="Stop" Click="BtnStop_Click_1" />
            </StackPanel>
            
            <GridView ItemsSource="{x:Bind Images}" Grid.Row="1">
                <GridView.ItemTemplate>
                    <DataTemplate x:DataType="local:CaptureImages">
                        <Image Width="100" Source="{x:Bind Source}" />
                    </DataTemplate>
                </GridView.ItemTemplate>
            </GridView>
        </Grid>


    MainPage.xaml.cs

    public sealed partial class MainPage : Page
        {
            private MediaCapture MediaCapture;
            LowLagMediaRecording _mediaRecording;
            LowLagPhotoCapture _photoCapture = null;
            IRandomAccessStream _randomAccessStream;
            ObservableCollection<CaptureImages> Images = new ObservableCollection<CaptureImages>();
            bool isRunning = false;
    
            public MainPage()
            {
                this.InitializeComponent();
    
                Init();
            }
    
            async void Init()
            {
                var ava = (await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture)).ToList();
                if (ava.Count > 0)
                {
                    var c = ava[0];
                    MediaCapture = new MediaCapture();
                    MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings
                    {
                        VideoDeviceId = c.Id,
                        StreamingCaptureMode = StreamingCaptureMode.Video,
                        MediaCategory = MediaCategory.Media,
                    };
                    await MediaCapture.InitializeAsync(settings);
                }
            }
    
            public async Task StartRecordingAsync()
            {
                _randomAccessStream = new InMemoryRandomAccessStream();
                _mediaRecording = await MediaCapture.PrepareLowLagRecordToStreamAsync(MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p), _randomAccessStream);
                await _mediaRecording.StartAsync();
            }
    
            public async Task StopRecordingAsync()
            {
                await _mediaRecording.StopAsync();
                await _mediaRecording.FinishAsync();
                _randomAccessStream.Dispose();
            }
    
            public async Task<SoftwareBitmap> GetImageAsync()
            {
                if (_photoCapture == null)
                    _photoCapture = await MediaCapture.PrepareLowLagPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Bgra8));
    
                var cc = await _photoCapture.CaptureAsync();
                return cc.Frame.SoftwareBitmap;
            }
    
            private async void BtnStart_Click(object sender, RoutedEventArgs e)
            {
                isRunning = true;
                await StartRecordingAsync();
                Images.Clear();
    
                while (isRunning)
                {
                    var img = await GetImageAsync();
                    var sb = SoftwareBitmap.Convert(img, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
    
                    var s = new SoftwareBitmapSource();
                    await s.SetBitmapAsync(sb);
                    
                    Images.Add(new CaptureImages() { Source = s, Width = sb.PixelWidth });
                    await Task.Delay(500);
                }
    
                await StopRecordingAsync();
            }
    
            private void BtnStop_Click_1(object sender, RoutedEventArgs e)
            {
                isRunning = false;
            }
        }
    
        public class CaptureImages
        {
            public SoftwareBitmapSource Source { get; set; }
            public double Width { get; set; }
        }

    Ich habe das Projekt auch auf GitHub hochgeladen https://github.com/twytec/UwpCapureLoop/


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Dienstag, 3. September 2019 15:58
  • Du kannst unter C++/WinRT die selben Klassen nutzen. Mein C++ ist nicht gut genug um das umzuschreiben. Die verlinkte Doku sollte aber helfen 

    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Dienstag, 3. September 2019 19:45

Alle Antworten

  • Wie greifst du auf die Webcam zu? Ich habe mal testweise Emgu.CV via nuget eingebunden und folgenden Code erfolgreich getestet:

                var capture = new Emgu.CV.VideoCapture(0, Emgu.CV.VideoCapture.API.Any);
                for (var i = 0; i < 10; i++)
                {
                    var frame = capture.QueryFrame();
                    this.pictureBox1.Image = frame.Bitmap;
                    Thread.Sleep(1000);
                    Refresh();
                }
    

    pictureBox1 ist dabei eben ein PictureBox Control

    Dienstag, 3. September 2019 11:24
  • Hallo Christopher,

    der TE fragt im UWP Forum. In UWP lässt sich Emgu.CV nicht nutzen auch gibt es keine PictureBox


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Dienstag, 3. September 2019 15:13
  • Hallo,

    so sollte es gehen

    XAML in MainPage.xaml

    <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="40" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
    
            <StackPanel Orientation="Horizontal">
                <Button Content="Start" Click="BtnStart_Click" />
                <Button Content="Stop" Click="BtnStop_Click_1" />
            </StackPanel>
            
            <GridView ItemsSource="{x:Bind Images}" Grid.Row="1">
                <GridView.ItemTemplate>
                    <DataTemplate x:DataType="local:CaptureImages">
                        <Image Width="100" Source="{x:Bind Source}" />
                    </DataTemplate>
                </GridView.ItemTemplate>
            </GridView>
        </Grid>


    MainPage.xaml.cs

    public sealed partial class MainPage : Page
        {
            private MediaCapture MediaCapture;
            LowLagMediaRecording _mediaRecording;
            LowLagPhotoCapture _photoCapture = null;
            IRandomAccessStream _randomAccessStream;
            ObservableCollection<CaptureImages> Images = new ObservableCollection<CaptureImages>();
            bool isRunning = false;
    
            public MainPage()
            {
                this.InitializeComponent();
    
                Init();
            }
    
            async void Init()
            {
                var ava = (await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture)).ToList();
                if (ava.Count > 0)
                {
                    var c = ava[0];
                    MediaCapture = new MediaCapture();
                    MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings
                    {
                        VideoDeviceId = c.Id,
                        StreamingCaptureMode = StreamingCaptureMode.Video,
                        MediaCategory = MediaCategory.Media,
                    };
                    await MediaCapture.InitializeAsync(settings);
                }
            }
    
            public async Task StartRecordingAsync()
            {
                _randomAccessStream = new InMemoryRandomAccessStream();
                _mediaRecording = await MediaCapture.PrepareLowLagRecordToStreamAsync(MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p), _randomAccessStream);
                await _mediaRecording.StartAsync();
            }
    
            public async Task StopRecordingAsync()
            {
                await _mediaRecording.StopAsync();
                await _mediaRecording.FinishAsync();
                _randomAccessStream.Dispose();
            }
    
            public async Task<SoftwareBitmap> GetImageAsync()
            {
                if (_photoCapture == null)
                    _photoCapture = await MediaCapture.PrepareLowLagPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Bgra8));
    
                var cc = await _photoCapture.CaptureAsync();
                return cc.Frame.SoftwareBitmap;
            }
    
            private async void BtnStart_Click(object sender, RoutedEventArgs e)
            {
                isRunning = true;
                await StartRecordingAsync();
                Images.Clear();
    
                while (isRunning)
                {
                    var img = await GetImageAsync();
                    var sb = SoftwareBitmap.Convert(img, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
    
                    var s = new SoftwareBitmapSource();
                    await s.SetBitmapAsync(sb);
                    
                    Images.Add(new CaptureImages() { Source = s, Width = sb.PixelWidth });
                    await Task.Delay(500);
                }
    
                await StopRecordingAsync();
            }
    
            private void BtnStop_Click_1(object sender, RoutedEventArgs e)
            {
                isRunning = false;
            }
        }
    
        public class CaptureImages
        {
            public SoftwareBitmapSource Source { get; set; }
            public double Width { get; set; }
        }

    Ich habe das Projekt auch auf GitHub hochgeladen https://github.com/twytec/UwpCapureLoop/


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Dienstag, 3. September 2019 15:58
  • Gibt es dafür auch ein C++ Äquivalent?

    Habe ich bei meiner Frage vergessen zu erwähnen ...

     
    Dienstag, 3. September 2019 19:10
  • Du kannst unter C++/WinRT die selben Klassen nutzen. Mein C++ ist nicht gut genug um das umzuschreiben. Die verlinkte Doku sollte aber helfen 

    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Dienstag, 3. September 2019 19:45
  • Danke!!

    Werde mich mal daran versuchen.

    Mittwoch, 4. September 2019 06:51