Rysowanie po obiekcie typu Mat

Dzisiejszy post będzie powiązany z reorganizacją kodu, który powstał do tej pory. Podczas rozwijania projektu naszła mnie myśl, że wypadałoby rozdzielić logikę stojącą za przetwarzaniem zawartości obrazu (wykrywanie linii oraz znaków) od tej, która stoi za jego przekształceniami takimi jak binaryzacja lub zmiana palety kolorów na skalę szarości. Tak powstał interface ImageContentOperations i implementująca go klasa DefaultImageContentOperations. Metody wchodzące w ich skład operują na obrazie zapisanym w obiekcie typu org.opencv.core.Mat. Zmiana ta wymusiła zmianę sposobu rysowania histogramów.

Do tej pory histogram był rysowany na obiekcie typu BufferedImage przy pomocy obiektu Graphics2D i metody fillRect(int x, int y, int width, int height). Nie było to może najlepsze rozwiązanie, ponieważ dostępna jest też metoda drawLine(int x1, int y1, int x2, int y2). Łatwość użycia polegała na tym, że wystarczyło podać punkt początkowy i wysokość i szerokość rysowanej figury.

 

W wersji OpenCV dla Javy rysowanie po obiektach typu Mat odbywa się przy pomocy klasy ImgProc zawierającej metody statyczne. Do histogramu wykorzystałem metodę line(Mat img, Point pt1, Point pt2, Scalar color).

Przykładowe wywołanie:

Mat histogramImage = new Mat(100,100, CvType.CV_8S);
Scalar blackColor = new Scalar(0); // kolor czarny linii

histogramImage.setTo(new Scalar(1)); // białe tło

Point start = new Point(0,0);
Point end = new Point(50, 50);

Imgproc.line(histogramImage,start, end,blackColor);

Powyższy kod narysuje nam czarny odcinek o jednym końcu w punkcie (0, 0), a drugim w punkcie (50, 50).

Klasa ImgProc umożliwia także rysowanie innych kształtów, a także przetwarzanie obrazu przy pomocy m. in. filtru Sobela. O innych funkcjach wspomnę przy okazji dalszych prac nad projektem.

Na zakończenie tego krótkiego wpisu chciałbym tylko zachęcić do śledzenia bloga w nadchodzących tygodniach, ponieważ po wstępnym przetworzeniu obrazu planuję zająć się rozpoznawaniem znaków.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *