本节将简单介绍读取图像、显示图像、保存图像这几项基本操作。

本文使用代码如下:

import org.junit.Test;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

import java.net.URL;

import static org.opencv.highgui.HighGui.*;

public class Demo {

    static {
        // 加载动态库
        URL url = ClassLoader.getSystemResource("lib/opencv/opencv_java3416.dll");
        System.load(url.getPath());
    }

    /**
     * 图像的加载、显示以及保存
     */
    @Test
    public void demo() throws Exception {

        // 加载图像
        Mat imread = Imgcodecs.imread("src/main/resources/img/lena.png");
        if (imread.empty()) {
            throw new Exception("image is empty");
        }

        //显示图像
        imshow("original img", imread);

        //保存图像
        Imgcodecs.imwrite("D:/lena_2.png", imread);

        Mat greyMat = Imgcodecs.imread("D:/lena_2.png", Imgcodecs.IMREAD_GRAYSCALE);
        imshow("wirtted Img show by grey", greyMat);

        waitKey();
        destroyAllWindows();
    }
}

开源 java图片处理 java图像处理:基于opencv与jvm_加载

        代码运行成功后会先读取 resources/img 文件夹下的 lena.png 图片,并在窗口打开(窗口名称为original img),之后会将图片的副本存至 D:/lena_2.png,然后再读取 D:/lena_2.png 图片,并将图像转为单通道灰度图像在窗口打开(窗口名称为wirtted Img show by grey)


OpenCV官方JavaAPI: OpenCV Java documentation (4.2.0)

 

1. 读取图像

        imread()函数:OpenCV提供了 imread()函数 来读取图像,该函数支持各种静态图像格式。该函数的语法格式为:

static Mat

imread(java.lang.String filename)

static Mat

imread(java.lang.String filename, int flags)

式中 :

  • Mat:返回值,为读取到的图像。如果未读取到图像,则返回NULL
  • filename:要读取的图像的完整文件名
  • flages:读取标记,即:图像读取模式 ImreadModel),用来控制读取文件的类型,取值如下:

图像读取模式 ImreadModel

数值

含义

IMREAD_UNCHANGED

-1

按原样返回加载的图像(会带上alpha通道),忽略EXIF方向。

IMREAD_GRAYSCALE

0

将图像转为单通道灰度图像

IMREAD_COLOR

1

将图像转为BGR三通道彩色图像(默认值)

IMREAD_ANYDEPTH

2

如果图像深度为16-bit/32-bit则会返回该深度图像,否则返回8-bit图像

IMREAD_ANYCOLOR

4

按照任何可能的颜色格式读取图像

IMREAD_LOAD_GDAL

8

使用gdal驱动程序加载图像

IMREAD_REDUCED_GRAYSCALE_2

16

将图像转为单通道灰度图,且图像尺寸变为1/2

IMREAD_REDUCED_COLOR_2

17

将图像转为BGR三通道彩色图像,且图像尺寸变为1/2

IMREAD_REDUCED_GRAYSCALE_4

32

将图像转为单通道灰度图,且图像尺寸变为1/4

IMREAD_REDUCED_COLOR_4

33

将图像转为BGR三通道彩色图像,且图像尺寸变为1/4

IMREAD_REDUCED_GRAYSCALE_8

64

将图像转为单通道灰度图,且图像尺寸变为1/8

IMREAD_REDUCED_COLOR_8

65

将图像转为BGR三通道彩色图像,且图像尺寸变为1/8

IMREAD_IGNORE_ORIENTATION

128

忽略EXIF中的方向标识,不旋转图

 

2. 显示图像 

        imshow()函数:OpenCV提供了 imshow()函数 来显示图像。直接调用该函数会创建一个指定名称的新窗口,并将图像显示在刚创建的窗口内。

static void

imshow(java.lang.String winname, Mat

式中:

  • winname:窗口名称
  • img:要显示的图像。

3. 保存图像 

        imwrite()函数:OpenCV提供了 imwrite()函数 来保存图像至指定位置。

static boolean

imwrite(java.lang.String filename, Mat

static boolean

imwrite(java.lang.String filename, Mat img, MatOfInt

式中:

  • filename:要保存的目标文件的完整路径名,包含文件扩展名。
  • img:被保存图像的名称。
  • params:保存类型参数。
  • 返回值:如果保存成功,则返回True;如果保存不成功,则返回False。

4. 其他涉及到的函数

4.1 waitKey函数

        waitKey()用来等待按键,当用户按下键盘后,该语句会被执行,并获取返回值。

static void

waitKey()

static int

waitKey(int delay)

式中: 

  • delay:表示等待键盘触发的时间,单位是ms。当该值是负数或者零时,表示无限等待。该值默认为0。
  • 返回值:若等待键盘触发的时间到期时,仍没有按键被按下,则返回-1;如果在等待期间有按键被按下,则返回该按键的ASCII码

4.2 destroyWindow函数

        destroyWindow()用来释放(销毁)指定窗口。

static void

destroyWindow(java.lang.String winname)

式中: 

  • winname:窗口的名称

 

4.3 destroyAllWindows函数

        destroyAllWindows用来释放(销毁)所有窗口。

static void

destroyAllWindows()