Java 調用 OpenCV
- 一.OpenCV 下載和安裝
- 二.創建 Java Maven 項目
- 三.其他測試
一.OpenCV 下載和安裝
Open CV 官網
可以下載編譯好的包,也可以下載源碼自行編譯
雙擊安裝 opencv-4.8.0-windows.exe 默認為當前目錄
安裝即解壓縮
根據系統位數選擇
將 x64 目錄下 opencv_java480.dll 放到 JDK 目錄
將 opencv-480.jar 引入項目依賴
二.創建 Java Maven 項目
工程截圖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>opencv</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>20</maven.compiler.source><maven.compiler.target>20</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.opencv</groupId><artifactId>opencv</artifactId><version>4.8.0</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/opencv-480.jar</systemPath></dependency></dependencies></project>
測試代碼
package org.example;import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;/*** @author Administrator*/
public class Main {/*** load opencv_java480*/static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}public static void main(String[] args) {String img = "C:\\Users\\Administrator\\Desktop\\IMG_20140207_165557.jpg";//read imageMat src = Imgcodecs.imread(img);//define a dst matMat dst = new Mat();// resizeImgproc.resize(src,dst,new Size(1600,900));//showHighGui.imshow("dst",dst);HighGui.resizeWindow("dst",1600,900);// show delay some ms auto closeHighGui.waitKey(1000);// exitSystem.exit(0);}
}
顯示效果
三.其他測試
package org.example;import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;/*** @author Administrator*/
public class Main {/*** load opencv_java480*/static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}/*** 低通濾波器 均值濾波 使圖像模糊、消除噪點*/static float[] vague_shaper = new float[]{1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9};/*** 低通濾波器 高斯濾波 使圖像模糊*/static float[] gauss_shaper = new float[]{1/16,2/16,1/16,2/16,4/16,2/16,1/16,2/16,1/16};/*** 高通濾波器 銳化卷積核*/static float[] sharpening = new float[]{-1,-1,-1,-1,8,-1,-1,-1,-1};/*** 一階微算子 pre_witt 處理噪聲多、灰度突變的圖像*/static float[] pre_witt = new float[]{-1,-1,-1,0,0,0,1,1,1};/*** 一階微算子 sobel pre_witt 的改進版*/static float[] sobel_vertical = new float[]{-1,0,1,-2,0,2,-1,0,1};/*** 一階微算子 sobel pre_witt 的改進版*/static float[] sobel_horizontal = new float[]{1,2,1,0,0,0,-1,-2,-1};public static void main(String[] args) {String imgF = "C:\\Users\\Administrator\\Desktop\\IMG_20220204_132906.jpg";Mat img = Imgcodecs.imread(imgF);Mat src = new Mat();Mat dst = new Mat();//重置大小Imgproc.resize(img,src,new Size(1600,900));int rows = src.rows();int cols = src.cols();int channels = src.channels();//展示HighGui.resizeWindow("dst",1600,900);HighGui.imshow("dst",src);HighGui.waitKey(0);//灰度化Imgproc.cvtColor(src,dst,Imgproc.COLOR_RGB2GRAY);HighGui.imshow("dst",dst);HighGui.waitKey(0);//定義卷積核Mat operator = new Mat(3,3, CvType.CV_32FC1);//模糊operator.put(0,0,vague_shaper);Imgproc.filter2D(src,dst,-1,operator);HighGui.imshow("vague_shaper",dst);HighGui.waitKey(0);//模糊operator.put(0,0,gauss_shaper);Imgproc.filter2D(src,dst,-1,operator);HighGui.imshow("gauss_shaper",dst);HighGui.waitKey(0);//高通operator.put(0,0,sharpening);Imgproc.filter2D(src,dst,-1,operator);HighGui.imshow("sharpening",dst);HighGui.waitKey(0);//pre_wittoperator.put(0,0,pre_witt);Imgproc.filter2D(src,dst,-1,operator);HighGui.imshow("pre_witt",dst);HighGui.waitKey(0);//sobel_verticaloperator.put(0,0,sobel_vertical);Imgproc.filter2D(src,dst,-1,operator);HighGui.imshow("sobel_vertical",dst);HighGui.waitKey(0);//sobel_horizontaloperator.put(0,0,sobel_horizontal);Imgproc.filter2D(src,dst,-1,operator);HighGui.imshow("sobel_horizontal",dst);HighGui.waitKey(0);//二值化Mat gray = new Mat();Imgproc.cvtColor(src,gray,Imgproc.COLOR_RGB2GRAY);Imgproc.threshold(gray,dst,100,255,Imgproc.THRESH_BINARY);HighGui.imshow("binary",dst);HighGui.waitKey(0);//邊緣檢測Imgproc.Canny(src,dst,128,255);HighGui.imshow("edge",dst);HighGui.waitKey(0);//反色dst = src.clone();byte[] data = new byte[rows * cols * channels];dst.get(0,0,data);int index,r,g,b;for (int rs = 0 ; rs < rows ; rs++){//通道值橫向排列for (int c = 0 ; c < cols * channels ; c = c + channels){//取位置index = rs * cols * channels + c;//取RGB并翻轉b = 255 - data[index] & 0xff;g = 255 - data[index + 1] & 0xff;r = 255 - data[index + 2] & 0xff;//回寫data[index] = (byte) b;data[index + 1] = (byte) g;data[index + 2] = (byte) r;}}dst.put(0,0,data);HighGui.imshow("overturn",dst);HighGui.waitKey(0);System.exit(0);}}
原圖
灰度圖
銳化圖
Prewitt 算子
sobel_vertical
sobel_horizontal
binary
邊緣檢測
反色