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

OpenCV概述

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

一:配置

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

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

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

双击打开Java文件夹,

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

二:加载图像与像素操作

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

Mat src = Imgcodecs.imread(imageFilePath);
if(src.empty()) return;

将Mat对象转换为BufferedImage对象

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对象

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类型数据)

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);

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

Imgcodecs.imwrite(filePath, src); 

OpenCV代码运行与测试

调节明暗程度 - 亮度降低

调节明暗程度 - 亮度提升

高斯模糊

锐化

梯度

灰度化

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

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与开发平台之一,本人继续发掘分享!

特别注意

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

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

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

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

您可能感兴趣的文章:

  • Java+opencv3.2.0之直方图均衡详解
  • Java+opencv3.2.0之scharr滤波器
  • Java+opencv3.2.0实现重映射
  • Java+opencv3.2.0实现模板匹配
  • Java+opencv3.2.0实现hough直线检测
  • OPENCV+JAVA实现人脸识别
  • Java+opencv3.2.0实现hough圆检测功能
  • Java+opencv3.2.0实现人脸检测功能
  • 详解使用JavaCV/OpenCV抓取并存储摄像头图像
(0)

相关推荐

  • Java+opencv3.2.0之scharr滤波器

    在opencv中scharr滤波器是配合sobel算子的运算而存在的.当sobel内核为3时,结果可能会产生比较明显的误差,针对这一问题,Opencv提供了scharr函数.该函数只针对大小为3的核,并且运算速率和sobel函数一样快,结果更加精确,但抗噪性不如sobel函数. 使用scharr滤波器计算x或y方向的图像差分,它的参数变量和sobel一样. 函数:Imgproc.Scharr(Mat src, Mat dst, int ddepth, int dx, int dy, double

  • Java+opencv3.2.0实现人脸检测功能

    说到人脸检测,首先要了解Haar特征分类器.Haar特征分类器说白了就是一个个的xml文件,不同的xml里面描述人体各个部位的特征值,比如人脸.眼睛等等.OpenCV3.2.0中提供了如下特征文件: haarcascade_eye.xml haarcascade_eye_tree_eyeglasses.xml haarcascade_frontalcatface.xml haarcascade_frontalcatface_extended.xml haarcascade_frontalface

  • OPENCV+JAVA实现人脸识别

    本文实例为大家分享了JAVA实现人脸识别的具体代码,供大家参考,具体内容如下 官方下载 安装文件 ,以win7为例,下载opencv-2.4.13.3-vc14.exe 安装后,在build目录下 D:\opencv\build\java,获取opencv-2413.jar,copy至项目目录 同时需要dll文件 与 各 识别xml文件,进行不同特征的识别(人脸,侧脸,眼睛等) dll目录:D:\opencv\build\java\x64\opencv_java2413.dll xml目录:D:

  • 详解使用JavaCV/OpenCV抓取并存储摄像头图像

    本程序通过JFrame实时显示本机摄像头图像,并将图像存储到一个缓冲区,当用户用鼠标点击JFrame中任何区域时,显示抓取图像的简单动画,同时保存缓冲区的图像到磁盘文件中.点击JFrame关闭按钮可以退出程序. 实现: import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; imp

  • Java+opencv3.2.0实现模板匹配

    模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术. 函数:Imgproc.matchTemplate(Mat image, Mat templ, Mat result, int method) 参数说明: image:源图像 templ:模板图像 result:比较结果 method:匹配算法 匹配算法: TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配:最好的匹配值为0:匹配越差,匹配值越大. TM_CCORR 相关匹配法:该方法采用乘法操作:数值越大表明匹配

  • Java+opencv3.2.0实现hough直线检测

    hough变换是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合特定形状的集合作为hough变换结果. 发展史: 1962年由PaulHough首次提出,用来检测直线和曲线. 1972年由Richard Duda & Peter Hart推广使用,扩展到任意形状物体的识别. 原理: 一条直线在直角坐标系下的表示形式为y=k*x+b,而在极坐标系下表示为r=x*cos(theta)+y*sin(theta).hough变换的思想为在直角坐标系下的一个点对

  • Java+opencv3.2.0实现hough圆检测功能

    hough圆检测和hough线检测的原理近似,对于圆来说,在参数坐标系中表示为C:(x,y,r). 函数: Imgproc.HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius) 参数说明: image:源图像 circles:检测到的圆的输出矢量(x,y,r) method:使用的

  • Java+opencv3.2.0实现重映射

    通过重映射来表达每个像素的位置(x,y) :g(x,y)=f(h(x,y)),h(x,y)是映射方法函数.当h(x,y) = (I.cols()-x,y),表示按照x轴方向发生偏转. 函数:Imgproc.remap(Mat src, Mat dst, Mat map1, Mat map2, int interpolation, int borderMode, Scalar borderValue) 参数说明: src:源图像 dst:目标图像 map1:它有两种可能表示的对象,一种是表示点(x

  • Java+opencv3.2.0之直方图均衡详解

    直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法. 直方图均衡化的步骤: 1.计算输入图像的直方图H 2.进行直方图归一化,使直方图组距的和为255 3.计算直方图积分 4.采用H'作为查询表:dst(x,y)=H'(src(x,y))进行图像变换 函数:Imgproc.equalizeHist(Mat src, Mat dst) 参数说明: src:源图像 dst:运算结果图像 示例代码: public static void main(String[] args) { Sys

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

    OpenCV概述 OpenCV做为功能强大的计算机视觉开源框架,包含了500多个算法实现,而且还在不断增加,其最新版本已经更新到3.2.其SDK支持Android与Java平台开发,对于常见的图像处理需求几乎都可以满足,理应成为广大Java与Android程序员的首先的图像处理框架.Java中使用OpenCV的配置及其简单,可以毫不客气的说几乎是零配置都可以. 一:配置 配置引入OpenCV相关jar包,首先要下载OpenCV的自解压版本,下载地址: http://opencv.org/open

  • 详解关于Windows10 Java环境变量配置问题的解决办法

    关于Windows10 Java环境变量配置问题的解决办法 由于最近有一些时间,所以想要把之前学过一段时间的Java重新捡起来看看,之前的学习环境是Ubuntu,对于环境变量的配置和Windows也没有什么本质的区别,只不过是要用自带的编辑器更改一些东西而已. 那么我先讲讲我对于环境变量的一些自己的理解,由于每次编译源程序的时候需要用到编译工具,而Java的编译工具就是从oracle官网上下载的jdk包中的一些jar文件,所以如果要让系统识别java或者javac命令,那么就必须让系统知道这些文

  • 详解VScode编辑器vue环境搭建所遇问题解决方案

    前言 为什么选择VScode? 在之前我用过sublime.webstorm.atom.Brackets.eclipse.HBuilder.notepad++等等.应该还有一些用过几次的编辑器,记不起来的,这些编辑器的作用不外乎一点--为了开发迅速.基本都会自带代码提示插件.随着项目越来越大,出了一系列问题,而这些问题会大量浪费我们的时间(我们只想简单的编程),故而编辑器插件的数量和支持程度成为了我们选择编辑器的重要条件,这就是为什么选择VScode,它拥有大量的插件,可以帮助我们完成我们没必要

  • 详解vue.js 开发环境搭建最简单攻略

    做为一名学习路上的小白,起初就对 vue.js 有着莫名的好感,知道 vue.js 也能实现 angular.js 的双向绑定等一些功能后,妥妥的先把 angular.js 和 node.js 丢到后面再去学, 看了看 vue 文档,首先要搭建一个开发环境,因为自己太小白,看了一些搭建开发环境的博客,表示专业术语太多依然还是一脸懵逼. 具体流程大概如下: 很难理解?没关系,我也没理解,跟着操作就行了,我是window系统. 1.安装node.js 起初是很不理解的,我学 vue.js 还要掌握

  • 详解.Net Core + Angular2 环境搭建

    本文介绍了.Net Core + Angular2 环境搭建,具体如下: 环境搭建: 1)node.js版本>5.0,NPM版本>3.0,TypeScript版本>2.0(全装最新版就好了) 2)安装NTVS 1.2(node tools for vs),TSVS dev 1.4(TS for VS) 3)构建package.json,tsconfig.json,gulp.js文件 1.package.json { "name": "template.ang

  • 详解Windows 配置Java环境变量的方法

    Java 教程 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言. Java 可运行于多个平台,如 Windows, Mac OS 及其他多种 UNIX 版本的系统. 移动操作系统 Android 大部分的代码采用 Java 编程语言编程. 下载 JDK 下载地址:https://www.oracle.com/java/technologies/downloads/ 1.配置JAVA_HOME环境变量 变量名称:JAVA_HOME 变量值: C

  • 详解Vue.js入门环境搭建

    vue这个新的工具,确实能够提高效率,在经历的一段时间的摧残之后,终于能够有一个系统的认识了,下面就今天的收获做一个总结,也是vue入门的精髓: 1.要使用vue来开发前端框架,首先要有环境,这个环境要借助于node,所以要先安装node,借助于node里面的npm来安装需要的依赖等等. 这里有一个小技巧:如果在cmd中直接使用npm来安装的一些工具的话会比较慢,所以我们使用淘宝的npm镜像: 输入npm install -g cnpm –registry=https://registry.np

  • 详解webpack+angular2开发环境搭建

    刚搭建完一个webpack+angular2环境,由于angular及webpack官网上没有一个折中的搭建方案,所以只能摸索着搭建,中间遇到一些坑,遂总结记录下来,以供交流. 搭建完后的项目初步环境如下: app ----app.component.ts ----app.module.ts ----main.ts index.html package.json tsconfig.json webpack.config.js app.componnet.ts:组件文件.angular2应用是由组

  • 详解Webpack + ES6 最新环境搭建与配置

    一,准备工作 1.下载node.js 和 npm 2.将镜像源替换为淘宝镜像 二,创建目录及安装webpack创建项目 在命令行中输入 npm init -y 我们看到了项目中多了一个package.json文件,它定义了这个项目中所需各种模板及项目中的配置信息.该对象的每一个成员就是当前项目的一项设置.详细设置信息请参考 https://docs.npmjs.com/files/package.json 安装webpack 全局安装webpack,在命令行输入 npm install webp

  • JAVA环境搭建之MyEclipse10+jdk1.8+tomcat8环境搭建详解

    一.安装JDK 1.下载得到jdk-8u11-windows-i586.1406279697.exe,直接双击运行安装,一直next就可以,默认是安装到系统盘下面Program Files, 我这里装在D:\Program Files\Java下面,注意安装完jdk之后会自动运行安装jre,这时的安装路径最好和jdk一样,方便管理,我的都是在D:\Program Files\Java下面. 2.环境变量配置: 右击"我的电脑",点击"属性":选择"高级系统

随机推荐