1

我在 Eclipse 中有一个 openCV 项目。现在我试图让它运行 Jar 但无法启动它,一旦尝试运行 jar。我试过以下 - https://groups.google.com/forum/#!topic/javacv/ziqKIb7PgYk

但我无法正确理解。任何人都可以解释做必要的正确方法。

在我的系统中,安装了 OpenCV。一旦我尝试从 eclipse 运行项目,一切正常。但是当我尝试从 runnabelJar 做同样的事情时,它没有。我发现我没有包含 .dll 文件的问题,所以我应该怎么做。

4

2 回答 2

2

我终于得到了解决方案。是的,我们可以在使用 javaCV 时轻松地从 eclipse 制作 Runnable jar,无需 ant 或 maven 构建。

无需使用 OpenCV 设置类路径,您仅使用 javaCV 而无意构建 jni。

  • 创建一个 Java 项目。
  • 复制所有 jars。您也可以避免使用 x86 或 linux 或不需要的 jars。

在此处输入图像描述

  • 查找 jre 版本,如果是 32 位,则获取 OpenCV 32 位库的路径,否则为 64 位。您可以将这些 dll 放置在系统中的任何位置。无需将其放置在任何特定路径。
  • 转到 OpenCV jar ,展开它,单击 Native Library Location ,编辑并浏览路径

在此处输入图像描述

就是这样,工作完成,现在制作 Runnable jar 或任何东西,它会像魅力一样工作。

将可运行的 jar 提供给任何用户后,应在类路径中设置用户的 openCV 路径,或者提供 dlls ,然后将库加载到任何静态块中。

于 2013-10-05T20:12:03.390 回答
0

用 ANT 构建一个 jar(对于 javacv 0.9):

  1. 安装opencv(和/或ffmpeg)

  2. 从https://github.com/bytedeco/javacv下载 javacv

  3. 创建一个 Java 项目并在根目录中创建目录“lib”、“lib32”和“lib64”,并将 x64 jar 从 javacv 添加到 lib64 - 对于 lib32 和其他没有位版本的 lib 相同

  4. 将以下 jars 添加到项目的 buildpaht(添加外部 JAR...)并为 opencv(和/或 ffmpeg)设置本机库路径

在此处输入图像描述

  1. 样本测试类
public class Main { 
    public static void main(String[] args) throws Exception, IOException {
        OpenCVFrameGrabber frameGrabber = new OpenCVFrameGrabber(new File(".\\tmp_files\\small.mp4"));
        frameGrabber.start();
        IplImage origImg = frameGrabber.grab();

        //create canvas frame named 'Demo'
        final CanvasFrame canvas = new CanvasFrame("Demo");

        //Show image in canvas frame
        canvas.showImage(origImg);

        //This will close canvas frame on exit
        canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);    
    }
}
  1. ANT 脚本
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="main" name="Main">
    <property environment="env"/>
    <property name="debuglevel" value="source,lines,vars"/>
    <property name="target" value="1.6"/>
    <property name="source" value="1.6"/>
    <property name="build.dir"     value="bin"/>
    <property name="src.dir"       value="src"/>
    <property name="lib.dir"       value="lib"/> 
    <property name="lib32.dir"       value="lib32"/>
    <property name="lib64.dir"       value="lib64"/>
    <property name="classes.dir"   value="${build.dir}/classes"/>
    <property name="jar.dir"       value="${build.dir}/jar"/>
    <property name="jar.file"      value="${jar.dir}/buildOpenCvTest32_64.jar"/>
    <property name="manifest.file" value="${jar.dir}/MANIFEST.MF"/>

    <property name="main.class" value="test.Main"/>

    <path id="external.jars">
        <fileset dir="${lib.dir}" includes="**/*.jar"/>
        <fileset dir="${libV.dir}" includes="**/*.jar"/>
    </path>

    <path id="project.classpath">
        <pathelement location="${src.dir}"/>
        <path refid="external.jars" />
    </path>

    <target name="init">
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${classes.dir}"/>
        <mkdir dir="${jar.dir}"/>
        <copy includeemptydirs="false" todir="${build.dir}">
            <fileset dir="${src.dir}">
                <exclude name="**/*.launch"/>
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>

    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <target name="cleanall" depends="clean"/>

    <target name="build" depends="init">
        <echo message="${ant.project.name}: ${ant.file}"/>
        <javac debug="true" debuglevel="${debuglevel}" destdir="bin" source="${source}" target="${target}" classpathref="project.classpath">
            <src path="${src.dir}"/>
        </javac>
    </target>

    <target name="build-jar" depends="build">
        <delete file="${jar.file}" />
        <delete file="${manifest.file}" />

        <manifest file="${manifest.file}" >
            <attribute name="built-by" value="${user.name}" />
            <attribute name="Main-Class" value="${main.class}" />
        </manifest>

        <jar destfile="${jar.file}" 
            basedir="${build.dir}" 
            manifest="${manifest.file}">
            <fileset dir="${classes.dir}" includes="**/*.class" />
            <zipgroupfileset dir="${lib.dir}" includes="**/*.jar" />
            <zipgroupfileset dir="${lib32.dir}" includes="**/*.jar" />
            <zipgroupfileset dir="${lib64.dir}" includes="**/*.jar" />
        </jar>

    </target>

    <target name="main" depends="build-jar">
        <description>Main target</description>
      </target>
</project>
  1. 运行 ANT - jar 应该在每个 32 位和 64 位 Windows 系统上运行。同样适用于 ffmpeg 库和 unix 系统
于 2014-10-01T13:55:04.150 回答