Das typische Windows 10 Gerät besitzt eine Kamera. Mit ein wenig net Code wird so aus einem mobile phone oder Desktop PC ein Scanner. Das folgende VB.net Beispiel, dient zur Erkennung von IP Adresse. Der Benutzer hält einen Ausdruck vor die Kamera und die UWP App erkennt die gültige IP Adresse.
Dazu benötigen wir folgende Dinge: eine Windows 10 UWP Anwendung. Um den Zugriff auf Webcam zu erlauben muss, im Manifest des Visual Studio Projektes, Mikrofon und Webcam als Funktion aktiviert werden. Weiters benötigen wir eine XAML Page mit einem CaptureElement und einem Image Element. Mit einem DispatcherTimer lesen wir alle 100 Millisekunden das Bild von der Webcam aus. Der Einfachheit halber wird die erste Webcam verwendet, das als Device Information vom Typ Video Capture zurück geliefert wird. Das MediaCapture Objekt, liefert den Video Stream zur Webcam und wird dem Preview Control als Quelle zu gewesen.
1: Private MediaCapture1 As MediaCapture
2: Dim dp As New DispatcherTimer
3: Private Async Function MainPage_LoadedAsync(sender As Object,
e As RoutedEventArgs) As Task Handles Me.Loaded
4: dp.Interval = New TimeSpan(0, 0, 0, 0, 100)
5: AddHandler dp.Tick, AddressOf ScanIPAsync
6: dp.Start()
7:
8: If MediaCapture1 Is Nothing Then
9: Dim allVideoDevices = Await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture)
10:
11: Dim cameraDevice =
12: allVideoDevices.FirstOrDefault()
13: If cameraDevice Is Nothing Then Return
14:
15: MediaCapture1 = New MediaCapture()
16:
17: Dim settings = New MediaCaptureInitializationSettings With
18: {.VideoDeviceId = cameraDevice.Id}
19:
20: Try
21: Await MediaCapture1.InitializeAsync(settings)
22:
23: Catch ex As Exception
24: End Try
25: PreviewControl.Source = MediaCapture1
26: Await MediaCapture1.StartPreviewAsync()
27:
28:
29: End If
30: End Function
Das CaptureElement zeigt sozusagen das Kontrollbild live. Alle 100 Millisekunden wird die Methode ScanIPasync aufgerufen. Darin wird aus dem Video auf das aktuelle Bild zugegriffen und dem Image UI Element zugewiesen. Das ist dann das Standbild, der snapshot. Das so erzeugte bitmap wird der OCR Engine übergeben. Diese analysiert auf einen enthalten Text. Mit Hilfe der Funktion IPAdress.Parse wird der Text geprüft ob dieser eine gültige IP Adresse darstellt.
1: Private Async Function ScanIPAsync(sender As Object, e As Object) As Task
2: Dim pp As VideoEncodingProperties =
MediaCapture1.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview)
3:
4: Dim videoFrame = New VideoFrame(Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8,
5: pp.Width, pp.Height)
6:
7: Using currentFrame = Await MediaCapture1.GetPreviewFrameAsync(videoFrame)
8:
9: Dim ocrLanguage = New Language("en")
10: Dim oe As OcrEngine = OcrEngine.TryCreateFromLanguage(ocrLanguage)
11:
12: Dim bitmap = currentFrame.SoftwareBitmap
13: Dim imgSource = New WriteableBitmap(bitmap.PixelWidth, bitmap.PixelHeight)
14: bitmap.CopyToBuffer(imgSource.PixelBuffer)
15:
16: Dim ocrResult = Await oe.RecognizeAsync(bitmap)
17:
18: Dim ip = IPAddress.Parse(ocrResult.Text)
19: If ip IsNot Nothing Then
20: dp.Stop()
21: PreviewImage.Source = imgSource
22:
23: Dim msg = New MessageDialog("Hab Ip:" + ip.ToString)
24: msg.ShowAsync()
25: End If
26: End Using
Ich bin immer wieder begeistert, was in native Apps alles drin steckt. Die IP Adress Erkennung werde ich später für das Pairing von Devices nutzen.
https://github.com/hannespreishuber/readIp Source Code auf Github