前言

上一篇博客我们讲了如何在IDEA中使用OpenCV来进行一些简单的图像操作,这节我们来学习图像的一些基本的入门级操作。

图像入门

一.在Java中使用OpenCV注意事项

1.解决awt报错问题

先给大家贴个错误,如下图:

我们在使用awt处理图像的时候报了这个异常,HeadlessException 异常是在环境中不支持键盘、显示器或鼠标的环境中调用与键盘、显示器或鼠标有关的代码时,被抛出的异常。
网上有几种解决方法,比较方便的一种解决方法如下:

System.setProperty("java.awt.headless", "false");

这段代码激活了Headless模式,Headless模式是系统的一种配置模式。在该模式下,系统缺少了显示设备、键盘或鼠标。
这段代码相当于告诉程序,现在你要工作在Headless模式下,就不要指望硬件帮忙了,你得自力更生,依靠系统的计算能力模拟出这些特性来。

2.加载动态库

这里我们在Java中调用一下dll就行了,如下:

 URL url = ClassLoader.getSystemResource("lib/opencv/opencv_java451.dll");//这里的dll根据你自己的实际情况写System.load(url.getPath());

二.读取图像和显示图像

在OpenCV中我们可以使用imread()函数来进行图像的读取。图像的工作目录或图像的完整路径应给出。
该函数的定义如下:

static Mat imread(String filename)
static Mat imread(String filename, int flags)

flags是一个标志,它表示以何种方式来读取图像,它有常用的3个值,如下:

  • IMREAD_COLOR = 1:加载彩色图像。任何图像的透明度都会被忽视。它是默认标志;
  • IMREAD_GRAYSCALE = 0:以灰度模式加载图像;
  • IMREAD_UNCHANGED = -1:加载图像,包括alpha通道。

当然我们也可以在源码中查看其他的值,如下:

在OpenCV中我们可以使用imshow()函数来在窗口中显示图像,窗口自动适应图像的尺寸,该函数使用如下:

public static void imshow(String winname, Mat img);

第一个参数是窗口名称,它是一个字符串。第二个参数是我们读取图片的对象。

图像读取和显示的代码如下:

import org.junit.jupiter.api.Test;
import org.opencv.core.Mat;
import org.springframework.boot.test.context.SpringBootTest;import java.net.URL;import static org.opencv.highgui.HighGui.*;
import static org.opencv.imgcodecs.Imgcodecs.imread;@SpringBootTest
class DemoApplicationTests {@Testpublic void testOpencv1() throws Exception {// 解决awt报错问题System.setProperty("java.awt.headless", "false");// 加载动态库URL url = ClassLoader.getSystemResource("lib/opencv/opencv_java451.dll");System.load(url.getPath());// 读取图像,以彩色模式(1)显示,0是灰度模式,-1是加载图像,包括alpha通道Mat src = imread("D:\\OpenCV_Study\\demo1\\src\\main\\resources\\image\\test1.jpg",1);if (src.empty()) {throw new Exception("image is empty");}imshow("image",src);waitKey(0);destroyAllWindows();}
}

读取彩色图像:

灰度模式读取图像:

加载图像,包括alpha通道:

上面的那段代码中有两个函数大家这里还需要讲一下:

  • waitKey()函数:
    该函数是一个键盘绑定函数。其参数是以毫秒为单位的时间。该函数等待任何键盘事件指定的毫秒。如果您在这段时间内按下任何键,程序将继续运行。如果0被传递,它将无限期地等待一次敲击键。它也可以设置为检测特定的按键。
    该函数的定义如下:
public static void waitKey();
public static int waitKey(int delay);

从源码中我们可以看到waitKey()函数还有一个重载函数,其默认值为0,如下图:

所以我们写不写0都无所谓…吧

  • destroyAllWindows()函数
    从该函数的字面意思我们就可以知道,该函数会破坏我们创建的所有窗口

关于窗口
我们可以创建一个空窗口,然后再将图像加载到该窗口。在这种情况下,我们可以指定窗口是否可调整大小。这是通过函数namedWindow()来完成的。
该函数的定义:

public static void namedWindow(String winname);
public static void namedWindow(String winname, int flag);

flag默认情况下是WINDOW_AUTOSIZE,此时不能调整窗口的大小,但是,如果指定为WINDOW_NORMAL,则
可以调整窗口大小

代码如下:

import org.junit.jupiter.api.Test;
import org.opencv.core.Mat;
import org.springframework.boot.test.context.SpringBootTest;import java.net.URL;import static org.opencv.highgui.HighGui.*;
import static org.opencv.imgcodecs.Imgcodecs.imread;@SpringBootTest
class DemoApplicationTests {@Testpublic void testOpencv2() throws Exception{System.setProperty("java.awt.headless","false");URL url = ClassLoader.getSystemResource("lib/opencv/opencv_java451.dll");System.load(url.getPath());Mat image = imread("D:\\OpenCV_Study\\demo1\\src\\main\\resources\\image\\test1.jpg",1);if (image.empty()){throw new Exception("image is empty");}//这里我们创建了两个窗口,一个叫imag1,一个叫imag2,他们分别是可以调整窗口大小和不可以调整窗口大小namedWindow("imag1",WINDOW_NORMAL);        //可以调整窗口大小namedWindow("imag2",WINDOW_AUTOSIZE);   //不可以调整窗口大小//将图像加载进窗口,分别显示这两个窗口imshow("imag1",image);imshow("imag2",image);waitKey();destroyAllWindows();}
}

三.保存图像

我们可以使用函数imwrite()来保存图像,该函数定义如下:

public static boolean imwrite(String filename, Mat img);

第一个参数是文件名(得包含文件路径),第二个参数是要保存的图像。
代码示例如下:

import org.junit.jupiter.api.Test;
import org.opencv.core.Mat;
import org.springframework.boot.test.context.SpringBootTest;import java.net.URL;import static org.opencv.highgui.HighGui.*;
import static org.opencv.imgcodecs.Imgcodecs.imread;
import static org.opencv.imgcodecs.Imgcodecs.imwrite;@SpringBootTest
class DemoApplicationTests {@Testpublic void testOpencv3() throws Exception{System.setProperty("java.awt.headless","false");URL url = ClassLoader.getSystemResource("lib/opencv/opencv_java451.dll");System.load(url.getPath());Mat image = imread("D:\\OpenCV_Study\\demo1\\src\\main\\resources\\image\\test1.jpg",0);if (image.empty()){throw new Exception("image is empty");}imshow("image",image);//此处设置为检测特定的按键int flag = waitKey(0);if (flag==27){destroyAllWindows();}else if (flag==83){imwrite("D:\\OpenCV_Study\\demo1\\src\\main\\resources\\image\\test2.jpg",image);destroyAllWindows();}}
}

上面这段代码中我们将结束事件设置为检测特定的按键,即按了Esc键(值为23)就直接销毁窗口退出程序,按了"s"键(值为83)就保存灰度模式的图片。
结果:

可以看到,我们在键盘上按了"s"之后灰度模式的图像就被保存到相对应路径下了。

OpenCV-Java版学习(2.图像入门)相关推荐

  1. OpenCV与图像处理学习一——图像基础知识、读入、显示、保存图像、灰度转化、通道分离与合并

    OpenCV与图像处理学习一--图像基础知识.读入.显示.保存图像.灰度转化.通道分离与合并 一.图像基础知识 1.1 数字图像的概念 1.2 数字图像的应用 1.3 OpenCV介绍 二.图像属性 ...

  2. 20165234 [第二届构建之法论坛] 预培训文档(Java版) 学习总结

    [第二届构建之法论坛] 预培训文档(Java版) 学习总结 我通读并学习了此文档,并且动手实践了一遍.以下是我学习过程的记录~ Part1.配置环境 配置JDK 原文中提到了2个容易被混淆的概念 JD ...

  3. OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)

    OpenCV与图像处理学习八--图像边缘提取(Canny检测代码) 一.图像梯度 1.1 梯度 1.2 图像梯度 二.梯度图与梯度算子 2.1模板卷积 2.2 梯度图 2.3 梯度算子 2.3.1 R ...

  4. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

    OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...

  5. OpenCV与图像处理学习五——图像滤波与增强:线性、非线性滤波、直方图均衡化与Gamma变换

    OpenCV与图像处理学习五--图像滤波与增强:线性.非线性滤波.直方图均衡化与Gamma变换 三.图像滤波与增强 3.1 线性滤波 3.1.1 方框滤波 3.1.2 均值滤波 3.1.3 高斯滤波 ...

  6. OpenCV与图像处理学习二——图像直方图与色彩空间

    OpenCV与图像处理学习二--图像直方图与色彩空间 2.4 图像直方图(Image Histogram) 2.4.1 直方图的绘制 2.4.2 三通道直方图绘制 2.5 颜色空间 2.5.1 RGB ...

  7. java和python自学教程_适合 Java开发者学习的Python 入门教程—文海思创

    原标题:适合 Java开发者学习的Python 入门教程-文海思创 [文海思创讯]在Java文章频道里,我们大部分人应该对该语言都非常的了解,而且在该生态圈内至少已经呆了好几年了.这让我们有常规和专业 ...

  8. Java版AVG游戏开发入门示例 3 ——脚本引擎的制作及应用

    源码下载地址:http://code.google.com/p/loon-simple/downloads/list 根据wikipedia的解释:脚本语言(Script language,scrip ...

  9. Java版AVG游戏开发入门示例[3]——脚本引擎的制作及应用

    源码下载地址:http://code.google.com/p/loon-simple/downloads/list 根据wikipedia的解释:脚本语言(Script language,scrip ...

  10. 36篇博文带你学完opencv :python+opencv进阶版学习笔记目录

    基础版学习笔记传送门 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版) 进阶版笔记 项目 opencv进阶学习笔记1: 调用摄像头用法大全(打开摄像头,打开摄像 ...

最新文章

  1. 中国电子学会青少年编程能力等级测试图形化一级编程题:海底世界
  2. 会说话的狗狗本电脑版_会说话的电脑有点酷!惠普星14帮你解锁“偷懒”新姿势_惠普 星 14 2020(i5 1135G7/16GB/512GB/MX450)_笔记本新闻...
  3. 是否可以将Java 8用于Android开发?
  4. 【组合数学】生成函数 ( 性质总结 | 重要的生成函数 ) ★
  5. Dataset之Rotten Tomatoes:Rotten Tomatoes影评数据集简介、下载、使用方法之详细攻略
  6. WinAPI: waveInMessage - 向波形输入设备发送一条消息
  7. new和delete创建和销毁二维数组
  8. WPF高性能绘图之DrawingCanvas、DrawingVisual、Button的同时使用
  9. nps内网端口映射,含(p2p配置方法)
  10. 借助JavaCV实现android手机查看PC摄像头实时视频
  11. Shader初级(纹理坐标篇)
  12. h3c服务器系统丢失,某局点H3C FlexServer R390服务器阵列失败数据丢失的经验案例...
  13. 该文件包与具有同一名称的现有文件包存在冲突
  14. SRS 代码分析【HLS切片】
  15. 【笔记】在 Windows 中制作 Ubuntu 系统的USB启动盘
  16. 青龙面板使用扩展 聚看点
  17. wpf mvc_使用BabySmash学习WPF-MVC或MVP以及设计者的好处
  18. 监控摄像机常用专业术语解释(一)
  19. 安东尼奥尼.中国.有意思镜头.2
  20. CH9141蓝牙模块与STM32F1无法通信的问题

热门文章

  1. Linux下系统性能检测利器dstat
  2. 读书:历史 -- 百年战争简史
  3. 吴裕雄--天生自然 高等数学学习:高阶偏导数
  4. 【Java_基础】Java中Native关键字的作用
  5. windows常用命令有哪些(整理)
  6. Linux篇---ftp服务器的搭建
  7. mac 使用homebrew 安装mysql
  8. 《梦断代码Dreaming In Code》阅读笔记(三)
  9. Android include 标签
  10. SQL SERVER 获取表结构信息《转载》