OCR mit Windows 10 und Webcam

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.

READIP

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

Kommentare sind geschlossen