opencv做清晰度判定运行时出现no jniopencv_core in java.library.path

1,066 阅读2分钟

概述

最近一直在用opencv做图像一块的东西,目前有个需求是做清晰度相关的,在网上查找资料后,最终决定使用这块代码,使用Laplacian来进行清晰度计算(越大越好):

import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_imgcodecs;
import org.bytedeco.javacpp.opencv_imgproc;

 	/**
     * javacv 检测图片清晰度
     * 标准差越大说明图像质量越好
     */
    public static void clarityException(File jpegFile){
        String path = "E:\\test\\";
        opencv_core.Mat srcImage = opencv_imgcodecs.imread(jpegFile.getAbsolutePath());
        opencv_core.Mat dstImage = new opencv_core.Mat();
        //转化为灰度图
        opencv_imgproc.cvtColor(srcImage, dstImage, opencv_imgproc.COLOR_BGR2GRAY);
        //在gray目录下生成灰度图片
        opencv_imgcodecs.imwrite(path+"gray-"+jpegFile.getName(), dstImage);

        opencv_core.Mat laplacianDstImage = new opencv_core.Mat();
        //阈值太低会导致正常图片被误断为模糊图片,阈值太高会导致模糊图片被误判为正常图片
        opencv_imgproc.Laplacian(dstImage, laplacianDstImage, opencv_core.CV_64F);
        //在laplacian目录下升成经过拉普拉斯掩模做卷积运算的图片
        opencv_imgcodecs.imwrite(path+"laplacian-"+jpegFile.getName(), laplacianDstImage);

        //矩阵标准差
        opencv_core.Mat stddev = new opencv_core.Mat();

        //求矩阵的均值与标准差
        opencv_core.meanStdDev(laplacianDstImage, new opencv_core.Mat(), stddev);
        // ((全部元素的平方)的和)的平方根
        // double norm = Core.norm(laplacianDstImage);
        // System.out.println("\n矩阵的均值:\n" + mean.dump());
        System.out.println(jpegFile.getName() + "矩阵的标准差:\n" + stddev.createIndexer().getDouble());
        // System.out.println(jpegFile.getName()+"平方根:\n" + norm);
    }

参考链接:(28条消息) 基于OpenCV对图片清晰度、色偏和亮度的检测(java版)_弦上的梦的博客-CSDN博客

使用该代码需要导入相关的maven依赖

<dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacv-platform</artifactId>
        <version>1.4.3</version>
</dependency>

问题一:版本错误

javacv和opencv使用时是具有对应性的,1.4.3版本对应opencv的3.4.2,而博主使用的是opencv4.z

可以通过以下链接对版本对应进行查询: Maven Repository: org.bytedeco » javacv-platform (mvnrepository.com)

问题二:在程序运行后,传入图片进行清晰度计算,出现no jniopencv_core in java.library.path

在网络上找了很多的文章,都是说关于版本or环境依赖的问题,但他们的答案都较老,博主没有找到SpringBoot项目结构的示例。

根据其他博主的文章,也可以解压bin将其他的jar包一并导入项目(但现在的opencv bin里没有其他包……)

解决办法依旧是通过添加maven依赖:

<dependency>  
    <groupId>org.bytedeco.javacpp-presets</groupId>  
    <artifactId>opencv-platform</artifactId>  
    <version>4.0.1-1.4.4</version>  
</dependency>

希望对各位有用