OpenCV - Lưu trữ hình ảnh
Để chụp ảnh, chúng tôi sử dụng các thiết bị như máy ảnh và máy quét. Các thiết bị này ghi lại các giá trị số của hình ảnh (Ví dụ: giá trị pixel). OpenCV là một thư viện xử lý hình ảnh kỹ thuật số, do đó chúng ta cần lưu trữ những hình ảnh này để xử lý.
Các Matlớp của thư viện OpenCV được sử dụng để lưu trữ các giá trị của một hình ảnh. Nó đại diện cho một mảng n chiều và được sử dụng để lưu trữ dữ liệu hình ảnh có thang độ xám hoặc hình ảnh màu, khối lượng voxel, trường vectơ, đám mây điểm, tensor, biểu đồ, v.v.
Lớp này bao gồm hai phần dữ liệu: header và một pointer
Header - Chứa thông tin như kích thước, phương pháp được sử dụng để lưu trữ và địa chỉ của ma trận (kích thước không đổi).
Pointer - Lưu trữ các giá trị pixel của hình ảnh (Luôn thay đổi).
Lớp Mat
Thư viện OpenCV Java cung cấp lớp này có cùng tên (Mat) trong gói org.opencv.core.
Người xây dựng
Lớp Mat của thư viện Java OpenCV có nhiều hàm tạo khác nhau, bạn có thể sử dụng nó để tạo đối tượng Mat.
S. không | Trình tạo và mô tả |
---|---|
1 |
Mat() Đây là hàm tạo mặc định không có tham số trong hầu hết các trường hợp. Chúng tôi sử dụng hàm này để tạo ra một ma trận trống và chuyển nó cho các phương thức OpenCV khác. |
2 |
Mat(int rows, int cols, int type) Hàm tạo này chấp nhận ba tham số kiểu số nguyên đại diện cho số hàng và cột trong một mảng 2D và kiểu của mảng (được sử dụng để lưu trữ dữ liệu). |
3 |
Mat(int rows, int cols, int type, Scalar s) Bao gồm các tham số của cái trước, hàm tạo này cũng chấp nhận một đối tượng của lớp Scalar làm tham số. |
4 |
Mat(Size size, int type) Hàm tạo này chấp nhận hai tham số, một đối tượng đại diện cho kích thước của ma trận và một số nguyên đại diện cho kiểu của mảng được sử dụng để lưu trữ dữ liệu. |
5 |
Mat(Size size, int type, Scalar s) Bao gồm các tham số của cái trước, hàm tạo này cũng chấp nhận một đối tượng của lớp Scalar làm tham số. |
6 | Mat(long addr) |
7 |
Mat(Mat m, Range rowRange) Hàm tạo này chấp nhận một đối tượng của một ma trận khác và một đối tượng của lớp Phạm vi đại diện cho phạm vi của các hàng được sử dụng để tạo một ma trận mới. |
số 8 |
Mat(Mat m, Range rowRange, Range colRange) Bao gồm các tham số của cái trước, hàm tạo này chấp nhận thêm một đối tượng của lớp. Phạm vi đại diện cho phạm vi cột. |
9 |
Mat(Mat m, Rect roi) Hàm tạo này chấp nhận hai đối tượng, một đối tượng đại diện cho ma trận khác và đối tượng kia đại diện cho Region Of Iquan tâm. |
Note -
Kiểu mảng. Sử dụng CV_8UC1, ..., CV_64FC4 để tạo ma trận 1-4 kênh hoặc CV_8UC (n), ..., CV_64FC (n) để tạo ma trận đa kênh (tối đa kênh CV_CN_MAX).
Loại ma trận được đại diện bởi các trường khác nhau của lớp CvType cái nào thuộc về gói org.opencv.core.
Phương pháp và Mô tả
Sau đây là một số phương thức được cung cấp bởi lớp Mat.
S. không | Phương pháp và Mô tả |
---|---|
1 |
Mat col(int x) Phương thức này chấp nhận một tham số nguyên đại diện cho chỉ số của một cột và truy xuất và trả về cột đó. |
2 |
Mat row(int y) Phương thức này chấp nhận một tham số nguyên đại diện cho chỉ số của một hàng và truy xuất và trả về hàng đó. |
3 |
int cols() Phương thức này trả về số cột trong ma trận. |
4 |
int rows() Phương thức này trả về số hàng trong ma trận. |
5 |
Mat setTo(Mat value) Phương thức này chấp nhận một đối tượng của Mat gõ và đặt các phần tử mảng thành giá trị được chỉ định. |
6 |
Mat setTo(Scalar s) Phương thức này chấp nhận một đối tượng của Scalar gõ và đặt các phần tử mảng thành giá trị được chỉ định. |
Tạo và hiển thị ma trận
Trong phần này, chúng ta sẽ thảo luận về ví dụ OpenCV đầu tiên của chúng ta. Chúng ta sẽ xem cách tạo và hiển thị một ma trận OpenCV đơn giản.
Dưới đây là các bước cần thực hiện để tạo và hiển thị ma trận trong OpenCV.
Bước 1: Tải thư viện gốc OpenCV
Trong khi viết mã Java bằng thư viện OpenCV, bước đầu tiên bạn cần làm là tải thư viện gốc của OpenCV bằng cách sử dụng loadLibrary(). Tải thư viện gốc OpenCV như hình dưới đây.
//Loading the core library
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Bước 2: Khởi tạo lớp Mat
Khởi tạo lớp Mat bằng cách sử dụng bất kỳ hàm nào được đề cập trong chương này trước đó.
//Creating a matrix
Mat matrix = new Mat(5, 5, CvType.CV_8UC1, new Scalar(0));
Bước 3: Điền vào ma trận bằng các phương pháp
Bạn có thể truy xuất các hàng / cột cụ thể của ma trận bằng cách chuyển các giá trị chỉ mục cho các phương thức row()/col().
Và, bạn có thể đặt các giá trị cho các giá trị này bằng cách sử dụng bất kỳ biến thể nào của setTo() các phương pháp.
//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
Bạn có thể sử dụng mã chương trình sau để tạo và hiển thị một ma trận đơn giản trong Java bằng thư viện 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());
}
}
Khi thực hiện chương trình trên, bạn sẽ nhận được kết quả sau:
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]
Tải hình ảnh bằng API JavaSE
Các BufferedImage lớp của java.awt.image.BufferedImage gói được sử dụng để lưu trữ hình ảnh và ImageIO lớp của gói import javax.imageio cung cấp các phương pháp đọc và ghi Hình ảnh.
Example
Bạn có thể sử dụng mã chương trình sau để tải và lưu ảnh bằng thư viện 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");
}
}
Khi thực hiện chương trình trên, bạn sẽ nhận được kết quả sau:
image Saved
Nếu bạn mở đường dẫn được chỉ định, bạn có thể quan sát hình ảnh đã lưu như sau: