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
广告