OpenCV - 存储图像


为了捕捉图像,我们使用相机和扫描仪等设备。这些设备记录图像的数值(例如:像素值)。OpenCV是一个处理数字图像的库,因此我们需要存储这些图像进行处理。

OpenCV库的Mat用于存储图像的值。它表示一个n维数组,用于存储灰度或彩色图像、体素体积、向量场、点云、张量、直方图等图像数据。

该类由两个数据部分组成:标头指针

  • 标头- 包含矩阵的大小、存储方法和地址(大小恒定)等信息。

  • 指针- 存储图像的像素值(不断变化)。

垫子课

OpenCV Java 库在包org.opencv.core中提供了具有相同名称 ( Mat )的此类。

构造函数

OpenCV Java库的Mat类有各种构造函数,您可以使用它们构造Mat对象。

序列号 构造函数和描述
1

垫()

在大多数情况下,这是不带参数的默认构造函数。我们使用它来构造函数创建一个空矩阵并将其传递给其他 OpenCV 方法。

2

Mat(int 行, int 列, int 类型)

此构造函数接受三个整数类型参数,表示二维数组中的行数和列数以及数组的类型(用于存储数据)。

3

Mat(int 行, int 列, int 类型, 标量)

包括前一个构造函数的参数,这个构造函数还接受一个 Scalar 类的对象作为参数。

4

Mat(尺寸大小,int类型)

该构造函数接受两个参数,一个表示矩阵大小的对象和一个表示用于存储数据的数组类型的整数。

5

Mat(尺寸大小,int类型,标量s)

包括前一个构造函数的参数,这个构造函数还接受一个 Scalar 类的对象作为参数。

6

垫(长地址)

7

Mat(Mat m, 范围 rowRange)

该构造函数接受另一个矩阵的对象和 Range 类的对象,该对象表示创建新矩阵所需的行范围。

8

Mat(Mat m, 范围 rowRange, 范围 colRange)

包括前一个构造函数的参数,该构造函数还接受该类的一个对象。Range 表示列范围。

9

Mat(Mat m, 矩形 roi)

该构造函数接受两个对象,一个代表另一个矩阵,另一个代表感兴趣区域。

注意-

  • 数组类型。使用 CV_8UC1, ..., CV_64FC4 创建 1-4 通道矩阵,或使用 CV_8UC(n), ..., CV_64FC(n) 创建多通道(最多 CV_CN_MAX 个通道)矩阵。

  • 矩阵的类型由属于org.opencv.core包的CvType类的各个字段表示。

方法和说明

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

序列号 方法和说明
1

垫列(int x)

此方法接受表示列索引的整数参数,并检索并返回该列。

2

垫子行(int y)

此方法接受表示行索引的整数参数,并检索并返回该行。

3

int 列()

此方法返回矩阵中的列数。

4

int 行()

此方法返回矩阵中的行数。

5

Mat setTo(Mat 值)

此方法接受Mat类型的对象并将数组元素设置为指定值。

6

Mat setTo(标量 s)

此方法接受标量类型的对象并将数组元素设置为指定值。

创建和显示矩阵

在本节中,我们将讨论第一个 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));

例子

您可以使用以下程序代码使用 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]

使用 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

如果打开指定的路径,您可以观察保存的图像,如下所示 -

使用 JavaSE API 加载图像