OpenCV-Java版学习(2.图像入门)
前言
上一篇博客我们讲了如何在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"之后灰度模式的图像就被保存到相对应路径下了。
相关文章:

两个数组找不同
<script> function subArr(a, b) { return a.filter(function(i) { return b.indexOf(i) -1 }) } console.log(subArr([1,2,3,4],[3,4,5])); </script>转载于:https://www.cnblogs.com/mouse2417/p/5165391.html

jQuery Mobile设置边距的宽度和颜色
border-top:10px solid #EFEFF4"
2021全国高校计算机能力挑战赛(初赛)Java试题四
某游戏公司设计了一个奖励活动,给N个用户(1<N<10^7)连续编号为1到N,依据用户的编号S发放奖励。 import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {Scann…

Blender与UE5完美结合全流程创作游戏资产视频教程
Blender到虚幻引擎5 Blender to Unreal Engine 5 MP4 |视频:h264,1280720 |音频:AAC,44100 Hz 语言:英语中英文字幕(根据原英文字幕机译更准确) |大小:18.4 GB |时长:20h 55m 只有视频课程 无素材文件 你想学习如何…

OpenCV-Java版学习(3.对视频的基本操作)
前言 上一节我们学习了使用OpenCV对图像进行一些基础操作,现在我们学习对视频进行一些基础的操作。 对视频的基本操作 从相机中读取视频 我们从电脑自带的摄像头捕捉一段视频并在屏幕上显示出来,代码如下: import org.junit.jupiter.api…

win7如何设置某个软件不弹出用户账户控制
手动修改注册表: 在 HKEY_CURRENT_USERS\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 键下面新建值,值的名字是程序的全路径,值数据是“RunAsInvoker”。 该程序在没有修改系统文件或设置的情况下不会弹出用户帐户控…

IDEA热部署基于maven的web项目
第一步:首先先创建web项目 按照向导一步一步完成项目创建,我创建的示例项目为hotdeploddemo 第二步:设置项目的web资源 下图中的路径要修改正确,指向src/main/webapp/WEB-INF下面的web.xml,然后点击右下角的fix创建artifacts 第三…

2021全国高校计算机能力挑战赛(初赛)C语言试题一
输入两个整数x,y,输出x,y中各位数重新组合的可能形成最小的数。 #include <stdio.h>int main() {int n1, n2, tmp;int s[10000];int i 0;scanf("%d %d", &n1, &n2);while (n1 ! 0) {s[i] n1 % 10;i;n1 n1 / 10;}while (n2 ! 0) {s[i] n…

Unity创建游戏VFX视觉特效-初级到中级
MP4 |视频:h264,1280720 |音频:AAC,44100 Hz 语言:英语中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.36 GB |时长:4h 17m 本课程是关于用Unity视觉效果图为游戏创建VFX。 你将从零开始学习VFX图形࿰…

关于object references an unsaved transient instance - save the transient instance before flushing的解决方法
关于object references an unsaved transient instance - save the transient instance before flushing的解决方法 异常信息 object references an unsaved transient instance - save the transient instance before flushing : com.gcl.demo.entity.Borrow.member -> c…

Java——Math类
Java中的Math类包含了基本的数学运算方法。下面将从以下几部分进行讲解。debug后发现,常量E和常量PI均为double类型。

SpringMVC工作环境搭建 配置文件
web.xml配置 在服务器端容器启动之前加载配置文件的顺序:context-param>listener>filter>servlet //容器配置application上下文的时候加载的文件 //这是spring容器的配置文件 <context-param> <param-name>contextConfigLocation</param-na…

@SuppressWarnings注解详细解析
注解屏蔽一些错误警告,但不是代码错误,这个注解可以提高代码的安全性,防止为了解决这个错误警告而造成不可估量的后果。

Oracle timestamp 转换 date
2019独角兽企业重金招聘Python工程师标准>>> --第一种 select dt0 from table--第二种 select cast(dt as date) from table 转载于:https://my.oschina.net/chenhao901007/blog/383345

2021全国高校计算机能力挑战赛(初赛)C语言试题二
写一个程序统计从1到N这N个数中,以下三个条件至少满足之一的数字x个数。 #include <stdio.h>int isprime(int m) {int f 1;for (int i 2; i < m / 2; i) {if (m % i 0) {f 0;break;}}return f; }int isse(int m) {int f 1;if (m % 7 ! 0)f 0;return …

用Sketchup和Vray学习室内设计
MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz 语言:英语中英文字幕(根据原英文字幕机译更准确) |大小解压后:7 GB 含课程文件 |时长:10h 18m 3D设计入门指南 你会学到什么 学习高效建模所需的Sketchup技能。 了解虚拟…

Android 悬浮窗口
Android 悬浮窗口 一.创建悬浮窗口步骤 1.实现一个ViewGroup类,作为悬浮窗口的界面类,以便在里面重写onInterceptTouchEvent和onTouchEvent方法,实现移动界面的目的. 在本例中实现了一个FloatLayer类,可以作为通用的类,使用时需要传入WindowManager对象以实现移动窗口…

Java多线程复习:1(进程和线程、并发和并行)
进程和线程 进程 我们电脑中每一个运行着的程序都是一个进程,程序一旦运行就是进程。 进程可以视为程序的一个实例,大部分程序可以同时运行多个实例进程(如:浏览器、记事本、画图等),也有的程序只能启动一…

新年新技术:MongoDB 3.0
前一篇介绍了HTTP/2,这一篇简单介绍下3月3号发布的MongoDB 3.0。 What’s new in MongoDB 3.0? 新的存储引擎WiredTiger MongoDB 3.0的存储引擎是插件式的,默认为新增的WiredTiger。WiredTiger相比原来的MMAPv1引擎的优点: 文档级别的锁这个…

2021全国高校计算机能力挑战赛(初赛)C语言试题四
肯德基有一种奇怪的优惠券,卷上的金额都是整数。活动要求找到3张优惠券总额恰好是商品本身。 #include<stdio.h> int main() {int p,n,f0,temp0;scanf("%d %d",&p,&n);int a[10000];for (int i 0; i < n; i) {scanf("%d",&am…

Substance Painter实时角色制作视频教程
持续时间2h 包含项目文件 1920X1080 MP4 语言:英语中文字幕(机译) 大小:5.63G Substance Painter实时角色制作视频教程 信息: 本教程旨在为一个实时角色解决实体画师中纹理化现实人类皮肤的奥秘! 在这个2小时的全叙述…

Java多线程复习:2(线程的创建和使用)
线程的创建和使用 方法一,直接使用Thread import lombok.extern.slf4j.Slf4j; /*** author:小关同学爱吃汉堡* date: 2021/4/1 23:27*/ Slf4j(topic "c.Test1") public class Test1 {public static void main(String[] args) {//以匿名内部…

Apache htaccess 重写假设文件存在!
假设文件 data/cache/index.html 存在。那么才重写。否则使用默认的MVC 重写。by default.fufoxmail.com RewriteEngine on RewriteCond %{DOCUMENT_ROOT}/data/cache/list_1.html -f RewriteRule ^game\/?$ data/cache/list_1.html [L] RewriteCond %{REQUEST_FILENAME} !-f …

Xamarin只言片语系列
把自己写xamarin中的一些知识点记录下来,分享给大家,欢迎指正。Xamarin只言片语1——Xamarin下的弹框Xamarin只言片语2——Xamarin下的web api操作更新中……

2021全国高校计算机能力挑战赛(初赛)C语言
3-2空间中有N个顶点(顶点坐标用x,y,z表示),从中找出能构成三角形图形的最大面积,输出该面积。 #include<stdio.h> #include<math.h> int main() {int n,m0;double a,b,c,p,res[1000],s[1000][3];scanf("%d"…

藤摇椅游戏道具制作全流程讲解视频教程
藤摇杆|一个完整的游戏资产工作流程 MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 含工程素材 语言:英语中文字幕(根据原英文字幕机译更准确)原英文字幕 |时长:25节课(9h 57m) |大小:8.35 GB 通过模拟游…

SpringBoot复习:2(@Configuration注解)
Configuration注解 Configuration注解的作用是代替以前我们使用的xml配置文件,被注解的类就是配置类,其内部包含有一个或多个被Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类…

C/C++中constkeyword
今天在做一个趋势笔试题的时候。才让我有了系统把constkeyword好好总结一下的冲动,由于这个关键词大大小小好多地方都出现过,出现频率很高,而每次仅仅是简短的把答案看了一下,没有真正将其整个使用方法弄透,立即要找工…

hdu5185 dp:和为n且满足后一项是前一项或者+1的数列个数
其实是很裸的dp,竟然放在第四题 dp[i][j]表示当前放j和为i的方案数 dp[0][0]1; dp[i][j]dp[i-j][j-1]dp[i-j][j]; 1 #include<stdio.h>2 #include<string.h>3 #include<math.h>4 #include<algorithm>5 using namespace std;6 int dp[50005]…

2021全国高校计算机能力挑战赛(决赛)Java
计算奖品价格标准差 import java.util.*;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n in.nextInt();float sum0;int total_n0;int[] numnew int[10];float[] prinew float[10];for (int i 0; i <n ; i) {num[i…