爲了捕捉圖像,我們使用相機和掃描儀等設備。這些設備記錄圖像的數值(例如:像素值)。OpenCV是一個處理數字圖像的庫,因此我們需要存儲這些圖像進行處理。
OpenCV庫的Mat類用於存儲圖像的值。它表示一個n維數組,用於存儲灰度或彩色圖像、體素體積、向量場、點雲、張量、直方圖等圖像數據。
這個類包含兩個數據部分:頭和指針
Header−包含諸如大小、用於存儲的方法和矩陣地址(大小恆定)等信息。
指針存儲圖像的像素值(保持變化)。
The Mat Class
OpenCV Java庫在包org.OpenCV.core中爲這個類提供了相同的名稱(Mat)。
Constructors
OpenCV Java庫的Mat類有各種構造函數,使用它們可以構造Mat對象。
S.No | Constructors and Description |
---|---|
1 |
材料() 在大多數情況下,這是沒有參數的默認構造函數。我們使用它來構造一個空矩陣並將其傳遞給其他OpenCV方法。 |
2 |
Mat(int行,int列,int類型) 此構造函數接受三個整數類型的參數,表示2D數組中的行數和列數以及數組的類型(用於存儲數據)。 |
3 |
Mat(int行,int列,int類型,標量s) 包括前一個構造函數的參數,此構造函數還接受類標量的對象作爲參數。 |
4 |
Mat(大小,int類型) 此構造函數接受兩個參數,一個表示矩陣大小的對象,一個表示用於存儲數據的數組類型的整數。 |
5 |
Mat(大小、int類型、標量s) 包括前一個構造函數的參數,此構造函數還接受類標量的對象作爲參數。 |
6 | 材料(長地址) |
7 |
墊子(墊子m,靶場行) 此構造函數接受另一個矩陣的對象和表示要創建新矩陣的行範圍的類範圍的對象。 |
8 |
mat(>mat m,range rowrange,range colrange 包括前一個構造函數的參數,這個構造函數還接受類的一個對象。表示列範圍的範圍。 |
9 |
墊子(墊子m,矩形roi) 這個構造函數接受兩個對象,一個表示另一個矩陣,另一個表示RegionOfInteest。 |
注−
數組類型。使用CV_8UC1,…,CV_64FC4創建1-4通道矩陣,或使用CV_8UC(n),…,CV_64FC(n)創建多通道(最多CV_8UC(u)MAX通道)矩陣。
矩陣的類型由屬於包org.opencv.core的類CvType的各個欄位表示。
Methods and Description
下面是Mat類提供的一些方法。
S.No | Methods and Description |
---|---|
1 |
Mat col(整數x) 此方法接受表示列索引的整數參數,並檢索並返回該列。 |
2 |
材料行(國際) 此方法接受表示行索引的整數參數,並檢索並返回該行。 |
3 |
整數列() 此方法返回矩陣中的列數。 |
4 |
整數行() 此方法返回矩陣中的行數。 |
5 |
Mat setTo(Mat值) 此方法接受Mat類型的對象,並將數組元素設置爲指定值。 |
6 |
Mat setTo(標量s) 此方法接受標量類型的對象,並將數組元素設置爲指定值。 |
Creating and Displaying the Matrix
在本節中,我們將討論第一個OpenCV示例。我們將看到如何創建和顯示一個簡單的OpenCV矩陣。
下面給出了在OpenCV中創建和顯示矩陣的步驟。
Step 1: Load the OpenCV native library
在使用OpenCV庫編寫Java代碼時,首先需要使用load library()加載OpenCV的本機庫。加載OpenCV本機庫,如下所示。
//Loading the core library System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Step 2: Instantiate the Mat class
使用本章前面提到的任何函數實例化Mat類。
//Creating a matrix Mat matrix = new Mat(5, 5, CvType.CV_8UC1, new Scalar(0));
Step 3: Fill the matrix using the methods
通過將索引值傳遞給方法row()/col(),可以檢索矩陣的特定行/列。
而且,您可以使用set to()方法的任何變體來設置這些值。
//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));
示例
您可以使用以下程序代碼使用OpenCV庫在Java中創建和顯示一個簡單的矩陣。
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()); } }
在執行上述程序時,您將得到以下輸出&負;
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]
Loading Image using JavaSE API
java.awt.image.BufferedImage包的BufferedImage類用於存儲圖像,包的ImageIO類提供讀取和寫入圖像的方法。
示例
您可以使用以下程序代碼使用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"); } }
在執行上述程序時,您將得到以下輸出&負;
image Saved
如果打開指定的路徑,則可以按以下方式觀察保存的圖像−