Visual Inspection · C++ · OpenCV

Automatisierte Oberflächendefekterkennung mit C++17 und OpenCV — Edge Detection, Konturanalyse und morphologische Operationen auf dem MVTec AD Benchmark-Dataset.

Kontext & Motivation

In der industriellen Qualitätskontrolle müssen Bauteile mit hoher Geschwindigkeit und Präzision auf Oberflächenfehler geprüft werden — Kratzer, Dellen, Risse oder Materialfehler. Manuelle Sichtprüfung ist langsam, fehleranfällig und nicht skalierbar.

Ziel dieses Projekts war es, eine vollständige C++ Bildverarbeitungs-Pipeline zu implementieren, die Defekte auf Metalloberflächen automatisch erkennt, annotiert und einen Inspektionsbericht generiert — auf Basis des öffentlichen MVTec AD Benchmark-Datasets.

Domäne

Industrielle Bildverarbeitung, Qualitätskontrolle, Oberflächeninspektion

Performance

0.9ms pro Bild — geeignet für Echtzeit-Inspektion

Dataset

MVTec AD — industrieller Benchmark mit 5000+ Hochauflösungsbildern

Stack

C++17, OpenCV 4.12, CMake, vcpkg

1 — Verarbeitungs-Pipeline

Jedes Bild durchläuft eine mehrstufige Pipeline von der Rohdatei bis zum annotierten Ergebnis:

Visual Inspection C++ Pipeline 6-stage image processing pipeline: Load, Preprocessing, Edge Detection, Contour Analysis, Classification, Report Image load imread() Preprocessing Grayscale Gaussian blur Hist. equalization GaussianBlur() equalizeHist() Edge detection Canny(50, 150) Morphology MORPH_CLOSE Canny() morphologyEx() Contour analysis findContours() Area filter 100–50000 px² contourArea() boundingRect() Classification OK / DEFECT Confidence Bounding box putText() rectangle() Output OK (100%) Defects: 0 — green box DEFECT (60%) Defects: 2 — red box CSV report filename, label, time 115 images Metal Nut dataset 0.9 ms / image real-time capable 71.3% defect rate 82 / 115 detected 59.6% confidence avg. score C++ classes: ImagePreprocessor · DefectDetector · ReportGenerator Build: CMake + vcpkg · OpenCV 4.12 · C++17 · Visual Studio 2026

Preprocessing — ImagePreprocessor Klasse

// Grayscale + Gaussian Blur + Histogram Equalization + Normalization
cv::Mat ImagePreprocessor::process(const cv::Mat& input) const {
    cv::Mat result = resize(input);        // 256x256
    result = toGrayscale(result);          // BGR → Gray
    result = applyBlur(result);            // Gaussian kernel 5x5
    result = equalizeHist(result);         // Kontrastverstärkung
    result = normalize(result);            // 0-255 Normalisierung
    return result;
}

Defekterkennung — DefectDetector Klasse

// Canny Edge Detection + Morphologie + Konturfilterung
cv::Mat edges = applyEdgeDetection(preprocessed);  // Canny(50, 150)
cv::Mat morphed = applyMorphology(edges);           // MORPH_CLOSE
auto contours = findDefectContours(morphed);        // findContours()

// Konturfilterung nach Fläche
for (const auto& contour : contours) {
    double area = cv::contourArea(contour);
    if (area >= 100.0 && area <= 50000.0) {
        result.defect_count++;
        result.defect_bboxes.push_back(cv::boundingRect(contour));
    }
}

2 — Software-Architektur

Das Projekt folgt dem objektorientierten C++ Standard mit klarer Trennung von Verantwortlichkeiten:

KlasseDateiVerantwortlichkeit
ImagePreprocessorpreprocessor.hpp/cppBildvorverarbeitung — Blur, Histogram, Normalisierung
DefectDetectordefect_detector.hpp/cppDefekterkennung — Canny, Konturen, Bounding Boxes
ReportGeneratorreport_generator.hpp/cppCSV-Report, annotierte Bilder, Statistiken
mainmain.cppPipeline-Orchestrierung, Batch-Verarbeitung

Build System

# CMake + vcpkg — reproduzierbarer Build
cmake .. -G "NMake Makefiles" \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_TOOLCHAIN_FILE="C:/vcpkg/scripts/buildsystems/vcpkg.cmake"

cmake --build . --config Release
# → visual_inspection.exe
vcpkg wurde verwendet um OpenCV 4.12 kompatibel mit Visual Studio 2026 zu kompilieren — da die vorkompilierten Binaries nur bis VS 2022 unterstützt werden.

3 — Ergebnisse auf MVTec AD (Metal Nut)

Getestet auf der Metal Nut Kategorie des MVTec AD Datasets — 115 Bilder mit verschiedenen Defekttypen.

DEFECT (60%)

Defekt erkannt - Kratzer

2 Defekte erkannt — Kratzer auf Metalloberfläche

DEFECT (55%)

Defekt erkannt - Fleck

1 Defekt erkannt — Oberflächenfehler

Konsolen-Ausgabe

Visual Inspection Summary
115
Bilder verarbeitet
0.9ms
Durchschnitt pro Bild
71.3%
Defektrate erkannt
59.6%
Ø Konfidenz
✅ Pipeline verarbeitet 115 Bilder in ~100ms — geeignet für Echtzeit-Qualitätskontrolle.

4 — Automatischer CSV-Report

Nach der Verarbeitung wird automatisch ein strukturierter Report generiert:

filename,label,has_defect,defect_count,defect_area,defect_ratio,confidence,processing_time_ms,timestamp
000.png,DEFECT,1,2,1250.0000,0.0190,0.6000,1,2026-06-16 11:15:32
001.png,OK,0,0,0.0000,0.0000,1.0000,1,2026-06-16 11:15:32
002.png,DEFECT,1,1,890.0000,0.0135,0.5500,1,2026-06-16 11:15:32
Der Report enthält für jedes Bild: Label (OK/DEFECT), Anzahl Defekte, Defektfläche, Konfidenz, Verarbeitungszeit und Timestamp — vollständig auswertbar.

5 — Zusammenfassung

KomponenteTechnologieStatus
ProgrammierspracheC++17
BildverarbeitungOpenCV 4.12
Build SystemCMake + vcpkg
Edge DetectionCanny Algorithm
MorphologieMORPH_CLOSE
KonturanalysefindContours + Filterung
VisualisierungBounding Boxes + Labels
ReportingCSV + Statistiken
DatasetMVTec AD — Metal Nut
Performance0.9ms / Bild

Skills

C++17 OpenCV CMake Bildverarbeitung Edge Detection Konturanalyse Morphologische Operationen OOP C++ MVTec AD Dataset Echtzeit-Verarbeitung Qualitätskontrolle vcpkg

6 — Ausblick