Opencv安装配置
环境准备
-
提前准备jdk、以及编译工具
-
版本自己选择,我这里选用的是jdk1.8和opencv3.4.16
安装
-
官方库
OpenCV - 在 SourceForge.net 浏览文件](OpenCV - Browse Files at SourceForge.net)
-
选择对应的版本,拿3.4.16举例,点击下载
-
解压后结构如下
其中builder下的java和x64文件夹下的path需要配置,后面要考!
即java文件夹下的x64文件夹和x64下的vc15\bin
-
下载完成后打开Idea创建项目,在Project Structure中的Libraries添加jar包
-
添加路径(直接运行会报错:no opencv_java版本号 in java.library.path)
-
局部添加(仅仅只是在这个方法内能够使用)
找到VM options选项添加配置如下:
-Djava.library.path=D:\\develop\\java\\opencv\\opencv\\build\\java\\x64 ;D:\\develop\\java\\opencv\\opencv\\build\\x64\\vc15\\bin
具体路径视自己文件夹修改,即上面所说的文件
-
配置完成后即可复制以下代码测试,输出一些opencv的内容
import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.Scalar; public class OpencvTest1 { static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME);} public static void main(String[] args) { System.out.println("Welcome to OpenCV " + Core.VERSION); Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0)); System.out.println("OpenCV Mat: " + m); Mat mr1 = m.row(1); mr1.setTo(new Scalar(1)); Mat mc5 = m.col(5); mc5.setTo(new Scalar(5)); System.out.println("OpenCV Mat data:\n" + m.dump()); } }
输出以下内容即成功,到此opencv的基本配置就完成了
-
图像处理
数据类型(Mat)
前置概念
-
位深度:说白了,在计算机底层都是bit存储,1010那样,图片同理根据一个像素占据的位深度对图片也有了划分,黑白图位深度为1,即二值图像;灰度图像位深度为8,即2^8,取值为0-255;现在常见的彩色图像最起码的都是24位深度,即3x8,分别为RGB(红绿蓝)相互组合
-
文件格式:
-
TIFF
-
GIF
-
PNG
-
JPEG
-
BMP
-
Mat基本使用
认识Mat
-
在搭建环境时写过这样的程序,这就是创建矩阵的一种方式;在创建前,先认识一下第三个参数,在后面使用中也尤其重要
new Mat(3,3,CvType.CV_8UC1)
-
第三个参数表示矩阵的数据类型,就跟java中的什么int、long、string一样;
-
CV:表示OpenCV
-
第一个字符(8):表示二进制位数,例如java中的int在底层占32位,后面也会使用到
-
第二个字符(U):表示无符号整形,还有另外2个S和F,分别表示有符号整形和浮点类型
-
第三个字符(C):通道的简写,表示通道,Channel,其中一个通道等同一个矩阵
-
第四个字符(1):表示通道个数
-
-
在使用OpenCV前都必须加载用户库,如下
System.loadLibrary(Core.NATIVE_LIBRARY_NAME)
创建矩阵(4)
-
使用静态方法
-
zeros:全0矩阵
-
ones:全1矩阵
-
eye:行和列相同时为1矩阵(多通道时只有第一个像素为1)
//zeros Mat zeros = Mat.zeros(2, 3, CvType.CV_8UC1); System.out.println("全0矩阵:"+zeros.dump()); //ones Mat ones = Mat.ones(2, 3, CvType.CV_8UC1); System.out.println("全1矩阵" + ones.dump()); Mat ones1 = Mat.ones(3, 3, CvType.CV_8UC3); System.out.println(ones1.dump()); //eye Mat eye = Mat.eye(2, 3, CvType.CV_8UC1); System.out.println(eye.dump()
-
-
使用构造器
主要的就空参和3个参数,具体ctrl+左键看吧
-
采用读取图片创建
-
要注意的是,图片太大直接在控制台很难输出,所以我采用的是读取图片的其中一个像素取值
//读取并展示图片 Mat mat = Imgcodecs.imread("src/main/resources/img/test.png"); HighGui.imshow("str",mat); HighGui.waitKey(0); BufferedImage bufferedImage = new BufferedImage(mat.width(), mat.height(), BufferedImage.TYPE_3BYTE_BGR); int i = mat.get(1, 1, ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData()); System.out.println(i);
-
-
clone
Mat mat = new Mat(2,3, CvType.CV_8UC1); Mat mat2 = mat.clone();