本文主要说明Linux上如何从源码安装opencv库,并给出一个简单例子说明安装成功
1.环境说明
VMware下的Ubuntu22.04LTS
2.安装步骤
需要准备好java环境和opencv源码后,从源码cmake编译,并进行安装
2.1.依赖安装
sudo apt install openjdk-8-jdk openjdk-8-jre
# 验证安装
java -version # 应显示 "1.8.x"
javac -version # 应显示 "1.8.x"
sudo apt install build-essential cmake git libgtk2.0-dev pkg-config \
libavcodec-dev libavformat-dev libswscale-dev libtbb2 libtbb-dev \
libjpeg-dev libpng-dev libtiff-dev ant
2.1.1.源码下载
wget -O opencv-4.6.0.tar.gz https://github.com/opencv/opencv/archive/refs/tags/4.6.0.tar.gz
wget -O opencv_contrib-4.6.0.tar.gz https://github.com/opencv/opencv_contrib/archive/refs/tags/4.6.0.tar.gz
# 解压
tar -zxf opencv-4.6.0.tar.gz
tar -zxf opencv_contrib-4.6.0.tar.gz
2.1.2.源码编译及安装
cd opencv-4.6.0
mkdir build
cd build
# 重要的是下面的cmake选项
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/mylib -D OPENCV_GENERATE_PKGCONFIG=YES -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.6.0/modules -D ENABLE_CXX11=ON -D WITH_1394=OFF -D BUILD_opencv_xfeatures2d=OFF -D BUILD_SHARED_LIBS=OFF -D BUILD_TESTS=OFF ..
# 安装
make -j$(nproc)
make install
具体Cmake选项参考Linux环境下编译并使用java_opencv_java opencv在linux下运行-CSDN博客
安装完成后有两个重要的文件,一个.so
文件,一个.jar
文件
# ls /usr/local/mylib/share/java/opencv4/
libopencv_java460.so opencv-460.jar
2.1.3.加入环境
在~/.bashrc
文件末尾加入
# 运行时需要的文件路径
export LD_LIBRARY_PATH=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/mylib/share/java/opencv4:$LD_LIBRARY_PATH
# 编译时需要
export CLASSPATH=.:/usr/local/mylib/share/java/opencv4/*:$CLASSPATH
2.2.简单测试
文件目录
.
├── ImageProcessor.java
└── input_image.jpg
ImageProcess.java
文件运行
javac ImageProcessor.java
java ImageProcessor
2.2.1.运行结果
多出三个文件ImageProcessor.class
,output_resized_height.jpg
和 output_resized_width.jpg
输出图像
2.2.2.文件内容
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class ImageProcessor {
static {
System.out.println("Loading OpenCV" + Core.VERSION);
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static Mat loadImage(String filename) {
return Imgcodecs.imread(filename);
}
public static void saveImage(Mat image, String filename) {
Imgcodecs.imwrite(filename, image);
}
public static void resizeWidth(Mat image) {
int newWidth = image.cols() / 2;
Imgproc.resize(image, image, new Size(newWidth, image.rows()));
}
public static void resizeHeight(Mat image) {
int newHeight = image.rows() / 2;
Imgproc.resize(image, image, new Size(image.cols(), newHeight));
}
public static void main(String[] args) {
// Test the methods
ImageProcessor processor = new ImageProcessor();
Mat image = processor.loadImage("input_image.jpg");
if (image != null) {
System.out.println("Image loaded successfully. Resizing width...");
processor.resizeWidth(image);
processor.saveImage(image, "output_resized_width.jpg");
System.out.println("Resized width image saved successfully.");
image = processor.loadImage("input_image.jpg");
System.out.println("Resizing height...");
processor.resizeHeight(image);
processor.saveImage(image, "output_resized_height.jpg");
System.out.println("Resized height image saved successfully.");
} else {
System.err.println("Error: Could not load image.");
}
}
}