„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 Exposé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}
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
Weitere Beiträge
von Niko Blättermann
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
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.
Blog-Autor*in
Niko Blättermann
Head of Observability
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.