Na tej stronie za pomocą krótkich fragmentów kodu prezentujemy możliwości oraz styl biblioteki Zebra Aurora™ Vision Library. Przykłady kompletnych inspekcji oraz całych aplikacji dostępne są wraz z instalatorem biblioteki.
Jednym z typowych narzędzi przetwarzania obrazów są filtry wygładzające. Poniżej prezentujemy usuwanie szumu metodą Gaussa oraz medianową. image1 jest obrazem wejściowym, a image2 obrazem wyjściowym.
SmoothImage_Gauss( image1, NIL, 2.0f, 2.0f, 2.5f, image2 ); SmoothImage_Median( image1, NIL, NIL, SmoothImageMedianKernel::Box, 3, NIL, image2 );
Obraz wejściowy:
Wynik (Gauss):
Wynik (Median):
Region to zbiór lokacji pikseli tudzież skompresowany obraz binarny. Poniższy kod demonstruje wydobycie regionu czerwonych pikseli oraz jego dalszą obróbkę.
Region region1, region2, region3, region4; ThresholdToRegion_HSx(image1, NIL, HSxColorModel::HSV, 0, 10, 190, 255, 65, 255, region1); CloseRegion(region1, KernelShape::Ellipse, 15, 15, region2); FillRegionHoles(region2, RegionConnectivity::EightDirections, NIL, 10000, region3); DrawRegion(image1, region3, NIL, Pixel(0, 255, 0), 1.0); OpenRegion(region3, KernelShape::Ellipse, 15, 15, region4); DrawRegion(image1, region4, NIL, Pixel(255, 0, 0), 1.0);
Dane wejściowe:
Dane wyjściowe:
Kody macierzowe (DataMatrix) odczytywane są w dwóch etapach: w pierwszym etapie wykrywani są kandydaci, po czym odczytywane są kody w odnalezionych lokacjach.
DataMatrixCodeParams codeParams; DataMatrixDetectionParams detectionParams; Conditional<DataCode> code; Array<Path> candidates; ReadSingleDataMatrixCode(image1, NIL, NIL, codeParams, detectionParams, code, candidates); if (code != NIL) { DrawingStyle style(DrawingMode::HighQuality, 1.0f, 3.0f, false, NIL, 2.0); DrawPath(image1, code.Get().Outline(), NIL, Pixel(255, 0, 0), style); DrawString(image1, code.Get().Text(), Location(10, 10), NIL, Anchor2D::TopLeft, Pixel(255, 0, 0), style, 18.0f, 0.0f, NIL); }
Dane wejściowe:
Dane wyjściowe:
Dopasowanie kształtów (Shape Fitting) pozwala na precyzyjne zlokalizowanie kształtów, których orientacyjne położenie zostało zdefiniowane wcześniej. W tym przykładzie pokazujemy dopasowanie odcinka w dwóch etapach: stworzenie mapy dopasowania oraz właściwe dopasowanie.
// Create shape fitting map SegmentFittingField field(Segment2D(40.0f, 30.0f, 40.0f, 130.0f), 30.0f); SegmentFittingMap map; ImageFormat imageFormat(image1.Width(), image1.Height(), PlainType::UInt8, 3); CreateSegmentFittingMap(imageFormat, field, NIL, 12, 5, InterpolationMethod::Bilinear, map); // Fit the shape EdgeScanParams params; params.minMagnitude = 10.0f; params.edgeTransition = EdgeTransition::BrightToDark; Conditional<Segment2D> segment; FitSegmentToEdges(image1, map, params, Selection::Best, NIL, 0.1f, NIL, segment); if (segment != NIL) { DrawingStyle style(DrawingMode::HighQuality, 1.0f, 2.0f, false, NIL, 0.0f); DrawSegment(image1, segment.Get(), NIL, Pixel(255, 0, 0), style, MarkerType::None, 0.0f); }
Dane wejściowe:
Dane wyjściowe:
Dane diagnostyczne:
Metody wyszukiwania wzorca (Template Matching) umożliwiają zlokalizowanie obiektów w dowolnym miejscu i rotacji. Przykładem typowej aplikacji jest detekcja markerów na układzie scalonym:
Image image1; LoadImage("fiducial_template.png", false, image1); Conditional<EdgeModel> model; CreateEdgeModel(image1, NIL, NIL, 0, NIL, 0.0f, 35.0f, 15.0f, -45.0f, +45.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, model); Image image2; LoadImage("fiducial_input.png", false, image2); Conditional<Object2D> object; if (model != NIL) { LocateSingleObject_Edges(image2, NIL, model.Get(), 1, 3, 10.0f, EdgePolarityMode::MatchStrictly, EdgeNoiseLevel::High, false, 0.7f, object); if (object != NIL) { DrawingStyle style(DrawingMode::HighQuality, 1.0f, 3.0f, false, NIL, 2.0); DrawRectangle(image2, object.Get().Match(), NIL, Pixel(255, 0, 0), style); } }
Wzorzec:
Dane wejściowe:
Dane wyjściowe:
Zebra Aurora™ Vision Library wspiera pobieranie obrazu między innymi z kamer i frame grabberów kompatybilnych z GigE Vision and GenICam. Ten przykład pokazuje schemat akwizycji obrazu z urządzenia GigE Vision:
// Initialize acquisition GigEHandle hDev = GigEVision_OpenDevice("169.254.1.81"); GigEVision_StartAcquisition(hDev, "Mono8"); Image image1; while (true) { // Grab image GigEVision_ReceiveImage(hDev, image1); // Process image ProcessImage(image1); } // Finalize acquisition avl::GigEVision_StopAcquisition(hDev); avl::GigEVision_CloseHandle(hDev);