OpenCV - Szybki przewodnik

OpenCV to wieloplatformowa biblioteka, za pomocą której możemy rozwijać się w czasie rzeczywistym computer vision applications. Skupia się głównie na przetwarzaniu obrazu, przechwytywaniu i analizie wideo, w tym na funkcjach takich jak wykrywanie twarzy i wykrywanie obiektów.

Zacznijmy ten rozdział od zdefiniowania terminu „Computer Vision”.

Wizja komputerowa

Komputerowe widzenie można zdefiniować jako dyscyplinę, która wyjaśnia, jak rekonstruować, przerywać i rozumieć scenę 3D na podstawie jej obrazów 2D, pod względem właściwości struktury obecnej na scenie. Zajmuje się modelowaniem i odtwarzaniem ludzkiego wzroku za pomocą oprogramowania i sprzętu komputerowego.

Wizja komputerowa w znacznym stopniu pokrywa się z następującymi polami -

  • Image Processing - Koncentruje się na manipulacji obrazem.

  • Pattern Recognition - Wyjaśnia różne techniki klasyfikacji wzorców.

  • Photogrammetry - Chodzi o uzyskanie dokładnych pomiarów z obrazów.

Przetwarzanie obrazu komputerowego a przetwarzanie obrazu

Image processingzajmuje się transformacją obrazu w obraz. Dane wejściowe i wyjściowe przetwarzania obrazu to obrazy.

Computer visionjest konstruowaniem wyraźnych, znaczących opisów obiektów fizycznych na podstawie ich obrazu. Wynikiem widzenia komputerowego jest opis lub interpretacja struktur w scenie 3D.

Zastosowania widzenia komputerowego

Tutaj wymieniliśmy niektóre z głównych domen, w których widzenie komputerowe jest intensywnie wykorzystywane.

Aplikacja robotyki

  • Lokalizacja - automatyczne określanie lokalizacji robota

  • Navigation

  • Unikanie przeszkód

  • Montaż (kołek w otworze, spawanie, malowanie)

  • Manipulacja (np. Manipulator robota PUMA)

  • Interakcja człowieka z robotem (HRI) - inteligentna robotyka do interakcji z ludźmi i służenia im

Zastosowanie leku

  • Klasyfikacja i wykrywanie (np. Klasyfikacja zmian lub komórek i wykrywanie guzów)
  • Segmentacja 2D / 3D
  • Rekonstrukcja 3D narządów ludzkich (MRI lub USG)
  • Chirurgia robotyczna sterowana wzrokiem

Aplikacja automatyki przemysłowej

  • Inspekcja przemysłowa (wykrywanie wad)
  • Assembly
  • Odczyt kodów kreskowych i etykiet opakowań
  • Sortowanie obiektów
  • Zrozumienie dokumentów (np. OCR)

Aplikacja bezpieczeństwa

  • Biometria (tęczówka, odcisk palca, rozpoznawanie twarzy)

  • Nadzór - Wykrywanie pewnych podejrzanych działań lub zachowań

Aplikacja transportowa

  • Autonomiczny pojazd
  • Bezpieczeństwo, np. Monitorowanie czujności kierowcy

Funkcje biblioteki OpenCV

Korzystając z biblioteki OpenCV, możesz -

  • Czytaj i pisz obrazy

  • Przechwytuj i zapisuj filmy

  • Przetwarzaj obrazy (filtr, transformacja)

  • Wykonaj wykrywanie funkcji

  • Wykryj określone obiekty, takie jak twarze, oczy, samochody, na filmach lub obrazach.

  • Przeanalizuj wideo, tj. Oszacuj ruch w nim, odejmij tło i śledź znajdujące się w nim obiekty.

OpenCV został pierwotnie opracowany w C ++. Oprócz tego zapewniono powiązania Python i Java. OpenCV działa na różnych systemach operacyjnych, takich jak Windows, Linux, OSx, FreeBSD, Net BSD, Open BSD itp.

Ten samouczek wyjaśnia koncepcje OpenCV z przykładami używającymi powiązań Java.

Moduły biblioteczne OpenCV

Poniżej znajdują się główne moduły biblioteczne biblioteki OpenCV.

Podstawowa funkcjonalność

Ten moduł obejmuje podstawowe struktury danych, takie jak Scalar, Point, Range, itp., Które są używane do tworzenia aplikacji OpenCV. Oprócz tego zawiera również tablicę wielowymiarowąMat, który służy do przechowywania obrazów. W bibliotece Java OpenCV ten moduł jest zawarty jako pakiet o nazwieorg.opencv.core.

Przetwarzanie obrazu

Ten moduł obejmuje różne operacje przetwarzania obrazu, takie jak filtrowanie obrazu, transformacje geometryczne obrazu, konwersja przestrzeni kolorów, histogramy itp. W bibliotece Java OpenCV moduł ten jest zawarty w pakiecie o nazwie org.opencv.imgproc.

Wideo

W tym module omówiono koncepcje analizy wideo, takie jak przewidywanie ruchu, odejmowanie tła i śledzenie obiektów. W bibliotece Java OpenCV ten moduł jest zawarty jako pakiet o nazwieorg.opencv.video.

We / wy wideo

W tym module opisano przechwytywanie wideo i kodeki wideo przy użyciu biblioteki OpenCV. W bibliotece Java OpenCV ten moduł jest zawarty jako pakiet o nazwieorg.opencv.videoio.

calib3d

Moduł ten zawiera algorytmy dotyczące podstawowych algorytmów geometrii wielu widoków, kalibracji kamery pojedynczej i stereoskopowej, estymacji pozycji obiektu, korespondencji stereo oraz elementów rekonstrukcji 3D. W bibliotece Java OpenCV ten moduł jest zawarty jako pakiet o nazwieorg.opencv.calib3d.

features2d

Ten moduł zawiera koncepcje wykrywania i opisu cech. W bibliotece Java OpenCV ten moduł jest zawarty jako pakiet o nazwieorg.opencv.features2d.

Objdetect

Ten moduł obejmuje wykrywanie obiektów i instancji predefiniowanych klas, takich jak twarze, oczy, kubki, ludzie, samochody itp. W bibliotece Java OpenCV moduł ten jest zawarty w pakiecie o nazwie org.opencv.objdetect.

Highgui

Jest to łatwy w użyciu interfejs z prostymi funkcjami interfejsu użytkownika. W bibliotece Java OpenCV funkcje tego modułu są zawarte w dwóch różnych pakietach, a mianowicie:org.opencv.imgcodecs i org.opencv.videoio.

Krótka historia OpenCV

OpenCV był początkowo inicjatywą badawczą firmy Intel mającą na celu doradzanie aplikacjom intensywnie wykorzystującym procesor. Został oficjalnie uruchomiony w 1999 roku.

  • W roku 2006 została wydana jego pierwsza główna wersja, OpenCV 1.0.
  • W październiku 2009 została wydana druga główna wersja, OpenCV 2.
  • W sierpniu 2012 r. OpenCV został przejęty przez organizację non-profit OpenCV.org.

W tym rozdziale dowiesz się, jak zainstalować OpenCV i skonfigurować jego środowisko w swoim systemie.

Instalowanie OpenCV

Przede wszystkim musisz pobrać OpenCV do swojego systemu. Wykonaj czynności podane poniżej.

Step 1 - Otwórz stronę główną OpenCV klikając poniższy link: http://opencv.org/ Po kliknięciu zobaczysz jego stronę główną, jak pokazano poniżej.

Step 2 - Teraz kliknij Downloadslink zaznaczony na powyższym zrzucie ekranu. Po kliknięciu zostaniesz przekierowany do strony pobierania OpenCV.

Step 3 - Po kliknięciu podświetlonego łącza na powyższym zrzucie ekranu, plik o nazwie opencv-3.1.0.exezostanie pobrany. Wyodrębnij ten plik, aby wygenerować folderopencv w systemie, jak pokazano na poniższym zrzucie ekranu.

Step 4 - Otwórz folder OpenCVbuildjava. Tutaj znajdziesz plik jar OpenCV o nazwieopencv-310.jar. Zapisz ten plik w oddzielnym folderze do dalszego użytku.

Instalacja Eclipse

Po pobraniu wymaganych plików JAR należy osadzić te pliki JAR w środowisku Eclipse. Możesz to zrobić, ustawiając ścieżkę kompilacji do tych plików JAR i używającpom.xml.

Ustawianie ścieżki budowania

Oto kroki, aby skonfigurować OpenCV w Eclipse -

Step 1- Upewnij się, że zainstalowałeś Eclipse w swoim systemie. Jeśli nie, pobierz i zainstaluj Eclipse w swoim systemie.

Step 2 - Otwórz Eclipse, kliknij Plik, Nowy i Otwórz nowy projekt, jak pokazano na poniższym zrzucie ekranu.

Step 3 - Po wybraniu projektu otrzymasz plik New Projectczarodziej. W tym kreatorze wybierz projekt Java i kontynuuj, klikającNext przycisk, jak pokazano na poniższym zrzucie ekranu.

Step 4 - Kontynuując, zostaniesz przekierowany do New Java Project wizard. Utwórz nowy projekt i kliknijNext, jak pokazano na poniższym zrzucie ekranu.

Step 5- Po utworzeniu nowego projektu kliknij go prawym przyciskiem myszy. WybierzBuild Path i kliknij Configure Build Path… jak pokazano na poniższym zrzucie ekranu.

Step 6 - Po kliknięciu Build Path zostaniesz przekierowany do Java Build Path wizard. KliknijAdd External JARs przycisk, jak pokazano na poniższym zrzucie ekranu.

Step 7 - Wybierz ścieżkę, w której zapisałeś plik opencv-310.jar.

Step 8 - Po kliknięciu Open na powyższym zrzucie ekranu pliki te zostaną dodane do Twojej biblioteki.

Step 9 - Po kliknięciu OK, pomyślnie dodasz wymagane pliki JAR do bieżącego projektu i możesz zweryfikować te dodane biblioteki, rozszerzając biblioteki, do których istnieją odniesienia.

Ustawianie ścieżki dla bibliotek natywnych

Oprócz plików JAR musisz ustawić ścieżkę do natywnych bibliotek (plików DLL) OpenCV.

Location of DLL files - Otwórz folder instalacyjny OpenCV i przejdź do podfolderu buildjava. Tutaj znajdziesz dwa folderyx64 (Wersja 64-bitowa) i x86 (32-bitowy), który zawiera rozszerzenie dll pliki OpenCV.

Otwórz odpowiedni folder odpowiedni dla twojego systemu operacyjnego, a następnie możesz zobaczyć dll plik, jak pokazano na poniższym zrzucie ekranu.

Teraz ustaw ścieżkę również dla tego pliku, wykonując kroki podane poniżej -

Step 1- Ponownie otwórz okno JavaBuildPath. Tutaj możesz obserwować dodany plik JAR i rozszerzenieJRE System Library.

Step 2 - Po rozszerzeniu otrzymasz biblioteki systemowe i Native library location, jak podkreślono na poniższym zrzucie ekranu.

Step 3 - Kliknij dwukrotnie plik Native library location. Tutaj możesz zobaczyćNative Library Folder Configuration window jak pokazano niżej.

Tutaj kliknij przycisk External Folder… i wybierz lokalizację dll plik w systemie.

Do przechwytywania obrazu używamy urządzeń takich jak aparaty i skanery. Urządzenia te rejestrują wartości liczbowe obrazu (np. Wartości pikseli). OpenCV to biblioteka przetwarzająca obrazy cyfrowe, dlatego musimy przechowywać te obrazy do przetwarzania.

Plik Matklasa biblioteki OpenCV służy do przechowywania wartości obrazu. Reprezentuje n-wymiarową tablicę i służy do przechowywania danych obrazu w skali szarości lub kolorowych obrazów, objętości wokseli, pól wektorowych, chmur punktów, tensorów, histogramów itp.

Ta klasa składa się z dwóch części danych: header i a pointer

  • Header - Zawiera informacje takie jak rozmiar, metoda użyta do przechowywania i adres macierzy (stały rozmiar).

  • Pointer - Przechowuje wartości pikseli obrazu (zmienia się).

Klasa mat

Biblioteka OpenCV Java udostępnia tę klasę o tej samej nazwie (Mat) w pakiecie org.opencv.core.

Konstruktorzy

Klasa Mat biblioteki OpenCV Java ma różne konstruktory, za pomocą których można skonstruować obiekt Mat.

S.Nr Konstruktorzy i opis
1

Mat()

W większości przypadków jest to domyślny konstruktor bez parametrów. Używamy tego do konstruktora, aby utworzyć pustą macierz i przekazać ją do innych metod OpenCV.

2

Mat(int rows, int cols, int type)

Ten konstruktor akceptuje trzy parametry typu całkowitego reprezentujące liczbę wierszy i kolumn w tablicy 2D oraz typ tablicy (która ma być używana do przechowywania danych).

3

Mat(int rows, int cols, int type, Scalar s)

Uwzględniając parametry poprzedniego, konstruktor ten dodatkowo przyjmuje jako parametr obiekt klasy Scalar.

4

Mat(Size size, int type)

Ten konstruktor przyjmuje dwa parametry, obiekt reprezentujący rozmiar macierzy i liczbę całkowitą reprezentującą typ tablicy używanej do przechowywania danych.

5

Mat(Size size, int type, Scalar s)

Uwzględniając parametry poprzedniego, konstruktor ten dodatkowo przyjmuje jako parametr obiekt klasy Scalar.

6

Mat(long addr)

7

Mat(Mat m, Range rowRange)

Ten konstruktor akceptuje obiekt innej macierzy i obiekt klasy Range reprezentujący zakres wierszy, które mają być użyte do utworzenia nowej macierzy.

8

Mat(Mat m, Range rowRange, Range colRange)

Uwzględniając parametry poprzedniego, konstruktor ten dodatkowo akceptuje obiekt klasy. Zakres reprezentujący zakres kolumn.

9

Mat(Mat m, Rect roi)

Ten konstruktor akceptuje dwa obiekty, jeden reprezentujący inną macierz, a drugi reprezentujący Region Ofa Interest.

Note -

  • Typ tablicy. Użyj CV_8UC1, ..., CV_64FC4 do tworzenia macierzy 1-4 kanałów lub CV_8UC (n), ..., CV_64FC (n) do tworzenia macierzy wielokanałowych (do kanałów CV_CN_MAX).

  • Typy macierzy były reprezentowane przez różne pola klasy CvType który należy do pakietu org.opencv.core.

Metody i opis

Poniżej przedstawiono niektóre metody dostarczane przez klasę Mat.

S.Nr Metody i opis
1

Mat col(int x)

Ta metoda akceptuje parametr będący liczbą całkowitą reprezentującą indeks kolumny oraz pobiera i zwraca tę kolumnę.

2

Mat row(int y)

Ta metoda akceptuje parametr będący liczbą całkowitą reprezentującą indeks wiersza oraz pobiera i zwraca ten wiersz.

3

int cols()

Ta metoda zwraca liczbę kolumn w macierzy.

4

int rows()

Ta metoda zwraca liczbę wierszy w macierzy.

5

Mat setTo(Mat value)

Ta metoda akceptuje obiekt klasy Mat type i ustawia elementy tablicy na określoną wartość.

6

Mat setTo(Scalar s)

Ta metoda akceptuje obiekt klasy Scalar type i ustawia elementy tablicy na określoną wartość.

Tworzenie i wyświetlanie macierzy

W tej sekcji omówimy nasz pierwszy przykład OpenCV. Zobaczymy, jak stworzyć i wyświetlić prostą macierz OpenCV.

Poniżej podano kroki, które należy wykonać, aby utworzyć i wyświetlić macierz w OpenCV.

Krok 1: Załaduj natywną bibliotekę OpenCV

Podczas pisania kodu Java za pomocą biblioteki OpenCV, pierwszym krokiem, jaki należy wykonać, jest załadowanie natywnej biblioteki OpenCV za pomocą loadLibrary(). Załaduj natywną bibliotekę OpenCV, jak pokazano poniżej.

//Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Krok 2: Utwórz instancję klasy Mat

Utwórz instancję klasy Mat, używając dowolnej funkcji wspomnianej wcześniej w tym rozdziale.

//Creating a matrix 
Mat matrix = new Mat(5, 5, CvType.CV_8UC1, new Scalar(0));

Krok 3: Wypełnij macierz za pomocą metod

Możesz pobrać określone wiersze / kolumny macierzy, przekazując wartości indeksu do metod row()/col().

I możesz ustawić wartości dla tych przy użyciu dowolnego z wariantów setTo() metody.

//Retrieving the row with index 0 
Mat row0 = matrix.row(0); 
     
//setting values of all elements in the row with index 0 
row0.setTo(new Scalar(1)); 
     
//Retrieving the row with index 3 
Mat col3 = matrix.col(3);  
     
//setting values of all elements in the row with index 3 
col3.setTo(new Scalar(3));

Example

Możesz użyć następującego kodu programu, aby utworzyć i wyświetlić prostą macierz w Javie przy użyciu biblioteki OpenCV.

import org.opencv.core.Core; 
import org.opencv.core.Mat;  
import org.opencv.core.CvType;  
import org.opencv.core.Scalar;   

class DisplayingMatrix { 
   public static void main(String[] args) {     
      //Loading the core library 
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);     

      //Creating a matrix 
      Mat matrix = new Mat(5, 5, CvType.CV_8UC1, new Scalar(0));  

      //Retrieving the row with index 0 
      Mat row0 = matrix.row(0);

      //setting values of all elements in the row with index 0 
      row0.setTo(new Scalar(1)); 

      //Retrieving the row with index 3 
      Mat col3 = matrix.col(3);  

      //setting values of all elements in the row with index 3 
      col3.setTo(new Scalar(3)); 

      //Printing the matrix 
      System.out.println("OpenCV Mat data:\n" + matrix.dump()); 
   } 
}

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

OpenCV Mat data: 
[  1,   1,   1,   3,   1; 
   0,   0,   0,   3,   0; 
   0,   0,   0,   3,   0; 
   0,   0,   0,   3,   0; 
   0,   0,   0,   3,   0]

Ładowanie obrazu za pomocą JavaSE API

Plik BufferedImage klasa java.awt.image.BufferedImage pakiet służy do przechowywania obrazu i pliku ImageIO klasa pakietu import javax.imageio zapewnia metody odczytu i zapisu Images.

Example

Możesz użyć następującego kodu programu do ładowania i zapisywania obrazów za pomocą biblioteki JavaSE.

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO;
  
public class LoadingImage_JSE_library {
   public static void main( String[] args ) throws IOException {
      //Input File 
      File input = new File("C:/EXAMPLES/OpenCV/sample.jpg");
          
      //Reading the image 
      BufferedImage image = ImageIO.read(input);
      
      //Saving the image with a different name
      File ouptut = new File("C:/OpenCV/sample.jpg");
      ImageIO.write(image, "jpg", ouptut);
         
      System.out.println("image Saved");
   } 
}

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

image Saved

Jeśli otworzysz określoną ścieżkę, możesz obserwować zapisany obraz w następujący sposób -

Plik Imgcodecs klasa pakietu org.opencv.imgcodecszapewnia metody odczytu i zapisu obrazów. Korzystając z OpenCV, możesz odczytać obraz i zapisać go w macierzy (w razie potrzeby wykonać transformacje na macierzy). Później możesz zapisać przetworzoną macierz do pliku.

Plik read() metoda Imgcodecsklasa służy do odczytywania obrazu za pomocą OpenCV. Poniżej znajduje się składnia tej metody.

imread(filename)

Przyjmuje argument (filename), zmienna typu String reprezentująca ścieżkę do pliku, który ma zostać odczytany.

Poniżej podano kroki, które należy wykonać, aby odczytać obrazy w Javie przy użyciu biblioteki OpenCV.

Krok 1: Załaduj natywną bibliotekę OpenCV

Załaduj natywną bibliotekę OpenCV przy użyciu load() metoda, jak pokazano poniżej.

//Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Krok 2: Utwórz wystąpienie klasy Imgcodecs

Utwórz wystąpienie Imgcodecs klasa.

//Instantiating the Imgcodecs class 
Imgcodecs imageCodecs = new Imgcodecs();

Krok 3: Czytanie obrazu

Przeczytaj obraz używając metody imread(). Ta metoda przyjmuje argument w postaci ciągu reprezentującego ścieżkę obrazu i zwraca obraz odczytany jakoMat obiekt.

//Reading the Image from the file  
Mat matrix = imageCodecs.imread(Path of the image);

Przykład

Poniższy kod programu pokazuje, jak możesz read an image przy użyciu biblioteki OpenCV.

import org.opencv.core.Core; 
import org.opencv.core.Mat;  
import org.opencv.imgcodecs.Imgcodecs;
 
public class ReadingImages {
   public static void main(String args[]) { 
      //Loading the OpenCV core library  
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); 
     
      //Instantiating the Imagecodecs class 
      Imgcodecs imageCodecs = new Imgcodecs(); 
     
      //Reading the Image from the file  
      String file ="C:/EXAMPLES/OpenCV/sample.jpg"; 
      Mat matrix = imageCodecs.imread(file); 
     
      System.out.println("Image Loaded");     
   } 
}

Podczas wykonywania powyższego programu OpenCV ładuje określony obraz i wyświetla następujące dane wyjściowe -

Image Loaded

Plik write() metoda Imgcodecsklasa służy do zapisywania obrazu przy użyciu OpenCV. Aby napisać obraz, powtórz pierwsze trzy kroki z poprzedniego przykładu.

Aby napisać obraz, musisz wywołać imwrite() metoda Imgcodecs klasa.

Poniżej znajduje się składnia tej metody.

imwrite(filename, mat)

Ta metoda akceptuje następujące parametry -

  • filename - A String zmienna reprezentująca ścieżkę do zapisania pliku.

  • mat - A Mat obiekt reprezentujący obraz, który ma zostać zapisany.

Przykład

Poniższy program jest przykładem do write an image za pomocą programu Java z wykorzystaniem biblioteki OpenCV.

import org.opencv.core.Core; 
import org.opencv.core.Mat; 
import org.opencv.imgcodecs.Imgcodecs;
 
public class WritingImages {  
   public static void main(String args[]) { 
      //Loading the OpenCV core library  
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
      
      //Instantiating the imagecodecs class 
      Imgcodecs imageCodecs = new Imgcodecs(); 

      //Reading the Image from the file and storing it in to a Matrix object 
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";   
      Mat matrix = imageCodecs.imread(file); 

      System.out.println("Image Loaded ..........");
      String file2 = "C:/EXAMPLES/OpenCV/sample_resaved.jpg"; 

      //Writing the image 
      imageCodecs.imwrite(file2, matrix); 
      System.out.println("Image Saved ............"); 
   } 
}

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

Image Loaded .......... 
Image Saved ...........

Jeśli otworzysz określoną ścieżkę, możesz obserwować zapisany obraz, jak pokazano poniżej -

We wcześniejszych rozdziałach omówiliśmy sposób odczytywania i zapisywania obrazu za pomocą biblioteki OpenCV Java. Oprócz tego możemy również wyświetlać załadowane obrazy w osobnym oknie za pomocą bibliotek GUI, takich jak AWT / Swings i JavaFX.

Konwersja maty na buforowany obraz

Do odczytania obrazu używamy metody imread(). Ta metoda zwraca obraz odczytany w postaciMatrix. Aby jednak używać tego obrazu z bibliotekami GUI (AWT / Swings i JavaFX), należy go przekonwertować jako obiekt klasyBufferedImage pakietu java.awt.image.BufferedImage.

Poniżej przedstawiono kroki, aby przekonwertować plik Mat obiekt OpenCV do BufferedImage obiekt.

Krok 1: zakoduj Mat do MatOfByte

Przede wszystkim musisz przekonwertować macierz na macierz bajtów. Możesz to zrobić za pomocą metodyimencode() klasy Imgcodecs. Poniżej znajduje się składnia tej metody.

imencode(ext, image, matOfByte);

Ta metoda akceptuje następujące parametry -

  • Ext - parametr typu String określający format obrazu (.jpg, .png itp.)

  • image - Obiekt Mat obrazu

  • matOfByte - Pusty obiekt klasy MatOfByte

Zakoduj obraz za pomocą tej metody, jak pokazano poniżej.

//Reading the image 
Mat image = Imgcodecs.imread(file);

//instantiating an empty MatOfByte class 
MatOfByte matOfByte = new MatOfByte();

//Converting the Mat object to MatOfByte 
Imgcodecs.imencode(".jpg", image, matOfByte);

Krok 2: Konwertuj obiekt MatOfByte na tablicę bajtów

Konwertuj MatOfByte obiekt do tablicy bajtów przy użyciu metody toArray().

byte[] byteArray = matOfByte.toArray();

Krok 3: Przygotowanie obiektu InputStream

Przygotuj obiekt InputStream, przekazując tablicę bajtów utworzoną w poprzednim kroku do konstruktora ByteArrayInputStream klasa.

//Preparing the InputStream object 
InputStream in = new ByteArrayInputStream(byteArray);

Krok 4: Przygotowanie obiektu InputStream

Przekaż obiekt strumienia wejściowego utworzony w poprzednim kroku do pliku read() metoda ImageIOklasa. To zwróci obiekt BufferedImage.

//Preparing the BufferedImage 
BufferedImage bufImage = ImageIO.read(in);

Wyświetlanie obrazu za pomocą AWT / Swings

Aby wyświetlić obraz za pomocą ramki AWT / Swings, najpierw przeczytaj obraz za pomocą imread() metoda i przekonwertuj ją na BufferedImage postępując zgodnie z wyżej wymienionymi krokami.

Następnie utwórz wystąpienie JFrame klasy i dodaj buforowany obraz utworzony do ContentPane elementu JFrame, jak pokazano poniżej -

//Instantiate JFrame 
JFrame frame = new JFrame();
 
//Set Content to the JFrame 
frame.getContentPane().add(new JLabel(new ImageIcon(bufImage))); 
frame.pack(); 
frame.setVisible(true);

Example

Poniższy kod programu pokazuje, jak możesz read obraz i display przez okno wahadłowe za pomocą biblioteki OpenCV.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;

public class DisplayingImagesUsingSwings {
   public static void main(String args[]) throws Exception { 
      //Loading the OpenCV core library  
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); 
    
      //Reading the Image from the file and storing it in to a Matrix object 
      String file = "C:/EXAMPLES/OpenCV/sample.jpg"; 
      Mat image = Imgcodecs.imread(file); 
    
      //Encoding the image 
      MatOfByte matOfByte = new MatOfByte();       
      Imgcodecs.imencode(".jpg", image, matOfByte); 

      //Storing the encoded Mat in a byte array 
      byte[] byteArray = matOfByte.toArray(); 

      //Preparing the Buffered Image 
      InputStream in = new ByteArrayInputStream(byteArray); 
      BufferedImage bufImage = ImageIO.read(in); 

      //Instantiate JFrame 
      JFrame frame = new JFrame(); 

      //Set Content to the JFrame 
      frame.getContentPane().add(new JLabel(new ImageIcon(bufImage))); 
      frame.pack(); 
      frame.setVisible(true);
      
      System.out.println("Image Loaded");     
   } 
}

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

Image Loaded

Oprócz tego możesz zobaczyć okno wyświetlające załadowany obraz, w następujący sposób -

Wyświetlanie obrazu za pomocą JavaFX

Aby wyświetlić obraz za pomocą JavaFX, najpierw przeczytaj obraz za pomocą imread() metoda i przekonwertuj ją na BufferedImage. Następnie przekonwertuj BufferedImage na WritableImage, jak pokazano poniżej.

WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

Podaj to WritableImage obiekt do konstruktora ImageView klasa.

ImageView imageView = new ImageView(writableImage);

Example

Poniższy kod programu pokazuje, jak to zrobić read obraz i display to przez okno JavaFX przy użyciu biblioteki OpenCV.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import javax.imageio.ImageIO;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;

public class DisplayingImagesJavaFX extends Application {
   @Override 
   public void start(Stage stage) throws IOException {   
      WritableImage writableImage = loadImage(); 
  
      //Setting the image view 
      ImageView imageView = new ImageView(writableImage); 
        
      //Setting the position of the image 
      imageView.setX(50); 
      imageView.setY(25); 
        
      //setting the fit height and width of the image view 
      imageView.setFitHeight(400); 
      imageView.setFitWidth(500);
      
      //Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);
      
      //Creating a Group object  
      Group root = new Group(imageView);
      
      //Creating a scene object
      Scene scene = new Scene(root, 600, 400);
      
      //Setting title to the Stage 
      stage.setTitle("Loading an image");
      
      //Adding scene to the stage
      stage.setScene(scene);

      //Displaying the contents of the stage
      stage.show();
   } 
   public WritableImage loadImage() throws IOException {
      //Loading the OpenCV core library  
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
      
      //Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat image = Imgcodecs.imread(file);
      
      //Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", image, matOfByte);

      //Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();
      
      //Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray); 
      BufferedImage bufImage = ImageIO.read(in);

      System.out.println("Image Loaded");
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage; 
   }
   public static void main(String args[]) {
      launch(args); 
   } 
}

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

Image Loaded

Oprócz tego możesz zobaczyć okno wyświetlające załadowany obraz, w następujący sposób -

OpenCV obsługuje różne typy obrazów, takie jak kolorowe, binarne, w skali szarości itp. Korzystanie z imread() metoda i predefiniowane pola Imgcodecs możesz odczytać dany obrazek jako inny typ.

Parametr flag metody imread () (IMREAD_XXX)

We wcześniejszych rozdziałach widzieliśmy składnię imread() metoda Imgcodecsklasa. Akceptuje argument w postaci ciągu znaków reprezentujący lokalizację obrazu, który ma zostać odczytany.

imread(filename)

Plik imread() metoda ma inną składnię.

imread(filename, int flags)

Ta składnia akceptuje dwa parametry -

  • filename - Przyjmuje argument (filename), zmienna typu String reprezentująca ścieżkę do pliku, który ma zostać odczytany.

  • flags- Wartość całkowita reprezentująca wstępnie zdefiniowaną wartość flagi. Dla każdej wartości odczytuje dany obraz jako określony typ (kolor w skali szarości itp.)

Poniżej znajduje się tabela zawierająca różne pola dostępne w Imgproc class jako wartości tego parametru.

S.Nr Pola i opis
1

IMREAD_COLOR

Jeśli flaga jest ustawiona na tę wartość, załadowany obraz zostanie przekonwertowany na 3-kanałowy kolorowy obraz BGR (Blue Green Red).

2

IMREAD_GRAYSCALE

Jeśli flaga jest ustawiona na tę wartość, załadowany obraz zostanie przekonwertowany na jednokanałowy obraz w skali szarości.

3

IMREAD_LOAD_GDAL

Jeśli flaga jest ustawiona na tę wartość, możesz załadować obraz przy użyciu pliku gdal kierowca.

4

IMREAD_ANYCOLOR

Jeśli flaga jest ustawiona na tę wartość, obraz jest czytany w dowolnym możliwym formacie kolorów.

5

IMREAD_REDUCED_COLOR_2

IMREAD_REDUCED_COLOR_4

IMREAD_REDUCED_COLOR_8

Jeśli flaga jest ustawiona na tę wartość, obraz jest odczytywany jako trzy-kanałowy BGR, a rozmiar obrazu jest zredukowana do ½, ¼ th lub ⅛ th oryginalnego rozmiaru obrazu w stosunku do pola używane.

6

IMREAD_REDUCED_GRAYSCALE_2

IMREAD_REDUCED_GRAYSCALE_4

IMREAD_REDUCED_GRAYSCALE_8

Jeśli flaga jest ustawiona na tę wartość, obraz jest odczytywany jako jednokanałowym skali szarości, a rozmiar obrazu jest zredukowana do ½, ¼ th lub ⅛ th oryginalnego rozmiaru obrazu w stosunku do pola wykorzystywane .

7

IMREAD_UNCHANGED

Jeśli flaga jest ustawiona na tę wartość, załadowany obraz jest zwracany bez zmian.

Poniższy program pokazuje, jak odczytać kolorowy obraz w skali szarości i wyświetlić go za pomocą okna JavaFX. Tutaj przeczytaliśmy obraz, przekazując flagęIMREAD_GRAYSCALE wraz ze Stringiem trzymającym ścieżkę kolorowego obrazu.

import java.awt.image.BufferedImage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

public class ReadingAsGrayscale extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);
      
      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);
      
      // Creating a Group object  
      Group root = new Group(imageView);
      
      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);
      
      // Setting title to the Stage
      stage.setTitle("Reading image as grayscale");
      
      // Adding scene to the stage
      stage.setScene(scene);
      
      // Displaying the contents of the stage
      stage.show();
   } 
   public WritableImage loadAndConvert() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the imagecodecs class
      Imgcodecs imageCodecs = new Imgcodecs();

      String input = "C:/EXAMPLES/OpenCV/sample.jpg";

      // Reading the image
      Mat src = imageCodecs.imread(input, Imgcodecs.IMREAD_GRAYSCALE);
       
      byte[] data1 = new byte[src.rows() * src.cols() * (int)(src.elemSize())];
      src.get(0, 0, data1);
      
      // Creating the buffered image
      BufferedImage bufImage = new BufferedImage(src.cols(),src.rows(), 
         BufferedImage.TYPE_BYTE_GRAY);
      
      // Setting the data elements to the image
      bufImage.getRaster().setDataElements(0, 0, src.cols(), src.rows(), data1);
              
      // Creating a WritableImage
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      System.out.println("Image Read");
      return writableImage;
   } 
   public static void main(String args[]) throws Exception { 
      launch(args); 
   } 
}

Obraz wejściowy

Załóżmy, że poniżej jest obraz wejściowy sample.jpg określone w powyższym programie.

Obraz wyjściowy

Podczas wykonywania programu otrzymasz następujące dane wyjściowe.

Poniższy program demonstruje, jak odczytać kolorowy obraz jako obraz typu BGR i wyświetlić go za pomocą okna JavaFX. Tutaj przeczytaliśmy obraz, przekazując flagęIMREAD_COLOR do metody imread() wraz ze Stringiem trzymającym ścieżkę kolorowego obrazu.

import java.awt.image.BufferedImage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

public class ReadingAsColored extends Application {
   @Override 
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();
       
      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);
      
      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);
      
      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);
     
      // Setting title to the Stage
      stage.setTitle("Reading as colored image");

      // Adding scene to the stage
      stage.setScene(scene);
      
      // Displaying the contents of the stage
      stage.show();
   } 
   public WritableImage loadAndConvert() throws Exception {     
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
       
      String input = "C:/EXAMPLES/OpenCV/sample.jpg";
       
      Mat dst = new Mat();

      // Reading the image
      Mat src = Imgcodecs.imread(input, Imgcodecs.IMREAD_COLOR);

      byte[] data1 = new byte[src.rows() * src.cols() * (int)(src.elemSize())]; 
      src.get(0, 0, data1);
      
      // Creating the buffered image
      BufferedImage bufImage = new BufferedImage(src.cols(),src.rows(), 
         BufferedImage.TYPE_3BYTE_BGR);

      // Setting the data elements to the image 
      bufImage.getRaster().setDataElements(0, 0, src.cols(), src.rows(), data1);

      // Creating a WritableImage
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      System.out.println("Image read");
      return writableImage;
   } 
   public static void main(String args[]) throws Exception {
      launch(args);
   } 
}

Obraz wejściowy

Załóżmy, że poniżej jest obraz wejściowy sample.jpg określone w powyższym programie.

Obraz wyjściowy

Podczas wykonywania programu otrzymasz następujące dane wyjściowe.

We wcześniejszych rozdziałach omawialiśmy, jak odczytywać obraz wejściowy jako różne typy (binarny, w skali szarości, BGR itp.). W tym rozdziale dowiemy się, jak konwertować jeden typ obrazu na inny.

Klasa o nazwie Imgproc pakietu org.opencv.imgproc zapewnia metody konwersji obrazu z jednego koloru na inny.

Konwersja kolorowych obrazów do skali szarości

Metoda o nazwie cvtColor()służy do konwersji kolorowych obrazów na skalę szarości. Poniżej znajduje się składnia tej metody.

cvtColor(Mat src, Mat dst, int code)

Ta metoda akceptuje następujące parametry -

  • src - macierz reprezentująca źródło.

  • dst - macierz reprezentująca miejsce docelowe.

  • code - Kod całkowity reprezentujący typ konwersji, na przykład RGB na Skala szarości.

Możesz przekonwertować kolorowe obrazy na skalę szarości, przekazując kod Imgproc.COLOR_RGB2GRAY wraz z macierzami źródłowymi i docelowymi jako parametrem pliku cvtColor() metoda.

Przykład

Poniższy program pokazuje, jak odczytać kolorowy obraz jako obraz w skali szarości i wyświetlić go za pomocą okna JavaFX.

import java.awt.image.BufferedImage;
  
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;

import javafx.stage.Stage;

public class ColorToGrayscale extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();
       
      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Colored to grayscale image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   } 
   public WritableImage loadAndConvert() throws Exception {
      //Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      String input = "C:/EXAMPLES/OpenCV/sample.jpg";

      //Reading the image
      Mat src = Imgcodecs.imread(input);

      //Creating the empty destination matrix
      Mat dst = new Mat();

      //Converting the image to gray sacle and saving it in the dst matrix
      Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2GRAY);
      
      //Extracting data from the transformed image (dst)
      byte[] data1 = new byte[dst.rows() * dst.cols() * (int)(dst.elemSize())];
      dst.get(0, 0, data1);

      //Creating Buffered image using the data
      BufferedImage bufImage = new BufferedImage(dst.cols(),dst.rows(), 
         BufferedImage.TYPE_BYTE_GRAY);

      //Setting the data elements to the image
      bufImage.getRaster().setDataElements(0, 0, dst.cols(), dst.rows(), data1);

      //Creating a WritableImage
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      System.out.println("Converted to Grayscale");
      return writableImage;
   }
   public static void main(String args[]) throws Exception {
      launch(args);
   }
}

Obraz wejściowy

Załóżmy, że poniżej jest obraz wejściowy sample.jpg określone w powyższym programie.

Obraz wyjściowy

Podczas wykonywania programu otrzymasz następujące dane wyjściowe.

Metoda o nazwie threshold()służy do konwersji obrazów w skali szarości na obraz binarny. Poniżej znajduje się składnia tej metody.

threshold(Mat src, Mat dst, double thresh, double maxval, int type)

Ta metoda akceptuje następujące parametry -

  • mat - A Mat obiekt reprezentujący obraz wejściowy.

  • dst - A Mat obiekt reprezentujący obraz wyjściowy.

  • thresh - liczba całkowita reprezentująca wartość progową.

  • maxval - Liczba całkowita reprezentująca maksymalną wartość do użycia z typami progów THRESH_BINARY i THRESH_BINARY_INV.

  • type - Kod całkowity reprezentujący typ konwersji, na przykład RGB na Skala szarości.

Możesz przekonwertować obraz w skali szarości na obraz binarny, przekazując kod Imgproc.THRESH_BINARY wraz z wartościami do pozostałych parametrów.

Przykład

Poniższy program pokazuje, jak odczytać kolorowy obraz jako obraz binarny i wyświetlić go za pomocą okna JavaFX.

import java.awt.image.BufferedImage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

public class ColorToBinary extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);
      
      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);
      
      // Setting title to the Stage
      stage.setTitle("Loading an image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage loadAndConvert() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the Imgcodecs class
      Imgcodecs imageCodecs = new Imgcodecs();
        
      // File input = new File("C:/EXAMPLES/OpenCV/sample.jpg");
      String input = "C:/EXAMPLES/OpenCV/sample.jpg";

      // Reading the image
      Mat src = imageCodecs.imread(input);

      // Creating the destination matrix
      Mat dst = new Mat();

      // Converting to binary image...
      Imgproc.threshold(src, dst, 200, 500, Imgproc.THRESH_BINARY);

      // Extracting data from the transformed image (dst)
      byte[] data1 = new byte[dst.rows() * dst.cols() * (int)(dst.elemSize())];
      dst.get(0, 0, data1);

      // Creating Buffered image using the data
      BufferedImage bufImage = new BufferedImage(dst.cols(),dst.rows(), 
         BufferedImage.TYPE_BYTE_GRAY);

      // Setting the data elements to the image
      bufImage.getRaster().setDataElements(0, 0, dst.cols(), dst.rows(), data1);

      // Creating a Writable image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      System.out.println("Converted to binary");
      return writableImage;
   }  
   public static void main(String args[]) throws Exception {
      launch(args);
   }
}

Obraz wejściowy

Załóżmy, że poniżej jest obraz wejściowy sample.jpg określone w powyższym programie.

Obraz wyjściowy

Podczas wykonywania programu otrzymasz następujące dane wyjściowe.

Możesz użyć tej samej metody, co w poprzednim rozdziale, aby przekonwertować obraz w skali szarości na obraz binarny. Po prostu podaj ścieżkę do obrazu w skali szarości jako dane wejściowe do tego programu.

Przykład

Poniższy program demonstruje, jak odczytać obraz w skali szarości jako obraz binarny i wyświetlić go za pomocą okna JavaFX.

import java.awt.image.BufferedImage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

public class GrayScaleToBinary extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();
       
      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);
      
      // Setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Grayscale to binary image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage loadAndConvert() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the imagecodecs class
      Imgcodecs imageCodecs = new Imgcodecs();

      String input = "E:/OpenCV/chap7/grayscale.jpg";

      // Reading the image
      Mat src = imageCodecs.imread(input);

      // Creating the destination matrix
      Mat dst = new Mat();

      // Converting to binary image...
      Imgproc.threshold(src, dst, 200, 500, Imgproc.THRESH_BINARY);

      // Extracting data from the transformed image (dst)
      byte[] data1 = new byte[dst.rows() * dst.cols() * (int)(dst.elemSize())];
      dst.get(0, 0, data1);

      // Creating Buffered image using the data
      BufferedImage bufImage = new BufferedImage(dst.cols(),dst.rows(), 
         BufferedImage.TYPE_BYTE_BINARY);

      // Setting the data elements to the image
      bufImage.getRaster().setDataElements(0, 0, dst.cols(), dst.rows(), data1);

      // Creating a Writable image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      System.out.println("Converted to binary");
      return writableImage;
   }
   public static void main(String args[]) throws Exception {
      launch(args);
   }
}

Obraz wejściowy

Załóżmy, że poniżej jest obraz wejściowy sample.jpg określone w powyższym programie.

Obraz wyjściowy

Podczas wykonywania programu otrzymasz następujące dane wyjściowe.

Możesz rysować różne kształty, takie jak Okrąg, Prostokąt, Linia, Elipsa, Polilinie, Wypukłe, Polilinie, Polilinie na obrazie przy użyciu odpowiednich metod org.opencv.imgproc pakiet.

Możesz narysować okrąg na obrazie za pomocą tej metody circle() z imgprocklasa. Poniżej znajduje się składnia tej metody -

circle(img, center, radius, color, thickness)

Ta metoda akceptuje następujące parametry -

  • mat - A Mat obiekt reprezentujący obraz, na którym ma zostać narysowany okrąg.

  • point - A Point obiekt reprezentujący środek koła.

  • radius - zmienna typu integer reprezentujący promień okręgu.

  • scalar - A Scalarobiekt reprezentujący kolor koła. (BGR)

  • thickness - An integerreprezentująca grubość koła; domyślnie wartość grubości wynosi 1.

Przykład

Poniższy program demonstruje, jak narysować okrąg na obrazie i wyświetlić go za pomocą okna JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingCircle extends Application {
   Mat matrix = null;
   
   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingCircle obj = new DrawingCircle();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing Circle on the image");
      
      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }      
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      //Drawing a Circle Imgproc.circle ( matrix, //Matrix obj of the image new Point(230, 160), //Center of the circle 100, //Radius new Scalar(0, 0, 255), //Scalar object for color 10 //Thickness of the circle );
      
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      this.matrix = matrix;
      
      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

Możesz narysować linię na obrazie za pomocą tej metody line() z imgprocklasa. Poniżej znajduje się składnia tej metody.

line(img, pt1, pt2, color, thickness)

Ta metoda akceptuje następujące parametry -

  • mat - A Mat obiekt reprezentujący obraz, na którym ma zostać narysowana linia.

  • pt1 and pt2 - Dwa Point obiekty reprezentujące punkty, pomiędzy którymi ma zostać narysowana linia.

  • scalar - A Scalarobiekt reprezentujący kolor koła. (BGR)

  • thickness- liczba całkowita reprezentująca grubość linii; domyślnie wartość grubości wynosi 1.

Przykład

Poniższy program demonstruje, jak narysować linię na obrazie i wyświetlić ją za pomocą okna JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingLine extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
   
      // Capturing the snapshot from the camera
      DrawingLine obj = new DrawingLine();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object  
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing a line on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      // Drawing a line Imgproc.line ( matrix, //Matrix obj of the image new Point(10, 200), //p1 new Point(300, 200), //p2 new Scalar(0, 0, 255), //Scalar object for color 5 //Thickness of the line );
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);

      this.matrix = matrix;

      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

Za pomocą tej metody można narysować prostokąt na obrazie rectangle() z imgprocklasa. Poniżej znajduje się składnia tej metody -

rectangle(img, pt1, pt2, color, thickness)

Ta metoda akceptuje następujące parametry -

  • mat - A Mat obiekt reprezentujący obraz, na którym ma zostać narysowany prostokąt.

  • pt1 and pt2 - Dwa Point obiekty reprezentujące wierzchołki prostokąta, który ma zostać narysowany.

  • scalar - A Scalarobiekt reprezentujący kolor prostokąta. (BGR)

  • thickness- liczba całkowita reprezentująca grubość prostokąta; domyślnie wartość grubości wynosi 1.

Przykład

Poniższy przykład ilustruje, jak narysować prostokąt na obrazie i wyświetlić go za pomocą okna JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingRectangle extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingRectangle obj = new DrawingRectangle();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing Rectangle on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      // Drawing a Rectangle Imgproc.rectangle ( matrix, //Matrix obj of the image new Point(130, 50), //p1 new Point(300, 280), //p2 new Scalar(0, 0, 255), //Scalar object for color 5 //Thickness of the line );
      
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);

      this.matrix = matrix;

      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

Za pomocą tej metody można narysować elipsę na obrazie rectangle() z imgprocklasa. Poniżej znajduje się składnia tej metody -

ellipse(img, box, color, thickness)

Ta metoda akceptuje następujące parametry -

  • mat - A Mat obiekt reprezentujący obraz, na którym ma zostać narysowany prostokąt.

  • box - Obiekt RotatedRect (elipsa jest rysowana i wpisana w ten prostokąt).

  • scalar - A Scalarobiekt reprezentujący kolor Rectangle. (BGR)

  • thickness- liczba całkowita reprezentująca grubość prostokąta; domyślnie wartość grubości wynosi 1.

Konstruktor RotatedRect class akceptuje obiekt klasy Point, obiekt klasy Size i zmienną typu double, jak pokazano poniżej.

RotatedRect(Point c, Size s, double a)

Przykład

Poniższy program demonstruje, jak narysować elipsę na obrazie i wyświetlić ją za pomocą okna JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.RotatedRect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingEllipse extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingEllipse obj = new DrawingEllipse();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing Ellipse on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      // Drawing an Ellipse Imgproc.ellipse ( matrix, //Matrix obj of the image new RotatedRect ( // RotatedRect(Point c, Size s, double a) new Point(200, 150), new Size(260, 180), 180 ), new Scalar(0, 0, 255), //Scalar object for color 10 //Thickness of the line );
      
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);

      this.matrix = matrix;
      
      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

Za pomocą tej metody można rysować polilinie na obrazie polylines() z imgprocklasa. Poniżej znajduje się składnia tej metody.

polylines(img, pts, isClosed, color, thickness)

Ta metoda akceptuje następujące parametry -

  • mat - A Mat obiekt reprezentujący obraz, na którym mają zostać narysowane polilinie.

  • pts - A List obiekt zawierający obiekty typu MatOfPoint.

  • isClosed - parametr typu boolean określający pogodę, w której polilinie są zamknięte.

  • scalar - A Scalarobiekt reprezentujący kolor polilinii. (BGR)

  • thickness- liczba całkowita reprezentująca grubość polilinii; domyślnie wartość grubości wynosi 1.

Konstruktor MatOfPoint klasa przyjmuje obiekty tej klasy Point.

MatOfPoint(Point... a)

Przykład

Poniższy program demonstruje, jak rysować polilinie na obrazie i wyświetlać je za pomocą okna JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingPolyLines extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingPolyLines obj = new DrawingPolyLines();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing Polylines on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }      
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      List<MatOfPoint> list = new ArrayList();
      list.add(
         new MatOfPoint (
            new Point(75, 100), new Point(350, 100),
            new Point(75, 150), new Point(350, 150),
            new Point(75, 200), new Point(350, 200),
            new Point(75, 250), new Point(350, 250)
         )
      );
      // Drawing polylines Imgproc.polylines ( matrix, // Matrix obj of the image list, // java.util.List<MatOfPoint> pts false, // isClosed new Scalar(0, 0, 255), // Scalar object for color 2 // Thickness of the line );
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);

      this.matrix = matrix;

      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

Za pomocą tej metody można rysować wypukłe polilinie na obrazie fillconvexPoly() z imgprocklasa. Poniżej znajduje się składnia tej metody.

fillConvexPoly(Mat img, MatOfPoint points, Scalar color)

Ta metoda akceptuje następujące parametry -

  • mat - A Mat obiekt reprezentujący obraz, na którym mają zostać narysowane wypukłe polilinie.

  • points - A MatOfPoint obiekt reprezentujący punkty, pomiędzy którymi mają być rysowane wypukłe polilinie.

  • scalar - A Scalarobiekt reprezentujący kolor wypukłych polilinii. (BGR)

Konstruktor MatOfPoint klasa przyjmuje obiekty tej klasy Point.

MatOfPoint(Point... a)

Przykład

Poniższy program demonstruje, jak rysować wypukłe polilinie na obrazie i wyświetlać je za pomocą okna JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class FillConvexPoly extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      FillConvexPoly obj = new FillConvexPoly();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      //Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing convex Polylines (fill) on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      MatOfPoint matOfPoint = new MatOfPoint (
         new Point(75, 100), new Point(350, 100),
         new Point(75, 150), new Point(350, 150),
         new Point(75, 200), new Point(350, 200),
         new Point(75, 250), new Point(350, 250)
      ); 
      // Drawing polylines Imgproc.fillConvexPoly ( matrix, // Matrix obj of the image matOfPoint, // java.util.List<MatOfPoint> pts new Scalar(0, 0, 255) // Scalar object for color );
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      this.matrix = matrix;
            
      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   } 
   public static void main(String args[]) {
      launch(args);
   }
}

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

Za pomocą tej metody można narysować na obrazie linię ze strzałką arrowedLine() z imgprocklasa. Poniżej znajduje się składnia tej metody -

arrowedLine(Mat img, Point pt1, Point pt2, Scalar color)

Ta metoda akceptuje następujące parametry -

  • mat - A Mat obiekt reprezentujący obraz, na którym ma zostać narysowana linia ze strzałką.

  • pt1 and pt2 - Dwa Point obiekty reprezentujące punkty, pomiędzy którymi ma zostać narysowana linia ze strzałką.

  • scalar - A Scalarobiekt reprezentujący kolor linii ze strzałką. (BGR)

Przykład

Poniższy program demonstruje, jak narysować linię ze strzałkami na obrazie i wyświetlić ją za pomocą okna JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingArrowedLine extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingArrowedLine obj = new DrawingArrowedLine();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing a line on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/Aish.jpg";
      Mat matrix = Imgcodecs.imread(file);

      //Drawing a line Imgproc.arrowedLine( matrix, // Matrix obj of the image new Point(10, 200), // p1 new Point(590, 200), // p2 new Scalar(0, 100, 255) // Scalar object for color );

      // arrowedLine(Mat img, Point pt1, Point pt2, Scalar color)
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      this.matrix = matrix;

      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

Możesz dodać tekst do obrazu za pomocą tej metody arrowedLine() z imgprocklasa. Poniżej znajduje się składnia tej metody.

putText(img, text, org, fontFace, fontScale, Scalar color, int thickness)

Ta metoda akceptuje następujące parametry -

  • mat - A Mat obiekt reprezentujący obrazek, do którego ma zostać dodany tekst.

  • text - A string zmienna reprezentująca tekst, który ma zostać dodany.

  • org - A Point obiekt reprezentujący ciąg tekstowy w lewym dolnym rogu obrazu.

  • fontFace - zmienna typu integer reprezentująca typ czcionki.

  • fontScale - Zmienna typu double reprezentująca współczynnik skali pomnożony przez rozmiar bazowy charakterystyczny dla czcionki.

  • scalar - A Scalarobiekt reprezentujący kolor tekstu, który ma zostać dodany. (BGR)

  • thickness - Liczba całkowita reprezentująca grubość linii, domyślnie wartość grubości wynosi 1.

Przykład

Poniższy program demonstruje, jak dodać tekst do obrazu i wyświetlić go za pomocą okna JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class AddingTextToImage extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      AddingTextToImage obj = new AddingTextToImage();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Adding text to an image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      // Adding Text Imgproc.putText ( matrix, // Matrix obj of the image "Ravivarma's Painting", // Text to be added new Point(10, 50), // point Core.FONT_HERSHEY_SIMPLEX , // front face 1, // front scale new Scalar(0, 0, 0), // Scalar object for color 4 // Thickness );
      
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      this.matrix = matrix;

      //Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

Rozmycie (wygładzanie) to powszechnie stosowana operacja przetwarzania obrazu w celu zmniejszenia szumów obrazu. Proces usuwa z obrazu treści o wysokiej częstotliwości, takie jak krawędzie, i sprawia, że ​​jest on gładki.

Ogólnie rozmycie uzyskuje się poprzez splot (każdy element obrazu jest dodawany do swoich lokalnych sąsiadów, ważony przez jądro) obrazu przez jądro filtru dolnoprzepustowego.

Rozmycie (uśrednianie)

Podczas tej operacji obraz jest splatany z filtrem pudełkowym (znormalizowany). W tym procesie centralny element obrazu jest zastępowany przez średnią wszystkich pikseli w obszarze jądra.

Możesz wykonać tę operację na obrazie za pomocą tej metody blur() z imgprocklasa. Poniżej znajduje się składnia tej metody -

blur(src, dst, ksize, anchor, borderType)

Ta metoda akceptuje następujące parametry -

  • src - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

  • dst - A Mat obiekt reprezentujący miejsce docelowe (obraz wyjściowy) dla tej operacji.

  • ksize - A Size obiekt reprezentujący rozmiar jądra.

  • anchor - zmienna typu integer reprezentująca punkt zakotwiczenia.

  • borderType - zmienna typu integer reprezentująca typ obramowania, który ma być użyty do wyjścia.

Przykład

Poniższy program przedstawia sposób wykonywania operacji uśredniania (rozmycia) na obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class BlurTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating the Size and Point objects
      Size size = new Size(45, 45);
      Point point = new Point(20, 30);

      // Applying Blur effect on the Image
      Imgproc.blur(src, dst, size, point, Core.BORDER_DEFAULT);

      // blur(Mat src, Mat dst, Size ksize, Point anchor, int borderType)
      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap9/blur.jpg", dst);
      System.out.println("Image processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy sample.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

W operacji Rozmycie gaussowskie obraz jest spleciony z filtrem Gaussa zamiast filtru pudełkowego. Filtr Gaussa jest filtrem dolnoprzepustowym, który usuwa składowe o wysokiej częstotliwości i jest redukowany.

Możesz wykonać tę operację na obrazie za pomocą Gaussianblur() metoda imgprocklasa. Poniżej znajduje się składnia tej metody -

GaussianBlur(src, dst, ksize, sigmaX)

Ta metoda akceptuje następujące parametry -

  • src - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

  • dst - A Mat obiekt reprezentujący miejsce docelowe (obraz wyjściowy) dla tej operacji.

  • ksize - A Size obiekt reprezentujący rozmiar jądra.

  • sigmaX - Zmienna typu double reprezentująca odchylenie standardowe jądra Gaussa w kierunku X.

Przykład

Poniższy program przedstawia sposób wykonywania operacji rozmycia gaussowskiego na obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class GaussianTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();
    
      // Applying GaussianBlur on the Image
      Imgproc.GaussianBlur(src, dst, new Size(45, 45), 0);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap9/Gaussian.jpg", dst);
      System.out.println("Image Processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy sample.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Operacja rozmycia mediany jest podobna do innych metod uśredniania. Tutaj centralny element obrazu jest zastępowany przez medianę wszystkich pikseli w obszarze jądra. Ta operacja przetwarza krawędzie, jednocześnie usuwając szum.

Możesz wykonać tę operację na obrazie za pomocą medianBlur() metoda imgprocklasa. Poniżej znajduje się składnia tej metody -

medianBlur(src, dst, ksize)

Ta metoda akceptuje następujące parametry -

  • src - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

  • dst - A Mat obiekt reprezentujący miejsce docelowe (obraz wyjściowy) dla tej operacji.

  • ksize - A Size obiekt reprezentujący rozmiar jądra.

Przykład

Poniższy program przedstawia sposób wykonywania operacji mediany rozmycia na obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class MedianBlurTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying MedianBlur on the Image
      Imgproc.medianBlur(src, dst, 15);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap9/median.jpg", dst);

      System.out.println("Image Processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy sample.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Filtrowanie obrazu umożliwia zastosowanie różnych efektów do obrazu. W tym rozdziale i w kolejnych trzech rozdziałach omówimy różne operacje filtrowania, takie jak filtr dwustronny, filtr pudełkowy, filtr pudełkowy SQR i filtrowanie 2D.

Filtr dwustronny

Operacja filtra dwustronnego powoduje zastosowanie dwustronnego obrazu do filtra. Możesz wykonać tę operację na obrazie za pomocąmedianBlur() metoda imgprocklasa. Poniżej znajduje się składnia tej metody.

bilateralFilter(src, dst, d, sigmaColor, sigmaSpace, borderType)

Ta metoda akceptuje następujące parametry -

  • src - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

  • dst - A Mat obiekt reprezentujący miejsce docelowe (obraz wyjściowy) dla tej operacji.

  • d - zmienna typu integer reprezentująca średnicę sąsiedztwa piksela.

  • sigmaColor - zmienna typu integer reprezentująca sigma filtru w przestrzeni kolorów.

  • sigmaSpace - zmienna typu integer reprezentująca sigma filtru w przestrzeni współrzędnych.

  • borderType - Obiekt będący liczbą całkowitą reprezentujący typ używanego obramowania.

Przykład

Poniższy program demonstruje, jak wykonać operację filtra dwustronnego na obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class BilateralFilter {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap11/filter_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying Bilateral filter on the Image
      Imgproc.bilateralFilter(src, dst, 15, 80, 80, Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap11/bilateralfilter.jpg", dst);

      System.out.println("Image Processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy filter_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Operacja filtra pudełkowego jest podobna do operacji uśredniania rozmycia; nakłada dwustronny obraz na filtr. Tutaj możesz wybrać, czy pudełko ma być znormalizowane, czy nie.

Możesz wykonać tę operację na obrazie za pomocą boxFilter() metoda imgprocklasa. Poniżej znajduje się składnia tej metody -

boxFilter(src, dst, ddepth, ksize, anchor, normalize, borderType)

Ta metoda akceptuje następujące parametry -

  • src - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

  • dst - A Mat obiekt reprezentujący miejsce docelowe (obraz wyjściowy) dla tej operacji.

  • ddepth - Zmienna typu integer reprezentująca głębokość obrazu wyjściowego.

  • ksize - A Size obiekt reprezentujący rozmiar rozmazanego jądra.

  • anchor - zmienna typu integer reprezentująca punkt zakotwiczenia.

  • Normalize - Zmienna typu boolean określająca pogodę jądra powinna zostać znormalizowana.

  • borderType - Obiekt będący liczbą całkowitą reprezentujący typ używanego obramowania.

Przykład

Poniższy program demonstruje, jak wykonać operację Box Filter na obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class BoxFilterTest {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file = "E:/OpenCV/chap11/filter_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating the objects for Size and Point
      Size size = new Size(45, 45);
      Point point = Point(-1, -1);

      // Applying Box Filter effect on the Image
      Imgproc.boxFilter(src, dst, 50, size, point, true, Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap11/boxfilterjpg", dst);

      System.out.println("Image Processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy filter_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Możesz wykonać operację filtra SQRBox na obrazie przy użyciu rozszerzenia boxFilter() metoda imgprocklasa. Poniżej znajduje się składnia tej metody -

sqrBoxFilter(src, dst, ddepth, ksize)

Ta metoda akceptuje następujące parametry -

  • src - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

  • dst - A Mat obiekt reprezentujący miejsce docelowe (obraz wyjściowy) dla tej operacji.

  • ddepth - Zmienna typu integer reprezentująca głębokość obrazu wyjściowego.

  • ksize - A Size obiekt reprezentujący rozmiar rozmazanego jądra.

Przykład

Poniższy program demonstruje, jak wykonać operację filtru Sqrbox na danym obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class SqrBoxFilterTest {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap11/filter_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying Box Filter effect on the Image
      Imgproc.sqrBoxFilter(src, dst, -1, new Size(1, 1));
     
      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap11/sqrboxfilter.jpg", dst);

      System.out.println("Image Processed");
   } 
}

Załóżmy, że poniżej jest obraz wejściowy filter_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Operacja Filter2D polega na splątaniu obrazu z jądrem. Możesz wykonać tę operację na obrazie za pomocąFilter2D() metoda imgprocklasa. Poniżej znajduje się składnia tej metody -

filter2D(src, dst, ddepth, kernel)

Ta metoda akceptuje następujące parametry -

  • src - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

  • dst - A Mat obiekt reprezentujący miejsce docelowe (obraz wyjściowy) dla tej operacji.

  • ddepth - Zmienna typu integer reprezentująca głębokość obrazu wyjściowego.

  • kernel - A Mat obiekt reprezentujący jądro splotu.

Przykład

Poniższy program demonstruje, jak wykonać operację Filter2D na obrazie.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Filter2D {
   public static void main( String[] args ) {
      //Loading the OpenCV core library  
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      //Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap11/filter_input.jpg";
      Mat src = Imgcodecs.imread(file);

      //Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating kernel matrix
      Mat kernel = Mat.ones(2,2, CvType.CV_32F);
      
      for(int i = 0; i<kernel.rows(); i++) {
         for(int j = 0; j<kernel.cols(); j++) {
            double[] m = kernel.get(i, j);

            for(int k = 1; k<m.length; k++) {
               m[k] = m[k]/(2 * 2);
            }
            kernel.put(i,j, m);
         }
      }
      Imgproc.filter2D(src, dst, -1, kernel);
      Imgcodecs.imwrite("E:/OpenCV/chap11/filter2d.jpg", dst);
      System.out.println("Image Processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy filter_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Erozja i dylatacja to dwa rodzaje operacji morfologicznych. Jak sama nazwa wskazuje, operacje morfologiczne to zbiór operacji przetwarzających obrazy zgodnie z ich kształtami.

Na podstawie podanego obrazu wejściowego opracowywany jest „element strukturalny”. Można to zrobić w dowolnej z dwóch procedur. Mają one na celu usunięcie szumu i wyrównanie niedoskonałości, aby obraz był wyraźny.

Rozszerzanie się

Ta procedura następuje po splocie z pewnym jądrem o określonym kształcie, takim jak kwadrat lub okrąg. To jądro ma punkt zakotwiczenia, który oznacza jego środek.

To jądro jest nakładane na obraz, aby obliczyć maksymalną wartość piksela. Po obliczeniu obraz zostaje zastąpiony kotwicą pośrodku. Dzięki tej procedurze obszary jasnych obszarów zwiększają się, a tym samym rozmiar obrazu.

Na przykład rozmiar obiektu w odcieniu białym lub jasnym wzrasta, podczas gdy rozmiar obiektu w odcieniu czarnym lub ciemnym maleje.

Możesz wykonać operację dylatacji na obrazie za pomocą dilate() metoda imgprocklasa. Poniżej znajduje się składnia tej metody.

dilate(src, dst, kernel)

Ta metoda akceptuje następujące parametry -

  • src - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

  • dst - A Mat obiekt reprezentujący miejsce docelowe (obraz wyjściowy) dla tej operacji.

  • kernel - A Mat obiekt reprezentujący jądro.

Przykład

Możesz przygotować macierz jądra za pomocą getStructuringElement()metoda. Ta metoda akceptuje liczbę całkowitą reprezentującąmorph_rect typ i obiekt typu Size.

Imgproc.getStructuringElement(int shape, Size ksize);

Poniższy program demonstruje, jak wykonać operację dylatacji na danym obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DilateTest {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Preparing the kernel matrix object 
      Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, 
         new  Size((2*2) + 1, (2*2)+1));

      // Applying dilate on the Image
      Imgproc.dilate(src, dst, kernel);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap10/Dilation.jpg", dst);

      System.out.println("Image Processed");
   } 
}

Wejście

Załóżmy, że poniżej jest obraz wejściowy sample.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Erozja jest procesem podobnym do dylatacji. Ale obliczona tutaj wartość piksela jest rozszerzeniem minimalnym, a nie maksymalnym. Obraz jest zastępowany pod punktem kontrolnym z tą minimalną wartością piksela.

Dzięki tej procedurze obszary ciemnych regionów powiększają się, a jasne obszary zmniejszają się. Na przykład rozmiar obiektu w ciemnym lub czarnym odcieniu zwiększa się, podczas gdy zmniejsza się w białym lub jasnym odcieniu.

Przykład

Możesz wykonać tę operację na obrazie za pomocą erode() metoda imgprocklasa. Poniżej znajduje się składnia tej metody -

erode(src, dst, kernel)

Ta metoda akceptuje następujące parametry -

  • src - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

  • dst - A Mat obiekt reprezentujący miejsce docelowe (obraz wyjściowy) dla tej operacji.

  • kernel - A Mat obiekt reprezentujący jądro.

Możesz przygotować macierz jądra za pomocą getStructuringElement()metoda. Ta metoda akceptuje liczbę całkowitą reprezentującąmorph_rect typ i obiekt typu Size.

Imgproc.getStructuringElement(int shape, Size ksize);

Poniższy program demonstruje jak wykonać operację erozji na zadanym obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class ErodeTest {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Preparing the kernel matrix object
      Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, 
         new  Size((2*2) + 1, (2*2)+1));

      // Applying erode on the Image
      Imgproc.erode(src, dst, kernel);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap10/Erosion.jpg", dst);

      System.out.println("Image processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy sample.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Loaded

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

We wcześniejszych rozdziałach omówiliśmy proces erosion i dilation. Oprócz tych dwóch, OpenCV ma więcej przekształceń morfologicznych. PlikmorphologyEx() metody klasy Imgproc służy do wykonywania tych operacji na danym obrazie.

Poniżej znajduje się składnia tej metody -

morphologyEx(src, dst, op, kernel)

Ta metoda akceptuje następujące parametry -

  • src - Przedmiot z klasy Mat reprezentujący obraz źródłowy (wejściowy).

  • dst - przedmiot zajęć Mat reprezentujący obraz docelowy (wyjściowy).

  • op - liczba całkowita reprezentująca typ operacji morfologicznej.

  • kernel - macierz jądra.

Przykład

Poniższy program pokazuje, jak zastosować operację morfologiczną "top-hat" na obrazie przy użyciu biblioteki OpenCV.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class MorphologyExTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap12/morph_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating kernel matrix
      Mat kernel = Mat.ones(5,5, CvType.CV_32F);

      // Applying Blur effect on the Image 
      Imgproc.morphologyEx(src, dst, Imgproc.MORPH_TOPHAT, kernel);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap12/morph_tophat.jpg", dst);

      System.out.println("Image Processed");
   } 
}

Załóżmy, że poniżej jest obraz wejściowy morph_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Więcej operacji

Oprócz operacji morfologicznej TOPHAT, pokazane w poprzednim example, OpenCV obsługuje różne inne typy morfologii. Wszystkie te typy są reprezentowane przez wstępnie zdefiniowane pola statyczne (wartości stałe)Imgproc klasa.

Możesz wybrać typ potrzebnej morfologii, przekazując odpowiednią wstępnie zdefiniowaną wartość do parametru op z morphologyEx() metoda.

// Applying Blur effect on the Image
Imgproc.morphologyEx(src, dst, Imgproc.MORPH_TOPHAT, kernel);

Poniżej przedstawiono wartości reprezentujące typ operacji morfologicznych i ich odpowiednie wyniki.

Działanie i opis Wynik
MORPH_BLACKHAT
MORPH_CLOSE
MORPH_CROSS
MORPH_DILATE
MORPH_ELLIPSE
MORPH_ERODE
MORPH_GRADIENT
MORPH_OPEN
MORPH_RECT
MORPH_TOPHAT

Piramida to operacja na obrazie, w której

  • Obraz wejściowy jest początkowo wygładzany przy użyciu określonego filtra wygładzającego (np. Gaussa, Laplaca), a następnie wygładzany obraz jest poddawany próbkowaniu.

  • Ten proces powtarza się wielokrotnie.

Podczas operacji piramidy zwiększa się płynność obrazu i zmniejsza rozdzielczość (rozmiar).

Pyramid Up

W Pyramid Up obraz jest wstępnie próbkowany, a następnie rozmyty. Możesz wykonać operację Pyramid Up na obrazie za pomocąpyrUP() metoda imgprocklasa. Poniżej znajduje się składnia tej metody -

pyrUp(src, dst, dstsize, borderType)

Ta metoda akceptuje następujące parametry -

  • src - Przedmiot z klasy Mat reprezentujący obraz źródłowy (wejściowy).

  • mat - Przedmiot z klasy Mat reprezentujący obraz docelowy (wyjściowy).

  • size - Przedmiot z klasy Size reprezentujący rozmiar, do którego obraz ma zostać powiększony lub zmniejszony.

  • borderType - zmienna typu całkowitego reprezentująca typ obramowania, który ma być użyty.

Przykład

Poniższy program demonstruje, jak wykonać operację Pyramid Up na obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class PyramidUp {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap13/pyramid_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying pyrUp on the Image
      Imgproc.pyrUp(src, dst, new Size(src.cols()*2,  src.rows()*2), Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap13/pyrUp_output.jpg", dst);

      System.out.println("Image Processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy pyramid_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Piramida w dół

W Pyramid Down obraz jest początkowo rozmyty, a następnie próbkowany w dół. Możesz wykonać operację Pyramid Down na obrazie za pomocąpyrDown() metoda imgprocklasa. Poniżej znajduje się składnia tej metody -

pyrDown(src, dst, dstsize, borderType)

Ta metoda akceptuje następujące parametry -

  • src - Przedmiot z klasy Mat reprezentujący obraz źródłowy (wejściowy).

  • mat - Przedmiot z klasy Mat reprezentujący obraz docelowy (wyjściowy).

  • size - Przedmiot z klasy Size reprezentujący rozmiar, do którego obraz ma zostać powiększony lub zmniejszony.

  • borderType - zmienna typu całkowitego reprezentująca typ obramowania, który ma być użyty.

Przykład

Poniższy program demonstruje, jak wykonać operację piramidy w dół na obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class PyramidDown {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap13/pyramid_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying pyrDown on the Image
      Imgproc.pyrDown(src, dst, new Size(src.cols()/2,  src.rows()/2),
         Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap13/pyrDown_output.jpg", dst);

      System.out.println("Image Processed");
   } 
}

Załóżmy, że poniżej jest obraz wejściowy pyramid_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Filtrowanie z przesunięciem średnim

W operacji piramidy z przesunięciem średnim wykonywany jest początkowy etap segmentacji obrazu z przesunięciem średnim.

Operację filtrowania piramidowego z przesunięciem średniej można wykonać na obrazie przy użyciu funkcji pyrDown() metoda imgprocklasa. Poniżej znajduje się składnia tej metody.

pyrMeanShiftFiltering(src, dst, sp, sr)

Ta metoda akceptuje następujące parametry -

  • src - Przedmiot z klasy Mat reprezentujący obraz źródłowy (wejściowy).

  • mat - Przedmiot z klasy Mat reprezentujący obraz docelowy (wyjściowy).

  • sp - zmienna typu double reprezentująca przestrzenny promień okna.

  • sr - Zmienna typu double reprezentująca promień okna koloru.

Przykład

Poniższy program demonstruje, jak wykonać operację filtrowania z przesunięciem średnim na danym obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class PyramidMeanShift {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap13/pyramid_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying meanShifting on the Image
      Imgproc.pyrMeanShiftFiltering(src, dst, 200, 300);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap13/meanShift_output.jpg", dst);
      
      System.out.println("Image Processed");
   } 
}

Załóżmy, że poniżej jest obraz wejściowy pyramid_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Progowanie to metoda segmentacji obrazu, na ogół służy do tworzenia obrazów binarnych. Progi są dwojakiego rodzaju, a mianowicie proste i adaptacyjne.

Proste progowanie

W prostej operacji progowania pikselom, których wartości są większe od określonej wartości progowej, przypisuje się wartość standardową.

Za pomocą tej metody można wykonać prostą operację progową na obrazie threshold() z Imgproc class, Poniżej przedstawiono składnię tej metody.

threshold(src, dst, thresh, maxval, type)

Ta metoda akceptuje następujące parametry -

  • src - Przedmiot z klasy Mat reprezentujący obraz źródłowy (wejściowy).

  • dst - Przedmiot z klasy Mat reprezentujący obraz docelowy (wyjściowy).

  • thresh - zmienna podwójnego typu reprezentująca wartość progową.

  • maxval - Zmienna typu double reprezentująca wartość, która ma być podana, jeśli wartość piksela jest większa niż wartość progowa.

  • type - zmienna typu integer reprezentująca typ progu, który ma być użyty.

Przykład

Poniższy program demonstruje, jak wykonać prostą operację progowania na obrazie w OpenCV.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Thresh {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap14/thresh_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();
      Imgproc.threshold(src, dst, 50, 255, Imgproc.THRESH_BINARY);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap14/thresh_trunc.jpg", dst);

      System.out.println("Image Processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy thresh_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Inne rodzaje prostego progowania

Dodatkowo THRESH_BINARYoperacja pokazana w poprzednim przykładzie, OpenCV obsługuje różne inne typy operacji progowych. Wszystkie te typy są reprezentowane przez wstępnie zdefiniowane pola statyczne (wartości stałe)Imgproc klasa.

Możesz wybrać typ wymaganej operacji progowej, przekazując odpowiednią predefiniowaną wartość do nazwanego parametru type z threshold() metoda.

Imgproc.threshold(src, dst, 50, 255, Imgproc.THRESH_BINARY);

Poniżej przedstawiono wartości reprezentujące różne typy operacji progowych i odpowiadające im wyniki.

Działanie i opis Wynik
THRESH_BINARY
THRESH_BINARY_INV
THRESH_TRUNC
THRESH_TOZERO
THRESH_TOZERO_INV

W simple thresholding, wartość progowa jest globalna, tj. jest taka sama dla wszystkich pikseli obrazu. Adaptive thresholding to metoda, w której wartość progowa jest obliczana dla mniejszych regionów, a zatem będą różne wartości progowe dla różnych regionów.

W OpenCV można wykonać operację adaptacyjnego progu na obrazie przy użyciu tej metody adaptiveThreshold() z Imgprocklasa. Poniżej znajduje się składnia tej metody.

adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)

Ta metoda akceptuje następujące parametry -

  • src - Przedmiot z klasy Mat reprezentujący obraz źródłowy (wejściowy).

  • dst - Przedmiot z klasy Mat reprezentujący obraz docelowy (wyjściowy).

  • maxValue - Zmienna typu double reprezentująca wartość, która ma być podana, jeśli wartość piksela jest większa niż wartość progowa.

  • adaptiveMethod- zmienna typu integer reprezentująca metodę adaptacyjną, która ma zostać użyta. Będzie to jedna z następujących dwóch wartości

    • ADAPTIVE_THRESH_MEAN_C - wartość progowa to średnia z obszaru sąsiedztwa.

    • ADAPTIVE_THRESH_GAUSSIAN_C - wartość progowa to ważona suma wartości sąsiedztwa, gdzie wagi są oknem Gaussa.

  • thresholdType - zmienna typu integer reprezentująca typ progu, który ma być użyty.

  • blockSize - zmienna typu integer reprezentująca rozmiar otoczenia pikseli wykorzystywana do obliczenia wartości progowej.

  • C - zmienna typu double reprezentująca stałą używaną w obu metodach (odjęta od średniej lub średniej ważonej).

  • Przykład

    Poniższy program demonstruje, jak wykonać operację adaptacyjnego progu na obrazie w OpenCV. Tutaj wybieramy typ progu adaptacyjnegobinary i ADAPTIVE_THRESH_MEAN_C dla metody progowej.

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    public class AdaptiveThresh {
       public static void main(String args[]) throws Exception {
          // Loading the OpenCV core library
          System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
    
          // Reading the Image from the file and storing it in to a Matrix object
          String file ="E:/OpenCV/chap14/thresh_input.jpg";
          
          // Reading the image
          Mat src = Imgcodecs.imread(file,0);
    
          // Creating an empty matrix to store the result
          Mat dst = new Mat();
    
          Imgproc.adaptiveThreshold(src, dst, 125, Imgproc.ADAPTIVE_THRESH_MEAN_C,
             Imgproc.THRESH_BINARY, 11, 12);
    
          // Writing the image
          Imgcodecs.imwrite("E:/OpenCV/chap14/Adaptivemean_thresh_binary.jpg", dst);
    
          System.out.println("Image Processed");
       } 
    }

    Załóżmy, że poniżej jest obraz wejściowy thresh_input.jpg określone w powyższym programie.

    Wynik

    Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

    Image Processed

    Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

    Inne typy adaptacyjnego progowania

    Dodatkowo ADAPTIVE_THRESH_MEAN_C jako metoda adaptacyjna i THRESH_BINARY jako typ progu, jak pokazano w poprzednim przykładzie, możemy wybrać więcej kombinacji tych dwóch wartości.

    Imgproc.adaptiveThreshold(src, dst, 125, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 11, 12);

    Poniżej przedstawiono wartości reprezentujące różne kombinacje wartości parametrów adaptiveMethod i thresholdType i ich odpowiednich wyników.

    adaptiveMethod /resholdType ADAPTIVE_THRESH_MEAN_C ADAPTIVE_THRESH_GAUSSIAN_C:
    THRESH_BINARY
    THRESH_BINARY_INV

    W tym rozdziale dowiesz się, jak ropucha obramowuje obraz.

    Metoda copyMakeBorder ()

    Możesz dodać różne obramowania do obrazu za pomocą tej metody copyMakeBorder() klasy o nazwie Core, która należy do pakietu org.opencv.core. Poniżej znajduje się składnia tej metody.

    copyMakeBorder(src, dst, top, bottom, left, right, borderType)

    Ta metoda akceptuje następujące parametry -

    • src - Przedmiot z klasy Mat reprezentujący obraz źródłowy (wejściowy).

    • dst - Przedmiot z klasy Mat reprezentujący obraz docelowy (wyjściowy).

    • top - zmienna typu integer, typu integer, reprezentująca długość obramowania u góry obrazu.

    • bottom - zmienna typu integer, typu integer, reprezentująca długość obramowania na dole obrazu.

    • left - zmienna typu integer, typu integer, reprezentująca długość krawędzi po lewej stronie obrazu.

    • right - zmienna typu integer, typu integer, reprezentująca długość krawędzi po prawej stronie obrazu.

    • borderType - zmienna typu integer reprezentująca typ obramowania, które ma być użyte.

    Przykład

    Poniższy program jest przykładem pokazującym, jak dodać obramowanie do danego obrazu.

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.imgcodecs.Imgcodecs;
    
    public class AddingBorder {
       public static void main( String[] args ) {
          // Loading the OpenCV core library
          System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
          // Reading the Image from the file and storing it in to a Matrix object
          String file ="E:/OpenCV/chap15/input.jpg";
          Mat src = Imgcodecs.imread(file);
    
          // Creating an empty matrix to store the result
          Mat dst = new Mat();
       
          Core.copyMakeBorder(src, dst, 20, 20, 20, 20, Core.BORDER_CONSTANT);
          Imgcodecs.imwrite("E:/OpenCV/chap15/border_constant.jpg", dst);
    
          System.out.println("Image Processed");
       }
    }

    Załóżmy, że poniżej jest obraz wejściowy thresh_input.jpg określone w powyższym programie.

    Wynik

    Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

    Image Processed

    Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

    Inne rodzaje granic

    Oprócz typu obramowania BORDER_CONSTANTpokazane w poprzednim przykładzie, OpenCV obsługuje różne inne typy granic. Wszystkie te typy są reprezentowane przez predefiniowane pola statyczne (wartości stałe) klasy Core.

    Możesz wybrać typ wymaganej operacji progowej, przekazując odpowiednią predefiniowaną wartość do nazwanego parametru borderType z copyMakeBorder() metoda.

    Core.copyMakeBorder(src, dst, 20, 20, 20, 20, Core.BORDER_CONSTANT);

    Poniżej przedstawiono wartości reprezentujące różne typy operacji na granicach i ich odpowiednie wyniki.

    Działanie i opis Wynik
    BORDER_CONSTANT
    BORDER_ISOLATED
    BORDER_DEFAULT
    BORDER_REFLECT
    BORDER_REFLECT_101
    BORDER_REFLECT101
    BORDER_REPLICATE
    BORDER_WRAP

    Używając sobel operation, możesz wykryć krawędzie obrazu zarówno w kierunku poziomym, jak i pionowym. Możesz zastosować operację Sobela na obrazie za pomocą tej metodysobel(). Poniżej znajduje się składnia tej metody -

    Sobel(src, dst, ddepth, dx, dy)

    Ta metoda akceptuje następujące parametry -

    • src - Przedmiot z klasy Mat reprezentujący obraz źródłowy (wejściowy).

    • dst - Przedmiot z klasy Mat reprezentujący obraz docelowy (wyjściowy).

    • ddepth - zmienna całkowita reprezentująca głębię obrazu (-1)

    • dx- zmienna całkowita reprezentująca pochodną x. (0 lub 1)

    • dy- zmienna całkowita reprezentująca pochodną y. (0 lub 1)

    Przykład

    Poniższy program demonstruje, jak wykonać operację Sobel na danym obrazie.

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    public class SobelTest {
       public static void main(String args[]) {
          // Loading the OpenCV core library
          System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
          // Reading the Image from the file and storing it in to a Matrix object
          String file ="E:/OpenCV/chap16/sobel_input.jpg";
          Mat src = Imgcodecs.imread(file);
    
          // Creating an empty matrix to store the result
          Mat dst = new Mat();
    
          // Applying sobel on the Image
          Imgproc.Sobel(src, dst, -1, 1, 1);
    
          // Writing the image
          Imgcodecs.imwrite("E:/OpenCV/chap16/sobel_output.jpg", dst);
    
          System.out.println("Image processed");
       }
    }

    Załóżmy, że poniżej jest obraz wejściowy sobel_input.jpg określone w powyższym programie.

    Wynik

    Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

    Image Processed

    Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

    sobel Variants

    Przekazując różne wartości do ostatniej do parametrów (dx i dy) (między 0 i 1), otrzymasz różne wyniki -

    // Applying sobel on the Image
    Imgproc.Sobel(src, dst, -1, 1, 1);

    Poniższa tabela zawiera listę różnych wartości zmiennych dx i dy metody Sobel() i ich odpowiednich wyników.

    Pochodna X. Pochodna Y Wynik
    0 1
    1 0
    1 1

    Scharr jest również używany do wykrywania drugiej pochodnej obrazu w kierunku poziomym i pionowym. Za pomocą tej metody można wykonać operację scharr na obraziescharr(). Poniżej znajduje się składnia tej metody -

    Scharr(src, dst, ddepth, dx, dy)

    Ta metoda akceptuje następujące parametry -

    • src - Przedmiot z klasy Mat reprezentujący obraz źródłowy (wejściowy).

    • dst - Przedmiot z klasy Mat reprezentujący obraz docelowy (wyjściowy).

    • ddepth - zmienna całkowita reprezentująca głębię obrazu (-1)

    • dx- zmienna całkowita reprezentująca pochodną x. (0 lub 1)

    • dy- zmienna całkowita reprezentująca pochodną y. (0 lub 1)

    Przykład

    Poniższy program demonstruje, jak zastosować scharr do danego obrazu.

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    public class ScharrTest {
    
       public static void main( String[] args ) {
    
          // Loading the OpenCV core library
          System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
    
          // Reading the Image from the file and storing it in to a Matrix object
          String file ="E:/OpenCV/chap16/sobel_input.jpg";
          Mat src = Imgcodecs.imread(file);
    
          // Creating an empty matrix to store the result
          Mat dst = new Mat();
    
          // Applying Box Filter effect on the Image
          Imgproc.Scharr(src, dst, Imgproc.CV_SCHARR, 0, 1);
    
          // Writing the image
          Imgcodecs.imwrite("E:/OpenCV/chap16/scharr_output.jpg", dst);
    
          System.out.println("Image processed");
       }
    }

    Załóżmy, że poniżej jest obraz wejściowy scharr_input.jpg określone w powyższym programie.

    Wynik

    Wykonując go, otrzymasz następujący wynik -

    Image Processed

    Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

    Więcej Scharr Pochodne

    Przekazując różne wartości do ostatniej do parametrów (dx i dy) (między 0 i 1), otrzymasz różne wyniki -

    // Applying scharr on the Image
    Imgproc.Scharr(src, dst, -1, 1, 1);

    Poniżej znajduje się tabela zawierająca różne wartości zmiennych dx i dy metody scharr() i ich odpowiednich wyników.

    Pochodna X. Pochodna Y Wynik
    0 1
    1 0

    Operator Laplacian jest również operatorem pochodnym, który służy do znajdowania krawędzi na obrazie. Jest to maska ​​pochodna drugiego rzędu. W tej masce mamy dwie dalsze klasyfikacje: jedna to pozytywny operator laplacki, a druga to ujemny operator laplacki.

    W przeciwieństwie do innych operatorów Laplacian nie usuwa krawędzi w żadnym konkretnym kierunku, ale usuwa krawędzie w następującej klasyfikacji.

    • Wewnętrzne krawędzie
    • Zewnętrzne krawędzie

    Możesz występować Laplacian Transform operacja na obrazie przy użyciu Laplacian() metoda imgproc class, poniżej jest składnia tej metody.

    Laplacian(src, dst, ddepth)

    Ta metoda akceptuje następujące parametry -

    • src - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

    • dst - A Mat obiekt reprezentujący miejsce docelowe (obraz wyjściowy) dla tej operacji.

    • ddepth - zmienna typu integer reprezentująca głębokość docelowego obrazu.

    Przykład

    Poniższy program demonstruje, jak wykonać operację transformacji Laplace'a na danym obrazie.

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    public class LaplacianTest {
       public static void main(String args[]) {
          // Loading the OpenCV core library
          System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
          //Reading the Image from the file and storing it in to a Matrix object
          String file ="E:/OpenCV/chap18/laplacian_input.jpg";
          Mat src = Imgcodecs.imread(file);
    
          // Creating an empty matrix to store the result
          Mat dst = new Mat();
    
          // Applying GaussianBlur on the Image
          Imgproc.Laplacian(src, dst, 10);
    
          // Writing the image
          Imgcodecs.imwrite("E:/OpenCV/chap18/laplacian.jpg", dst);
    
          System.out.println("Image Processed");
       }
    }

    Załóżmy, że poniżej jest obraz wejściowy laplacian_input.jpg określone w powyższym programie.

    Wynik

    Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

    Image Processed

    Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

    Plik distance transformoperator zazwyczaj przyjmuje obrazy binarne jako dane wejściowe. W tej operacji intensywność szarości punktów wewnątrz obszarów pierwszego planu jest zmieniana w celu oddalenia ich odpowiednich odległości od najbliższej wartości 0 (granicy).

    Możesz zastosować transformację odległości w OpenCV za pomocą metody distanceTransform(). Poniżej znajduje się składnia tej metody.

    distanceTransform(src, dst, distanceType, maskSize)

    Ta metoda akceptuje następujące parametry -

    • src - Przedmiot z klasy Mat reprezentujący obraz źródłowy (wejściowy).

    • dst - Przedmiot z klasy Mat reprezentujący obraz docelowy (wyjściowy).

    • distanceType - zmienna typu integer reprezentująca typ zastosowanej transformacji odległości.

    • maskSize - zmienna typu całkowitego reprezentująca rozmiar maski, która ma być używana.

    Przykład

    Poniższy program demonstruje, jak wykonać operację transformacji odległości na danym obrazie.

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    public class DistanceTransform {
       public static void main(String args[]) {
          // Loading the OpenCV core library
          System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
    
          // Reading the Image from the file and storing it in to a Matrix object
          String file ="E:/OpenCV/chap19/input.jpg";
          Mat src = Imgcodecs.imread(file,0);
    
          // Creating an empty matrix to store the results
          Mat dst = new Mat();
          Mat binary = new Mat();
    
          // Converting the grayscale image to binary image
          Imgproc.threshold(src, binary, 100, 255, Imgproc.THRESH_BINARY);
    
          // Applying distance transform
          Imgproc.distanceTransform(mat, dst, Imgproc.DIST_C, 3);
    
          // Writing the image
          Imgcodecs.imwrite("E:/OpenCV/chap19/distnceTransform.jpg", dst);
    
          System.out.println("Image Processed");
       }
    }

Załóżmy, że poniżej jest obraz wejściowy input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Rodzaje operacji przekształcania odległości

Oprócz typu operacji na odległość DIST_Cpokazane w poprzednim przykładzie, OpenCV obsługuje różne inne typy operacji przekształcania odległości. Wszystkie te typy są reprezentowane przez predefiniowane pola statyczne (wartości stałe) klasy Imgproc.

Możesz wybrać typ operacji transformacji odległości, której potrzebujesz, przekazując odpowiednią wstępnie zdefiniowaną wartość do nazwanego parametru distanceType z distanceTransform() metoda.

// Applying distance transform 
Imgproc.distanceTransform(mat, dst, Imgproc.DIST_C, 3);

Poniżej przedstawiono wartości reprezentujące różne typy plików distanceTransform operacje i ich odpowiednie wyniki.

Działanie i opis Wynik
DIST_C
DIST_L1
DIST_L2
DIST_LABEL_PIXEL
DIST_MASK_3

W tym rozdziale dowiemy się, jak używać OpenCV do przechwytywania klatek za pomocą kamery systemowej. PlikVideoCapture klasa org.opencv.videoioPakiet zawiera klasy i metody do przechwytywania wideo za pomocą kamery. Przejdźmy krok po kroku i dowiedzmy się, jak przechwytywać klatki -

Krok 1: Załaduj natywną bibliotekę OpenCV

Podczas pisania kodu Java za pomocą biblioteki OpenCV, pierwszym krokiem, jaki należy wykonać, jest załadowanie natywnej biblioteki OpenCV za pomocą loadLibrary(). Załaduj natywną bibliotekę OpenCV, jak pokazano poniżej.

// Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Krok 2: Utwórz wystąpienie klasy przechwytywania wideo

Utwórz wystąpienie klasy Mat, używając dowolnej funkcji wspomnianej wcześniej w tym samouczku.

// Instantiating the VideoCapture class (camera:: 0) 
VideoCapture capture = new VideoCapture(0);

Krok 3: Przeczytaj ramki

Możesz odczytać klatki z aparatu za pomocą read() metoda VideoCaptureklasa. Ta metoda akceptuje obiekt klasyMat aby zapisać ramkę do odczytu.

// Reading the next video frame from the camera 
Mat matrix = new Mat(); 
capture.read(matrix);

Przykład

Poniższy program pokazuje, jak przechwycić klatkę za pomocą kamery i wyświetlić ją za pomocą okna JavaFX. Zapisuje również przechwyconą ramkę.

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;

import java.io.FileNotFoundException;
import java.io.IOException;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

public class CameraSnapshotJavaFX extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws FileNotFoundException, IOException {
      // Capturing the snapshot from the camera
      CameraSnapshotJavaFX obj = new CameraSnapshotJavaFX();
      WritableImage writableImage = obj.capureSnapShot();

      // Saving the image
      obj.saveImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Capturing an image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage capureSnapShot() {
      WritableImage WritableImage = null;

      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the VideoCapture class (camera:: 0)
      VideoCapture capture = new VideoCapture(0);

      // Reading the next video frame from the camera
      Mat matrix = new Mat();
      capture.read(matrix);

      // If camera is opened
      if( capture.isOpened()) {
         // If there is next video frame
         if (capture.read(matrix)) {
            // Creating BuffredImage from the matrix
            BufferedImage image = new BufferedImage(matrix.width(), 
               matrix.height(), BufferedImage.TYPE_3BYTE_BGR);
            
            WritableRaster raster = image.getRaster();
            DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
            byte[] data = dataBuffer.getData();
            matrix.get(0, 0, data);
            this.matrix = matrix;
            
            // Creating the Writable Image
            WritableImage = SwingFXUtils.toFXImage(image, null);
         }
      }
      return WritableImage;
   }
   public void saveImage() {
      // Saving the Image
      String file = "E:/OpenCV/chap22/sanpshot.jpg";

      // Instantiating the imgcodecs class
      Imgcodecs imageCodecs = new Imgcodecs();

      // Saving it again 
      imageCodecs.imwrite(file, matrix);
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe.

Jeśli otworzysz określoną ścieżkę, możesz zobaczyć tę samą klatkę, która jest zapisana jako plik jpg.

Plik VideoCapture klasa org.opencv.videoioPakiet zawiera klasy i metody do przechwytywania wideo za pomocą kamery systemowej. Przejdźmy krok po kroku i nauczmy się, jak to zrobić.

Krok 1: Załaduj natywną bibliotekę OpenCV

Podczas pisania kodu Java za pomocą biblioteki OpenCV, pierwszym krokiem, jaki należy wykonać, jest załadowanie natywnej biblioteki OpenCV za pomocą loadLibrary(). Załaduj natywną bibliotekę OpenCV, jak pokazano poniżej.

// Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Krok 2: Utwórz wystąpienie klasy CascadeClassifier

Plik CascadeClassifier klasa pakietu org.opencv.objdetectsłuży do ładowania pliku klasyfikatora. Utwórz wystąpienie tej klasy, przekazując plikxml plik lbpcascade_frontalface.xml jak pokazano niżej.

// Instantiating the CascadeClassifier 
String xmlFile = "E:/OpenCV/facedetect/lbpcascade_frontalface.xml"; 
CascadeClassifier classifier = new CascadeClassifier(xmlFile);

Krok 3: Wykryj twarze

Możesz wykryć twarze na obrazie za pomocą metody detectMultiScale() klasy o nazwie CascadeClassifier. Ta metoda akceptuje obiekt klasyMat przechowujący obraz wejściowy i obiekt klasy MatOfRect aby zapisać wykryte twarze.

// Detecting the face in the snap 
MatOfRect faceDetections = new MatOfRect(); 
classifier.detectMultiScale(src, faceDetections);

Przykład

Poniższy program demonstruje, jak wykrywać twarze na obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
  
public class FaceDetectionImage {
   public static void main (String[] args) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap23/facedetection_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Instantiating the CascadeClassifier
      String xmlFile = "E:/OpenCV/facedetect/lbpcascade_frontalface.xml";
      CascadeClassifier classifier = new CascadeClassifier(xmlFile);

      // Detecting the face in the snap
      MatOfRect faceDetections = new MatOfRect();
      classifier.detectMultiScale(src, faceDetections);
      System.out.println(String.format("Detected %s faces", 
         faceDetections.toArray().length));

      // Drawing boxes for (Rect rect : faceDetections.toArray()) { Imgproc.rectangle( src, // where to draw the box new Point(rect.x, rect.y), // bottom left new Point(rect.x + rect.width, rect.y + rect.height), // top right new Scalar(0, 0, 255), 3 // RGB colour );
      }

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap23/facedetect_output1.jpg", src);

      System.out.println("Image Processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy facedetection_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Detected 3 faces 
Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Poniższy program pokazuje, jak wykrywać twarze za pomocą kamery systemowej i wyświetlać je za pomocą okna JavaFX.

Przykład

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;

import java.io.FileNotFoundException;
import java.io.IOException;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.videoio.VideoCapture;

public class faceDetectionJavaFXX extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws FileNotFoundException, IOException {
      // Capturing the snapshot from the camera
      faceDetectionJavaFXX obj = new faceDetectionJavaFXX();
      WritableImage writableImage = obj.capureFrame();

      // Saving the image
      obj.saveImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Capturing an image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage capureFrame() {
      WritableImage writableImage = null;

      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the VideoCapture class (camera:: 0)
      VideoCapture capture = new VideoCapture(0);

      // Reading the next video frame from the camera
      Mat matrix = new Mat();
      capture.read(matrix);

      // If camera is opened
      if(!capture.isOpened()) {
         System.out.println("camera not detected");
      } else
         System.out.println("Camera detected ");
           
      // If there is next video frame
      if (capture.read(matrix)) {
         /////// Detecting the face in the snap /////
         String file = "E:/OpenCV/facedetect/lbpcascade_frontalface.xml";
         CascadeClassifier classifier = new CascadeClassifier(file);

         MatOfRect faceDetections = new MatOfRect();
         classifier.detectMultiScale(matrix, faceDetections);
         System.out.println(String.format("Detected %s faces",
            faceDetections.toArray().length));

         // Drawing boxes for (Rect rect : faceDetections.toArray()) { Imgproc.rectangle( matrix, //where to draw the box new Point(rect.x, rect.y), //bottom left new Point(rect.x + rect.width, rect.y + rect.height), //top right new Scalar(0, 0, 255) //RGB colour );
         }
         // Creating BuffredImage from the matrix
         BufferedImage image = new BufferedImage(matrix.width(), matrix.height(),
            BufferedImage.TYPE_3BYTE_BGR);
         
         WritableRaster raster = image.getRaster();
         DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
         byte[] data = dataBuffer.getData();
         matrix.get(0, 0, data);

         this.matrix = matrix;
           
         // Creating the Writable Image
         writableImage = SwingFXUtils.toFXImage(image, null);
      }
      return writableImage;
   }
   public void saveImage() {
      // Saving the Image
      String file = "E:/OpenCV/chap23/facedetected.jpg";

      // Instantiating the imagecodecs class
      Imgcodecs imageCodecs = new Imgcodecs();

      // Saving it again
      imageCodecs.imwrite(file, matrix);
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe.

Jeśli otworzysz określoną ścieżkę, zobaczysz tę samą migawkę zapisaną jako plik jpg wizerunek.

Możesz występować affine translation na obrazie przy użyciu warpAffine()metoda klasy imgproc. Poniżej znajduje się składnia tej metody -

Imgproc.warpAffine(src, dst, tranformMatrix, size);

Ta metoda akceptuje następujące parametry -

  • src - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

  • dst - A Mat obiekt reprezentujący miejsce docelowe (obraz wyjściowy) dla tej operacji.

  • tranformMatrix - A Mat obiekt reprezentujący macierz transformacji.

  • size - zmienna typu integer reprezentująca rozmiar obrazu wyjściowego.

Przykład

Poniższy program demonstruje, jak zastosować operację afiniczną na danym obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class AffineTranslation {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap24/transform_input.jpg";
      Mat src = Imgcodecs.imread(file);

      //Creating an empty matrix to store the result
      Mat dst = new Mat();

      Point p1 = new Point( 0,0 );
      Point p2 = new Point( src.cols() - 1, 0 );
      Point p3 = new Point( 0, src.rows() - 1 );
      Point p4 = new Point( src.cols()*0.0, src.rows()*0.33 );
      Point p5 = new Point( src.cols()*0.85, src.rows()*0.25 );
      Point p6 = new Point( src.cols()*0.15, src.rows()*0.7 );
      
      MatOfPoint2f ma1 = new MatOfPoint2f(p1,p2,p3);
      MatOfPoint2f ma2 = new MatOfPoint2f(p4,p5,p6);

      // Creating the transformation matrix
      Mat tranformMatrix = Imgproc.getAffineTransform(ma1,ma2);

      // Creating object of the class Size
      Size size = new Size(src.cols(), src.cols());

      // Applying Wrap Affine
      Imgproc.warpAffine(src, dst, tranformMatrix, size);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap24/Affinetranslate.jpg", dst);

      System.out.println("Image Processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy transform_input.jpg określone w powyższym programie.

Wynik

Wykonując go, otrzymasz następujący wynik -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Możesz perform rotation operacja na obrazie przy użyciu warpAffine() metoda imgprocklasa. Poniżej znajduje się składnia tej metody -

Imgproc.warpAffine(src, dst, rotationMatrix, size);

Ta metoda akceptuje następujące parametry -

  • src - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

  • dst - A Mat obiekt reprezentujący miejsce docelowe (obraz wyjściowy) dla tej operacji.

  • rotationMatrix - A Mat obiekt reprezentujący macierz rotacji.

  • size - zmienna typu integer reprezentująca rozmiar obrazu wyjściowego.

Przykład

Poniższy program przedstawia sposób obracania obrazu.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Rotation {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap24/transform_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating a Point object
      Point point = new Point(300, 200)

      // Creating the transformation matrix M
      Mat rotationMatrix = Imgproc.getRotationMatrix2D(point, 30, 1);

      // Creating the object of the class Size
      Size size = new Size(src.cols(), src.cols());

      // Rotating the given image
      Imgproc.warpAffine(src, dst, rotationMatrix, size);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap24/rotate_output.jpg", dst);

      System.out.println("Image Processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy transform_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Możesz występować scaling na obrazie przy użyciu resize() metoda imgprocklasa. Poniżej znajduje się składnia tej metody.

resize(Mat src, Mat dst, Size dsize, double fx, double fy, int interpolation)

Ta metoda akceptuje następujące parametry -

  • src - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

  • dst - A Mat obiekt reprezentujący miejsce docelowe (obraz wyjściowy) dla tej operacji.

  • dsize - A Size obiekt reprezentujący rozmiar obrazu wyjściowego.

  • fx - Zmienna typu double reprezentująca współczynnik skali wzdłuż osi poziomej.

  • fy - Zmienna typu double reprezentująca współczynnik skali wzdłuż osi pionowej.

  • Interpolation - zmienna całkowita reprezentująca metodę interpolacji.

Przykład

Poniższy program demonstruje, jak stosować scale transformation do obrazu.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Scaling {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap24/transform_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating the Size object
      Size size = new Size(src.rows()*2, src.rows()*2);

      // Scaling the Image
      Imgproc.resize(src, dst, size, 0, 0, Imgproc.INTER_AREA);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap24/scale_output.jpg", dst);

      System.out.println("Image Processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy transform_input.jpg określone w powyższym programie (rozmiar - Szerokość: 300px i wysokość: 300px).

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób (rozmiar - Szerokość: 600 pikseli i wysokość: 600 pikseli) -

W OpenCV możesz zastosować różne mapy kolorów do obrazu za pomocą tej metody applyColorMap() klasy Imgproc. Poniżej znajduje się składnia tej metody -

applyColorMap(Mat src, Mat dst, int colormap)

Akceptuje trzy parametry -

  • src - Przedmiot z klasy Mat reprezentujący obraz źródłowy (wejściowy).

  • dst - Przedmiot z klasy Mat reprezentujący obraz docelowy (wyjściowy).

  • colormap - Zmienna typu całkowitego reprezentująca typ stosowanej mapy kolorów.

Przykład

Poniższy program demonstruje, jak stosować color map do obrazu.

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class ColorMapTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap25/color_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying color map to an image
      Imgproc.applyColorMap(src, dst, Imgproc.COLORMAP_HOT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap25/colormap_hot.jpg", dst);
      System.out.println("Image processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy color_input.jpg określone w powyższym programie.

Wynik

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Więcej operacji

Oprócz COLORMAP_HOTpokazane w poprzednim przykładzie, OpenCV obsługuje różne inne typy map kolorów. Wszystkie te typy są reprezentowane przez predefiniowane pola statyczne (wartości stałe) klasy Imgproc.

Możesz wybrać typ potrzebnej mapy kolorów, przekazując odpowiednią predefiniowaną wartość do nazwanego parametru colormap z applyColorMap() metoda.

Imgproc.applyColorMap(src, dst, Imgproc.COLORMAP_HOT);

Poniżej przedstawiono wartości reprezentujące różne typy map kolorów i ich odpowiednie wyniki.

Działanie i opis Wynik
COLORMAP_AUTUMN
COLORMAP_BONE
COLORMAP_COOL
COLORMAP_HOT
COLORMAP_HSV
COLORMAP_JET
COLORMAP_OCEAN
COLORMAP_PARULA
COLORMAP_PINK
COLORMAP_RAINBOW
COLORMAP_SPRING
COLORMAP_SUMMER
COLORMAP_WINTER

Canny Edge Detection służy do wykrywania krawędzi obrazu. Akceptuje obraz w skali szarości jako dane wejściowe i używa algorytmu wielostopniowego.

Możesz wykonać tę operację na obrazie za pomocą Canny() metoda imgproc class, poniżej jest składnia tej metody.

Canny(image, edges, threshold1, threshold2)

Ta metoda akceptuje następujące parametry -

  • image - A Mat obiekt reprezentujący źródło (obraz wejściowy) dla tej operacji.

  • edges - A Mat obiekt reprezentujący cel (krawędzie) dla tej operacji.

  • threshold1 - Zmienna typu double reprezentująca pierwszy próg procedury histerezy.

  • threshold2 - Zmienna typu double reprezentująca drugi próg procedury histerezy.

Przykład

Poniższy program jest przykładem pokazującym, jak wykonać operację Canny Edge Detection na danym obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class CannyEdgeDetection {
   public static void main(String args[]) throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

      // Reading the Image from the file and storing it in to a Matrix object
      String file = "E:/OpenCV/chap17/canny_input.jpg";

      // Reading the image
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat gray = new Mat();

      // Converting the image from color to Gray
      Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
      Mat edges = new Mat();

      // Detecting the edges
      Imgproc.Canny(gray, edges, 60, 60*3);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap17/canny_output.jpg", edges);
      System.out.println("Image Loaded");
   } 
}

Załóżmy, że poniżej jest obraz wejściowy canny_input.jpg określone w powyższym programie.

Wynik

Wykonując powyższy program, otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Możesz wykryć kształt danego obrazu, stosując rozszerzenie Hough Transform technique przy użyciu metody HoughLines() z Imgprocklasa. Poniżej znajduje się składnia tej metody.

HoughLines(image, lines, rho, theta, threshold)

Ta metoda akceptuje następujące parametry -

  • image - Przedmiot z klasy Mat reprezentujący obraz źródłowy (wejściowy).

  • lines - Przedmiot z klasy Mat przechowujący wektor przechowujący parametry (r, Φ) linii.

  • rho - zmienna typu double reprezentująca rozdzielczość parametru r w pikselach.

  • theta - zmienna typu double reprezentująca rozdzielczość parametru Φ w radianach.

  • threshold - Zmienna typu integer reprezentująca minimalną liczbę przecięć do „wykrycia” wiersza.

Przykład

Poniższy program pokazuje, jak wykryć linie Hougha na danym obrazie.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class HoughlinesTest {
   public static void main(String args[]) throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file = "E:/OpenCV/chap21/hough_input.jpg";

      // Reading the image
      Mat src = Imgcodecs.imread(file,0);

      // Detecting edges of it
      Mat canny = new Mat();
      Imgproc.Canny(src, canny, 50, 200, 3, false);

      // Changing the color of the canny
      Mat cannyColor = new Mat();
      Imgproc.cvtColor(canny, cannyColor, Imgproc.COLOR_GRAY2BGR);

      // Detecting the hough lines from (canny)
      Mat lines = new Mat();
      Imgproc.HoughLines(canny, lines, 1, Math.PI/180, 100);

      System.out.println(lines.rows());
      System.out.println(lines.cols());

      // Drawing lines on the image
      double[] data;
      double rho, theta;
      Point pt1 = new Point();
      Point pt2 = new Point();
      double a, b;
      double x0, y0;
      
      for (int i = 0; i < lines.cols(); i++) {
         data = lines.get(0, i);
         rho = data[0];
         theta = data[1];
         
         a = Math.cos(theta);
         b = Math.sin(theta);
         x0 = a*rho;
         y0 = b*rho;
         
         pt1.x = Math.round(x0 + 1000*(-b));
         pt1.y = Math.round(y0 + 1000*(a));
         pt2.x = Math.round(x0 - 1000*(-b));
         pt2.y = Math.round(y0 - 1000 *(a));
         Imgproc.line(cannyColor, pt1, pt2, new Scalar(0, 0, 255), 6);
      }
      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap21/hough_output.jpg", cannyColor);
          
      System.out.println("Image Processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy hough_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

143 
1 
Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -

Plik histogramobrazu przedstawia częstotliwość wartości intensywności pikseli. Na histogramie obrazu oś X przedstawia intensywność poziomu szarości, a oś Y przedstawia częstotliwość tych intensywności.

Histogram equalizationpoprawia kontrast obrazu, aby rozszerzyć zakres intensywności. Metodą można wyrównać histogram danego obrazuequalizeHist() z Imgprocklasa. Poniżej znajduje się składnia tej metody.

equalizeHist(src, dst)

Ta metoda akceptuje następujące parametry -

  • src - Przedmiot z klasy Mat reprezentujący obraz źródłowy (wejściowy).

  • dst - Przedmiot z klasy Matreprezentujące wyjście. (Obraz uzyskany po wyrównaniu histogramu)

Przykład

Poniższy program pokazuje, jak wyrównać histogram danego obrazu.

import java.util.ArrayList;
import java.util.List;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class HistoTest {
   public static void main (String[] args) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap20/histo_input.jpg";

      // Load the image
      Mat img = Imgcodecs.imread(file);

      // Creating an empty matrix
      Mat equ = new Mat();
      img.copyTo(equ);

      // Applying blur
      Imgproc.blur(equ, equ, new Size(3, 3));

      // Applying color
      Imgproc.cvtColor(equ, equ, Imgproc.COLOR_BGR2YCrCb);
      List<Mat> channels = new ArrayList<Mat>();

      // Splitting the channels
      Core.split(equ, channels);

      // Equalizing the histogram of the image
      Imgproc.equalizeHist(channels.get(0), channels.get(0));
      Core.merge(channels, equ);
      Imgproc.cvtColor(equ, equ, Imgproc.COLOR_YCrCb2BGR);

      Mat gray = new Mat();
      Imgproc.cvtColor(equ, gray, Imgproc.COLOR_BGR2GRAY);
      Mat grayOrig = new Mat();
      Imgproc.cvtColor(img, grayOrig, Imgproc.COLOR_BGR2GRAY);

      Imgcodecs.imwrite("E:/OpenCV/chap20/histo_output.jpg", equ);
      System.out.println("Image Processed");
   }
}

Załóżmy, że poniżej jest obraz wejściowy histo_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -