【问题标题】:OpenCV unable to load library for a dynamic web projectOpenCV 无法为动态 Web 项目加载库
【发布时间】:2013-12-31 07:20:43
【问题描述】:

我正在准备一个关于人脸识别的 java web 项目。我正在使用 opencv 2.4.7 的 java 库。当我从 servlet 调用 FaceDetector 类时,它给出了错误-

java.lang.UnsatisfiedLinkError:java.library.path 中没有 opencv_java247 java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886) java.lang.Runtime.loadLibrary0(Runtime.java:849) java.lang.System.loadLibrary(System.java:1088) Models.NewFaceDetector.(NewFaceDetector.java:24) Servlets.helloServlet.doPost(helloServlet.java:108) javax.servlet.http.HttpServlet.service(HttpServlet.java:647) javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

此代码在控制台 java 项目中运行良好。 Servlet 代码是-

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    PrintWriter out=response.getWriter();
    Part name=request.getPart("NameBox");
    Part img=request.getPart("Img");
    String filename=getFileName(img);
    InputStream is=img.getInputStream();
    int i=is.available();
    byte[] b=new byte[i];
    is.read(b);
    String path="E:/temp/"+filename;
    FileOutputStream os=new FileOutputStream(path);
     os.write(b);
    os.close();
    is.close();
   FaceDetector fd=new FaceDetector();
    fd.getFaces(path);  
}

我的面部检测器类是-

public class FaceDetector {

static{ System.loadLibrary("opencv_java247"); }
public List<Mat> getFaces(String url) throws MalformedURLException, IOException
{
    List<Mat>faces=new ArrayList();
    Mat image = Highgui.imread(url);
    //code...
}

我给出了打开 cv dll 的路径--Djava.library.path="C:\Users\vivek\Documents\NetBeansProjects\TrendFaceRecognizer\src\java\data"

我不知道自己做错了什么。

【问题讨论】:

    标签: java opencv servlets


    【解决方案1】:

    如何解决 java.lang.UnsatisfiedLinkError
    用户应检查是否-

    • System.loadLibrary 传递的参数不正确:

      • Windows:要加载 Name.dll,将 Name 传递给 loadLibrary 方法。

        AIX、HP-UX、Solaris、Linux:要加载 libName.so 或 libName.a,传递 libName
        到 loadLibrary 方法

    • 本机库已加载-

      如果本机库已由应用程序加载并且相同
      应用程序尝试再次加载它,这可能会导致此错误。

    • 本机库不存在于 java.library.path 或
      LD_LIBRARY_PATH

    参考:Debugging java.lang.UnsatisfiedLinkError

    在你的情况下, 1)检查您的servlet(可能在不同的包中)是否可以访问\TrendFaceRecognizer\src\java\data 中的dll

    2) 而不是 System.loadLibrary("opencv_java247") 尝试使用 System.load("opencv_java247") 。似乎 loadLibrary 使用默认路径,加载将使用绝对路径

    【讨论】:

    • 检查了每一步但没有成功。
    • dll库必须在java能找到的地方。它可以在 Windows $PATH 中,在 java.library.path 中列出的文件夹中,通过将 -Djava.library.path 传递给命令行(你做了什么)。
    • 我已将我的库放在 C:\Users\vivek\Documents\NetBeansProjects\TrendFaceRecognizer\lib 并在 vm 选项中我给出了路径--Djava.library.path="C:\Users\ vivek\Documents\NetBeansProjects\TrendFaceRecognizer\lib"
    • ok 而不是 System.loadLibrary("opencv_java247") 尝试使用 System.load("opencv_java247") 。看来 loadLibrary 使用默认路径,加载将使用绝对路径。
    • 现在 System.load() 终于开始工作了。非常感谢@sasi Kathimanda。
    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 2012-01-26
    • 1970-01-01
    • 2019-04-03
    • 2013-02-09
    • 2018-02-25
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多