当前位置: 首页 > 知识库问答 >
问题:

构建使用opencv可移植的java应用程序

焦阎宝
2023-03-14
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.CvType;
import org.opencv.core.Scalar;

class SimpleSample {

  static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }

  public static void main(String[] args) {
    System.out.println("Welcome to OpenCV " + Core.VERSION);
    Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
    System.out.println("OpenCV Mat: " + m);
    Mat mr1 = m.row(1);
    mr1.setTo(new Scalar(1));
    Mat mc5 = m.col(5);
    mc5.setTo(new Scalar(5));
    System.out.println("OpenCV Mat data:\n" + m.dump());
  }
}
<project name="SimpleSample" basedir="." default="rebuild-run">
    <property name="src.dir"     value="src"/>
    <property name="lib.dir"     value="${ocvJarDir}"/>
    <path id="classpath"><fileset dir="${lib.dir}" includes="**/*.jar"/></path>
    <property name="build.dir"   value="build"/>
    <property name="classes.dir" value="${build.dir}/classes"/>
    <property name="jar.dir"     value="${build.dir}/jar"/>
    <property name="main-class"  value="${ant.project.name}"/>
    <target name="clean"><delete dir="${build.dir}"/></target>
    <target name="compile">
        <mkdir dir="${classes.dir}"/>
        <javac includeantruntime="false" srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/>
    </target>
    <target name="jar" depends="compile">
        <mkdir dir="${jar.dir}"/>
        <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-Class" value="${main-class}"/>
            </manifest>
        </jar>
    </target>
    <target name="run" depends="jar">
        <java fork="true" classname="${main-class}">
            <sysproperty key="java.library.path" path="${ocvLibDir}"/>
            <classpath>
                <path refid="classpath"/>
                <path location="${jar.dir}/${ant.project.name}.jar"/>
            </classpath>
        </java>
    </target>
    <target name="rebuild" depends="clean,jar"/>
    <target name="rebuild-run" depends="clean,run"/>
</project>

OBS:我已经将opencv构建为静态库:

cmake-DBUILD_SHARED_LIBS=OFF.

共有1个答案

孔和畅
2023-03-14
public class LoadLibrary {
public static void loadOpenCV() {
    try {
        InputStream inputStream = null;
        File fileOut = null;
        String osName = System.getProperty("os.name");
        System.out.println(osName);

        if (osName.startsWith("Windows")) {
            int bitness = Integer.parseInt(System.getProperty("sun.arch.data.model"));
            if (bitness == 32) {
                inputStream = LoadLibrary.class.getResourceAsStream("/opencv/windows/x86/opencv_java300.dll");
                fileOut = File.createTempFile("lib", ".dll");
            } else if (bitness == 64) {
                inputStream = LoadLibrary.class.getResourceAsStream("/opencv/windows/x64/opencv_java300.dll");
                fileOut = File.createTempFile("lib", ".dll");
            } else {
                inputStream = LoadLibrary.class.getResourceAsStream("/opencv/windows/x86/opencv_java300.dll");
                fileOut = File.createTempFile("lib", ".dll");
            }
        } else if (osName.equals("Mac OS X")) {
            inputStream = LoadLibrary.class.getResourceAsStream("/opencv/mac/libopencv_java300.dylib");
            fileOut = File.createTempFile("lib", ".dylib");
        }

        if (fileOut != null) {
            OutputStream outputStream = new FileOutputStream(fileOut);
            byte[] buffer = new byte[1024];
            int length;

            while ((length = inputStream.read(buffer)) > 0) {
                outputStream.write(buffer, 0, length);
            }

            inputStream.close();
            outputStream.close();
            System.load(fileOut.toString());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
 类似资料:
  • 问题内容: 我已经开发了一个应用程序,可以从网络摄像头抓取视频并使用OpenCV和JavaCV检测运动。我正在尝试使用eclipse导出为可执行jar。程序在eclipse中运行良好,就像我在其中编写程序的计算机上的exe jar一样。 我要完成的工作是使exe Jar在未安装OpenCV的计算机上运行。基本上我会考虑可移植的应用程序。当我在没有安装JRE的其他计算机上运行exe jar时,出现如

  • 问题内容: 将iPhone应用程序移植到Android的最有效方法是什么?我知道苹果不喜欢第三方非目标C平台为其平台生成代码…但是有没有可以将iPhone应用程序转换为Android友好代码的东西? 如果不是,那么人们如何为他们现有的iPhone应用程序创建Android版本? 谢谢 问题答案: 没有任何东西可以移植您的应用程序。您可以使用第三方工具来创建可同时在两者中使用的应用程序。这就是Tit

  • 本文介绍了如何基于 CubeMX 移植 RT-Thread Nano,并说明生成代码工程的步骤。 RT-Thread Nano 已集成在 CubeMX 中,可以直接在 IDE 中进行下载添加。本文档介绍了如何使用 CubeMX 移植 RT-Thread Nano,并以一个 stm32f103 的基础工程作为示例进行讲解。 移植 Nano 的主要步骤: 准备一个 CubeMX 基础工程,并获取 RT

  • 本文介绍了如何基于 IAR 移植 RT-Thread Nano,并以一个 stm32f103 的基础工程作为示例进行讲解。 移植 Nano 的主要步骤: 准备一个基础的 IAR 工程,并获取 RT-Thread Nano 压缩包源码。 在基础工程中添加 RT-Thread Nano 源码,添加相应头文件路径。 适配 Nano,主要从 中断、时钟、内存、应用 这几个方面进行适配,实现移植。 最后可对

  • 本文介绍如何基于 Keil MDK 移植 RT-Thread Nano ,并以一个 stm32f103 的基础工程作为示例进行讲解。 RT-Thread Nano 已集成在 Keil MDK 中,可以直接在 IDE 中进行下载添加。本文档介绍了如何使用 MDK 移植 RT-Thread Nano,并以一个 stm32f103 的基础工程作为示例进行讲解。 移植 Nano 的主要步骤: 准备一个基础

  • 目标 了解对象或对象集合如何变成应用程序 使用 Eclipse 创建驱动程序类 应用程序入口点 所有 Java 应用程序都需要一个入口点,让 Java 运行时知道将从这里开始执行代码。这个入口点就是 main() 方法。域对象(即应用程序的业务域 中包含的对象,例如 Person 和 Employee)通常没有 main() 方法,但每个应用程序中必须至少有一个类。 众所周知,Person 和它的