服务器之家

服务器之家 > 正文

详解OpenCV For Java环境搭建与功能演示

时间:2021-04-19 14:14     来源/作者:gloomyfish

opencv概述

opencv做为功能强大的计算机视觉开源框架,包含了500多个算法实现,而且还在不断增加,其最新版本已经更新到3.2。其sdk支持android与java平台开发,对于常见的图像处理需求几乎都可以满足,理应成为广大java与android程序员的首先的图像处理框架。java中使用opencv的配置及其简单,可以毫不客气的说几乎是零配置都可以。

一:配置

配置引入opencv相关jar包,首先要下载opencv的自解压版本,下载地址:http://opencv.org/opencv-3-2.html

然后拉到网页的最下方,下载windows自解压开发包

详解OpenCV For Java环境搭建与功能演示

下载好了双击解压缩之后找到build路径,显示如下:

详解OpenCV For Java环境搭建与功能演示

双击打开java文件夹,

详解OpenCV For Java环境搭建与功能演示

里面有一个jar直接导入到eclipse中的新建项目中去, 然后把x64里面的dll文件copy到eclipse中使用的java jdk bin和jre/bin目录下面即可。环境就配置好啦,简单吧!配置好的最终项目结构:

详解OpenCV For Java环境搭建与功能演示

二:加载图像与像素操作

读入一张图像 -, 一句话搞定

?
1
2
mat src = imgcodecs.imread(imagefilepath);
if(src.empty()) return;

将mat对象转换为bufferedimage对象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public bufferedimage conver2image(mat mat) {
 int width = mat.cols();
 int height = mat.rows();
 int dims = mat.channels();
 int[] pixels = new int[width*height];
 byte[] rgbdata = new byte[width*height*dims];
 mat.get(0, 0, rgbdata);
 bufferedimage image = new bufferedimage(width, height,
       bufferedimage.type_int_argb);
 int index = 0;
 int r=0, g=0, b=0;
 for(int row=0; row<height; row++) {
  for(int col=0; col<width; col++) {
   if(dims == 3) {
    index = row*width*dims + col*dims;
    b = rgbdata[index]&0xff;
    g = rgbdata[index+1]&0xff;
    r = rgbdata[index+2]&0xff;
    pixels[row*width+col] = ((255&0xff)<<24) |
    ((r&0xff)<<16) | ((g&0xff)<<8) | b&0xff;
   }
   if(dims == 1) {
    index = row*width + col;
    b = rgbdata[index]&0xff;
    pixels[row*width+col] = ((255&0xff)<<24) |
    ((b&0xff)<<16) | ((b&0xff)<<8) | b&0xff;
   }
  }
 }
 setrgb( image, 0, 0, width, height, pixels);
 return image;
}

将bufferedimage对象转换为mat对象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public mat convert2mat(bufferedimage image) {
 int width = image.getwidth();
 int height = image.getheight();
 mat src = new mat(new size(width, height), cvtype.cv_8uc3);
 int[] pixels = new int[width*height];
 byte[] rgbdata = new byte[width*height*3];
 getrgb( image, 0, 0, width, height, pixels );
 int index = 0, c=0;
 int r=0, g=0, b=0;
 for(int row=0; row<height; row++) {
  for(int col=0; col<width; col++) {
   index = row*width + col;
   c = pixels[index];
   r = (c&0xff0000)>>16;
   g = (c&0xff00)>>8;
   b = c&0xff;
 
   index = row*width*3 + col*3;
   rgbdata[index] = (byte)b;
   rgbdata[index+1] = (byte)g;
   rgbdata[index+2] = (byte)r;
  }
 }
 
 src.put(0, 0, rgbdata);
 return src;
}

特别要说明一下,bufferedimage与mat的rgb通道顺序是不一样,正好相反,在mat对象中三通道的顺序为bgr而在bufferedimage中为rgb。

从mat中读取全部像素(其中image为mat类型数据)

?
1
2
3
4
5
int width = image.cols();
int height = image.rows();
int dims = image.channels();
byte[] data = new byte[width*height*dims];
image.get(0, 0, data);

遍历像素操作与保存改变

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int index = 0;
int r=0, g=0, b=0;
for(int row=0; row<height; row++) {
 for(int col=0; col<width*dims; col+=dims) {
  index = row*width*dims + col;
  b = data[index]&0xff;
  g = data[index+1]&0xff;
  r = data[index+2]&0xff;
 
  r = 255 - r;
  g = 255 - g;
  b = 255 - b;
 
  data[index] = (byte)b;
  data[index+1] = (byte)g;
  data[index+2] = (byte)r;
 }
}
image.put(0, 0, data);

保存mat对象为图像文件 - 一句话可以搞定

?
1
imgcodecs.imwrite(filepath, src);

opencv代码运行与测试

调节明暗程度 - 亮度降低

详解OpenCV For Java环境搭建与功能演示

调节明暗程度 - 亮度提升

详解OpenCV For Java环境搭建与功能演示

高斯模糊

详解OpenCV For Java环境搭建与功能演示

锐化

详解OpenCV For Java环境搭建与功能演示

梯度

详解OpenCV For Java环境搭建与功能演示

灰度化

详解OpenCV For Java环境搭建与功能演示

上述效果完整java代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package com.gloomyfish.opencvdemo;
 
import org.opencv.core.core;
import org.opencv.core.cvtype;
import org.opencv.core.mat;
import org.opencv.core.size;
import org.opencv.imgproc.imgproc;
 
public class imagefilters {
 
 /** - 反色处理 - */
 public mat inverse(mat image) {
  int width = image.cols();
  int height = image.rows();
  int dims = image.channels();
  byte[] data = new byte[width*height*dims];
  image.get(0, 0, data);
 
  int index = 0;
  int r=0, g=0, b=0;
  for(int row=0; row<height; row++) {
   for(int col=0; col<width*dims; col+=dims) {
    index = row*width*dims + col;
    b = data[index]&0xff;
    g = data[index+1]&0xff;
    r = data[index+2]&0xff;
 
    r = 255 - r;
    g = 255 - g;
    b = 255 - b;
 
    data[index] = (byte)b;
    data[index+1] = (byte)g;
    data[index+2] = (byte)r;
   }
  }
 
  image.put(0, 0, data);
  return image;
 }
 
 public mat brightness(mat image) {
  // 亮度提升
  mat dst = new mat();
  mat black = mat.zeros(image.size(), image.type());
  core.addweighted(image, 1.2, black, 0.5, 0, dst);
  return dst;
 }
 
 public mat darkness(mat image) {
  // 亮度降低
  mat dst = new mat();
  mat black = mat.zeros(image.size(), image.type());
  core.addweighted(image, 0.5, black, 0.5, 0, dst);
  return dst;
 }
 
 public mat gray(mat image) {
  // 灰度
  mat gray = new mat();
  imgproc.cvtcolor(image, gray, imgproc.color_bgr2gray);
  return gray;
 }
 
 public mat sharpen(mat image) {
  // 锐化
  mat dst = new mat();
  float[] sharper = new float[]{0, -1, 0, -1, 5, -1, 0, -1, 0};
  mat operator = new mat(3, 3, cvtype.cv_32fc1);
  operator.put(0, 0, sharper);
  imgproc.filter2d(image, dst, -1, operator);
  return dst;
 }
 
 public mat blur(mat image) {
  // 高斯模糊
  mat dst = new mat();
  imgproc.gaussianblur(image, dst, new size(15, 15), 0);
  return dst;
 }
 
 
 public mat gradient(mat image) {
  // 梯度
  mat grad_x = new mat();
  mat grad_y = new mat();
  mat abs_grad_x = new mat();
  mat abs_grad_y = new mat();
 
  imgproc.sobel(image, grad_x, cvtype.cv_32f, 1, 0);
  imgproc.sobel(image, grad_y, cvtype.cv_32f, 0, 1);
  core.convertscaleabs(grad_x, abs_grad_x);
  core.convertscaleabs(grad_y, abs_grad_y);
  grad_x.release();
  grad_y.release();
  mat gradxy = new mat();
  core.addweighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 10, gradxy);
  return gradxy;
 }
}

可以说简单到哭,此外opencv for java支持各种的图像处理包括形态学操作,二值图像分析、图像特征检测与识别、模板匹配、直方图相关功能等等。常见的机器学习算法与图像分析方法。可以说是功能最强大的图像处理sdk与开发平台之一,本人继续发掘分享!

特别注意

在调用之前,一定要加上这句话

?
1
system.loadlibrary(core.native_library_name);

目的是加载opencv api相关的dll支持,没有它是不会正确运行的。以上代码与功能实现是基于jdk8 64位与opencv 3.2版本。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/jia20003/article/details/68944486

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部

956
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40