//

Computer-Vision-Techniken in Kofax Transformation Modules (KTM/KTD)

11.4.2017 | 3 Minuten Lesezeit

„Computer Vision“ ist eines der wichtigsten, aktuellen Themen in der IT. Überall in modernen Systemen kommt diese Technologie zum Einsatz – sei es in den genialen Autos von Tesla („Object Detection“ für Hindernisse, andere Verkehrsteilnehmer, Straßenschilder, etc), Home Automation („Motion Detection“) oder  auch Überwachungs -und Fahndungssystemen („Face Detection“).

KTM bietet bereits eine Fülle von Möglichkeiten, um Informationen aus strukurierten oder unstrukturierten Dokumenten auszulesen. Doch was, wenn man auf einmal Objekte auf Fotos (z.B. Bilder von Häusern aus Ex­po­sés) oder sogar Gesichter erkennen muss?

Dieser Blogeintrag soll die Grundidee der Erweiterbarkeit von Kofax Transformation Modules anhand von Gesichtserkennung demonstrieren.

1. Das richtige Framework – eine wichtige Entscheidung

Eines der beliebtesten und auch leistungsstärksten Frameworks für Computer-Vision-Technologien ist OpenCV.  Dieses wurde in C/C++ implementiert und kann deshalb nicht direkt aus dem Kofax-Umfeld heraus aufgerufen werden. Da KTM immer noch auf die traditionelle Win-Basic-Sprache setzt (Schenkt uns endlich C#!!!!!), benötigen wir einen Wrapper.

Ich habe mich hier für Emgu CV entschieden: http://www.emgu.com/wiki/index.php/Main_Page

Die aktuellste Version des Wrappers findet ihr hier: https://sourceforge.net/projects/emgucv/files/latest/download?source=files

2. Das Coding

Auch wenn man auf dem Gebiet der Computer Vision noch nicht erfahren ist, kann man schon durch die Emgu-Sample-Projekte tolle Ergebnisse erzielen. Ein „Face Detection“-Beispiel findet ihr hier: https://github.com/emgucv/emgucv/tree/master/Emgu.CV.Example/FaceDetection

Wir setzen nun ein einfaches Visual-Studio-Projekt auf (Visual C#, Klassenbibliothek) und schreiben uns eine Methode, die wir wiederum direkt aus KTM heraus aufrufen können.

Die Parameter:

  • NET 3.5 (limitiert durch den Emgu Wrapper)
  • x86 (Kofax Transformation Modules ist noch keine reine 64-Bit-Anwendung)
  • Visual C# Klassenbibliothek
  • COM-Fähigkeit
  • Einzubindene Verweise: Emgu.CV.UI.dll, Emgu.CV.UI.GL.dll, Emgu.CV.World.dll und System.Drawing

1using Emgu.CV;
2using Emgu.CV.CvEnum;
3using Emgu.CV.Structure;
4using System;
5using System.Collections.Generic;
6using System.Drawing;
7using System.Runtime.InteropServices;
8 
9namespace FaceDetection
10{
11    [ComVisible(true)]
12    [Guid("7ac97316-8975-48fb-9af7-d137139c011e")]
13    [ProgId("FaceDetection.FDetect")]
14    [ClassInterface(ClassInterfaceType.None)]
15    public class FD : _FDetect
16    {
17        public FD()
18        {
19 
20        }
21 
22        public string recognizeFace(string refImage)
23        {
24            IImage image;
25 
26            image = new UMat(refImage, ImreadModes.Color);
27 
28            long detectionTime;
29            List faces = new List();
30            List eyes = new List();
31 
32            DetectFace.Detect(
33              image, "haarcascade_frontalface_default.xml", "haarcascade_eye.xml",
34              faces, eyes,
35              out detectionTime);
36 
37            foreach (Rectangle face in faces)
38                CvInvoke.Rectangle(image, face, new Bgr(Color.Red).MCvScalar, 2);
39            foreach (Rectangle eye in eyes)
40                CvInvoke.Rectangle(image, eye, new Bgr(Color.Blue).MCvScalar, 2);
41 
42            string path = System.IO.Path.GetTempFileName();
43            image.Save(path);
44            return path;
45        }
46    }
47 
48    public interface _FDetect
49    {
50        string recognizeFace(string refImage);
51    }
52}
53

Die Methode recognizeFace nimmt den Pfad zu dem ursprünglichen Bild entgegen, versucht Gesicht und Augen zu erkennen und markiert diese dann mit unterschiedlichen Rahmen. Anschließend wird das Bild temporär gespeichert und der Pfad auf das manipulierte Bild zurückgegeben.

3. Integration in KTM/KTD

Als nächstes setzen wir ein einfaches KTM-Projekt auf. Uns reichen eine einfache Dokumentklasse und ein Scriptlokator.

Der Lokator soll nun folgendes machen: Er ruft unsere Bilderkennung auf und tauscht danach das Bild im xDoc aus, so dass wir als Ergebnis das markierte Gesicht sehen:

1Private Sub SL_FaceDetection_LocateAlternatives(ByVal pXDoc As CASCADELib.CscXDocument, ByVal pLocator As CASCADELib.CscXDocField)
2   Dim FSO As Object
3   Dim sCurrentImage As String, oImage As CscImage
4   Dim lField As Long
5   Dim oFaceDetection As FaceDetection.FD
6   Dim image As String
7 
8   Set oFaceDetection = New FaceDetection.FD
9   Set FSO = CreateObject("Scripting.FileSystemObject")
10 
11   sCurrentImage = pXDoc.CDoc.Pages(0).GetImage.FileName
12   image = oFaceDetection.recognizeFace(sCurrentImage)
13   FSO.CopyFile image, sCurrentImage, True
14   Set oImage = New CscImage
15   oImage.Load sCurrentImage
16   pXDoc.CDoc.Pages(0).SetImage oImage
17End Sub
18

Das Ergebnis kann sich sehen lassen 🙂

Beitrag teilen

Gefällt mir

0

//

Weitere Artikel in diesem Themenbereich

Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.

//

Gemeinsam bessere Projekte umsetzen

Wir helfen Deinem Unternehmen

Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.

Hilf uns, noch besser zu werden.

Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.