OpenCV - 圖片儲存



為了捕捉影像,我們使用相機和掃描器等裝置。這些裝置記錄影像的數值(例如:畫素值)。OpenCV是一個處理數字影像的庫,因此我們需要儲存這些影像以進行處理。

OpenCV 庫的Mat類用於儲存影像的值。它表示一個n維陣列,用於儲存灰度或彩色影像、體素體積、向量場、點雲、張量、直方圖等影像資料。

此類包含兩個資料部分:指標

  • - 包含諸如大小、儲存方法和矩陣地址(大小恆定)等資訊。

  • 指標 - 儲存影像的畫素值(不斷變化)。

Mat 類

OpenCV Java 庫在org.opencv.core包中提供同名類(Mat)。

建構函式

OpenCV Java 庫的 Mat 類具有各種建構函式,可以使用它們來構造 Mat 物件。

序號 建構函式和描述
1

Mat()

在大多數情況下,這是沒有引數的預設建構函式。我們使用此建構函式建立一個空矩陣,並將其傳遞給其他 OpenCV 方法。

2

Mat(int rows, int cols, int type)

此建構函式接受三個整型引數,分別表示二維陣列的行數和列數以及陣列的型別(用於儲存資料)。

3

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

除了前一個建構函式的引數外,此建構函式還額外接受一個 Scalar 類的物件作為引數。

4

Mat(Size size, int type)

此建構函式接受兩個引數,一個表示矩陣大小的物件和一個表示用於儲存資料的陣列型別的整數。

5

Mat(Size size, int type, Scalar s)

除了前一個建構函式的引數外,此建構函式還額外接受一個 Scalar 類的物件作為引數。

6

Mat(long addr)

7

Mat(Mat m, Range rowRange)

此建構函式接受另一個矩陣的物件和 Range 類的物件,該物件表示要用於建立新矩陣的行範圍。

8

Mat(Mat m, Range rowRange, Range colRange)

除了前一個建構函式的引數外,此建構函式還額外接受一個 Range 類物件,表示列範圍。

9

Mat(Mat m, Rect roi)

此建構函式接受兩個物件,一個表示另一個矩陣,另一個表示感興趣區域 (ROI)

注意 -

  • 陣列型別。使用 CV_8UC1、…、CV_64FC4 建立 1-4 通道矩陣,或使用 CV_8UC(n)、…、CV_64FC(n) 建立多通道(最多 CV_CN_MAX 通道)矩陣。

  • 矩陣的型別由org.opencv.core包中的CvType類的各個欄位表示。

方法和描述

以下是 Mat 類提供的一些方法。

序號 方法和描述
1

Mat col(int x)

此方法接受一個表示列索引的整型引數,並檢索並返回該列。

2

Mat row(int y)

此方法接受一個表示行索引的整型引數,並檢索並返回該行。

3

int cols()

此方法返回矩陣的列數。

4

int rows()

此方法返回矩陣的行數。

5

Mat setTo(Mat value)

此方法接受Mat型別的物件,並將陣列元素設定為指定的值。

6

Mat setTo(Scalar s)

此方法接受Scalar型別的物件,並將陣列元素設定為指定的值。

建立和顯示矩陣

在本節中,我們將討論我們的第一個 OpenCV 示例。我們將瞭解如何建立和顯示一個簡單的 OpenCV 矩陣。

以下是使用 OpenCV 建立和顯示矩陣的步驟。

步驟 1:載入 OpenCV 原生庫

使用 OpenCV 庫編寫 Java 程式碼時,第一步需要使用loadLibrary()載入 OpenCV 的原生庫。如下所示載入 OpenCV 原生庫。

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

步驟 2:例項化 Mat 類

使用本章前面提到的任何函式例項化 Mat 類。

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

步驟 3:使用方法填充矩陣

您可以透過將索引值傳遞給row()/col()方法來檢索矩陣的特定行/列。

並且,您可以使用setTo()方法的任何變體為這些設定值。

//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));

示例

您可以使用以下程式程式碼在 Java 中使用 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()); 
   } 
}

執行上述程式後,您將獲得以下輸出:

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]

使用 JavaSE API 載入影像

java.awt.image.BufferedImage包的BufferedImage類用於儲存影像,import javax.imageio包的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

如果您開啟指定的路徑,您可以觀察到儲存的影像如下:

Loading Image using JavaSE API
廣告