运用java开发OpenCV

获取适当的 OpenCV

从版本 2.4.4 开始,OpenCV 包含桌面 Java 绑定。

下载

获取它的最简单方法是从 OpenCV SourceForge 存储库下载版本 2.4.4 或更高版本的相应软件包。

注意

Windows 用户可以在包内的文件夹中找到 Java 开发所需的预构建文件。对于其他操作系统,需要从源代码构建 OpenCV。opencv/build/java/

获取 OpenCV 源代码的另一种选择是克隆 OpenCV git 存储库。为了使用 Java 绑定构建 OpenCV,您需要安装 JDK(Java 开发工具包)(我们推荐 Oracle/Sun JDK 6 或 7)、Apache Ant 和 Python v2.6 或更高版本。

让我们构建 OpenCV:

git clone git://github.com/opencv/opencv.git
光盘opencv
git checkout 2.4
mkdir 构建
CD 构建

生成 Makefile 或 MS Visual Studio* 解决方案,或用于在系统中构建可执行文件的任何内容:

cmake -DBUILD_SHARED_LIBS=关闭 ..

cmake -DBUILD_SHARED_LIBS=OFF -G “Visual Studio 10” ..

注意

当 OpenCV 构建为一组静态库(-DBUILD_SHARED_LIBS=OFF 选项)时,Java 绑定动态库就足够了,即不依赖于其他 OpenCV 库,而是包含所有 OpenCV 代码。

检查 CMake 的输出,并确保 java 是“要构建”的模块之一。如果没有,则可能是缺少依赖项。您应该通过查看 CMake 输出中查找未找到的任何与 Java 相关的工具并安装它们来进行故障排除。

cmake_output.png

注意

如果 CMake 在系统中找不到 Java,请在运行之前将 JAVA_HOME 环境变量设置为已安装 JDK 的路径。例如:

导出JAVA_HOME=/usr/lib/jvm/java-6-oracle
cmake -DBUILD_SHARED_LIBS=关闭 ..

现在开始构建:

制造 -j8

msbuild /m OpenCV.sln /t:Build /p:Configuration=Release /v:m

除此之外,还将创建一个包含 Java 接口 () 的 jar 和一个包含 Java 绑定和所有 OpenCV 内容(或分别)的本机动态库。我们稍后会用到这些文件。bin/opencv-244.jarlib/libopencv_java244.sobin/Release/opencv_java244.dll

使用 Ant 的 Java 示例

注意

所描述的示例随文件夹中的 OpenCV 库一起提供。opencv/samples/java/ant

  • 创建一个文件夹,您将在其中开发此示例应用程序。
  • 在此文件夹中,使用任何文本编辑器创建包含以下内容的文件:build.xml
    <项目名称=“SimpleSample” basedir=“.” 默认值=“重建-运行”>
    <属性名称=“src.dir=“src”/>
    <属性名称=“lib.dir=“${ocvJarDir}”/>
    <路径 id=“类路径” >
    <文件集 dir=“${lib.dir}” 包括=“**/*.jar”/>
    </路径>
    <属性名称=“build.dir=“build”/>
    <属性名称=“classes.dir=“${build.dir}/classes”/>
    <属性名称=“jar.dir=“${build.dir}/jar”/>
    <属性名称=“主类=“${ant.project.name}”/>
    <目标名称=“clean”>
    <删除 dir=“${build.dir}”/>
    </目标>
    <目标名称=“编译”>
    <mkdir dir=“${classes.dir}”/>
    <javac includeantruntime=“falsesrcdir=“${src.dir}” destdir=“${classes.dir}classpathref=“类路径”/>
    </目标>
    <目标名称=“jardepends=“compile”>
    <mkdir dir=“${jar.dir}”/>
    <jar destfile=“${jar.dir}/${ant.project.name}.jarbasedir=“${classes.dir}” >
    <清单>
    <属性名称=“主类=“${主类}”/>
    </清单>
    </>
    </目标>
    <目标名称=“运行depends=“jar”>
    <java fork=“true类名=“${main-class}”>
    <sysproperty =“java.library.pathpath=“${ocvLibDir}”/>
    <类路径>
    <路径 refid=“类路径”/>
    <路径位置=“${jar.dir}/${ant.project.name}.jar”/>
    </类路径>
    </爪哇岛>
    </目标>
    <目标名称=“重建depends=“clean,jar”/>
    <目标名称=“rebuild-rundepends=“clean,run”/>
    </项目>

    注意

    此 XML 文件可以重用于构建其他 Java 应用程序。它描述了第 3 - 12 行中的通用文件夹结构以及用于编译和运行应用程序的通用目标。重用此 XML 时,不要忘记修改第 1 行中的项目名称,这也是主类的名称(第 14 行)。OpenCV jar 和 jni lib 的路径应作为参数(第 5 行中的“${ocvJarDir}”和第 37 行中的“${ocvLibDir}”),但为方便起见,您可以对这些路径进行硬编码。有关其构建文件格式的详细说明,请参阅 Ant 文档。

  • 在文件旁边创建一个文件夹,并在其中创建一个文件。srcbuild.xmlSimpleSample.java
  • 将以下 Java 代码放入该文件中:SimpleSample.java
    导入 org.opencv.core.Core;
    导入 org.opencv.core.Mat;
    导入 org.opencv.core.CvType;
    导入 org.opencv.core.Scalar;
    简单示例 {
    static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    公共静态无效main(String[] args) {
    System.out.println(“欢迎使用 OpenCV ” + Core.VERSION);
    垫子 m = 新垫子(5, 10, CvType.CV_8UC1, 标量(0));
    System.out.println(“OpenCV 垫子:” + m);
    垫子 mr1 = m.row(1);
    mr1.setTo(标量(1));
    垫子 mc5 = m.col(5);
    mc5.setTo(标量(5));
    System.out.println(“OpenCV 垫数据:\n” + m.dump());
    }
    }
  • 在控制台中包含以下内容的文件夹中运行以下命令:build.xml

    蚂蚁 -DocvJarDir=path/to/dir/containing/opencv-244.jar -DocvLibDir=path/to/dir/containing/opencv_java244/native/library

    例如:

    蚂蚁 -DocvJarDir=X:\opencv-2.4.4\bin -DocvLibDir=X:\opencv-2.4.4\bin\Release

    该命令应启动 [re]build 并运行示例。您应该在屏幕上看到如下内容:

    ant_output.png

适用于 Java 和 Scala 的 SBT 项目

现在,我们将使用 SBT 创建一个简单的 Java 应用程序。这是对不熟悉此构建工具的人的简要介绍。我们之所以使用 SBT,是因为它特别简单和强大。

首先,按照 SBT 网站上的说明下载并安装 SBT。

接下来,导航到您希望应用程序源所在的新目录(在目录外部)。我们称它为“JavaSample”,并为它创建一个目录:opencv

CD<opencv 之外的某个地方>
mkdir JavaSample

现在,我们将创建必要的文件夹和一个 SBT 项目:

cd Java示例
mkdir -p src/main/java # 这是 SBT 希望找到 Java 源代码的地方
mkdir project # 这是构建定义所在的位置

现在在您喜欢的编辑器中打开并粘贴以下内容。它定义了您的项目:project/build.scala

导入sbt._
导入Keys._
对象 JavaSampleBuild 扩展 Build {
def scalaSettings = Seq(
scalaVersion := “2.10.0”,
scalacOptions ++= Seq(
“-优化”,
“-未选中”,
“-弃用”
)
)
def buildSettings =
Project.defaultSettings ++
scala设置
惰性值根 = {
val settings = buildSettings ++ Seq(name := “JavaSample”)
Project(id = “JavaSample”, base = file(“.”), settings = settings)
}
}

现在编辑并粘贴以下内容。这将启用 Eclipse 项目的自动生成:project/plugins.sbt

addSbtPlugin(“com.typesafe.sbteclipse” % “sbteclipse-plugin” % “2.1.0”)

现在从根目录运行 sbt,然后从 SBT 中运行 eclipse 以生成一个 eclipse 项目:JavaSample

sbt # 启动 sbt 控制台
eclipse # 在 sbt 控制台中运行 “eclipse”

您应该看到如下内容:

sbt_eclipse.png

现在,您可以使用 Import ... -> Existing projects into workspace 将 SBT 项目导入 Eclipse。对于指南来说,是否真的这样做是可选的;我们将使用 SBT 来构建项目,因此如果您选择使用 Eclipse,它将仅用作文本编辑器。

要测试一切是否正常,请创建一个简单的“Hello OpenCV”应用程序。为此,请创建一个包含以下内容的文件:src/main/java/HelloOpenCV.java

公共HelloOpenCV {
公共静态无效main(String[] args) {
System.out.println(“你好,OpenCV”);
}

}

现在从 sbt 控制台执行 run,或者更简洁地说,从命令行运行 sbt run:

SBT 运行

您应该看到如下内容:

sbt_run.png

运行 SBT 示例

现在,我们将使用 OpenCV 创建一个简单的人脸检测应用程序。

首先,创建一个文件夹并将 OpenCV jar 复制到其中。缺省情况下,SBT 会将 lib 文件夹中的 jar 添加到 Java 库搜索路径中。您可以选择重新运行 sbt eclipse 来更新 Eclipse 项目。lib/

mkdir 库
cp <opencv_dir>/build/bin/opencv_<版本>.jar lib/
SBT 日食

接下来,创建目录并将此 Lena 映像下载到其中:src/main/resources

lena.png

确保它被称为 .resources 目录中的项在运行时可供 Java 应用程序使用。"lena.png"

接下来,从以下目录复制:lbpcascade_frontalface.xmlopencv/data/lbpcascades/resources

cp <opencv_dir>/data/lbpcascades/lbpcascade_frontalface.xml src/main/resources/

现在修改 src/main/java/HelloOpenCV.java,使其包含以下 Java 代码:

导入 org.opencv.core.Core;
导入 org.opencv.core.Mat;
导入 org.opencv.core.MatOfRect;
导入 org.opencv.core.Point;
导入 org.opencv.core.Rect;
导入 org.opencv.core.Scalar;
导入 org.opencv.imgcodecs.Imgcodecs;
导入 org.opencv.objdetect.CascadeClassifier;
//
检测图像中的人脸,在人脸周围绘制方框,并写入结果
更改为“faceDetection.png”。
//
检测脸演示 {
公共无效运行() {
System.out.println(“\n正在运行 DetectFaceDemo”);
从资源中的级联文件创建人脸检测器
目录。
CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource(“/lbpcascade_frontalface.xml”).getPath());
垫子图像 = Imgcodecs.imread(getClass().getResource(“/lena.png”).getPath());
检测图像中的人脸。
MatOfRect 是 Rect 的一个特殊容器类。
MatOfRect faceDetections = MatOfRect();
faceDetector.detectMultiScale(图像, faceDetections);
System.out.println(String.format(“检测到 %s 人脸”, faceDetections.toArray().length));
在每个面周围绘制一个边界框。
for (Rect rect : faceDetections.toArray()) {
Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
}
保存可视化检测。
字符串文件名 = “faceDetection.png”;
System.out.println(String.format(“写入 %s”,文件名));
Imgcodecs.imwrite(文件名,图像);
}
}
公共HelloOpenCV {
公共静态无效main(String[] args) {
System.out.println(“你好,OpenCV”);
加载本机库。
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
新增功能检测FaceDemo().run();
}
}

请注意对 System.loadLibrary(Core.NATIVE_LIBRARY_NAME) 的调用。在使用任何本机 OpenCV 方法之前,必须为每个 Java 进程执行一次此命令。如果不调用它,则会收到 UnsatisfiedLink 错误。如果在 OpenCV 已经加载时尝试加载它,您也会收到错误。

现在使用“sbt run”运行人脸检测应用程序:

SBT 运行

您应该看到如下内容:

sbt_run_face.png

它还应该将下图写入:faceDetection.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/316948.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RK3568驱动指南|第十二篇 GPIO子系统-第133章 GPIO操作函数实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

【Arco】表格自定义信息布局

效果 <template><!-- 表格 --><a-table :data"data" style"margin-top: 30px" :bordered"false"><template #columns><a-table-columntitle"商品信息":header-cell-style"{ paddingLeft: 30px }&qu…

MySQL夯实之路-存储引擎深入浅出

innoDB Mysql4.1以后的版本将表的数据和索引放在单独的文件中 采用mvcc来支持高并发&#xff0c;实现了四个标准的隔离级别&#xff0c;默认为可重复读&#xff0c;并且通过间隙锁&#xff08;next-key locking&#xff09;策略防止幻读&#xff08;查询的行中的间隙也会锁定…

Centos7安装K8S

Centos7安装K8S 安装过程中没有出现的错误可以往下 根据以前一些博主写的博客&#xff0c;在小阳翻了不下几十篇博客之后&#xff0c;我果断是放弃了&#xff0c;于是找到了官网地址&#xff0c;然后也有坑 1. 关闭防火墙 systemctl stop firewalld systemctl disable firew…

ssm基于Javaweb的网上奶茶店系统的设计与实现论文

摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&#xff0c;让整个世界都可以即时通话…

助力工业园区作业违规行为检测预警,基于YOLOv8【n/s/m/l/x】全系列参数模型开发构建工业园区场景下作业人员违规行为检测识别系统

在很多工业园区生产作业场景下保障合规合法进行作业生产操作&#xff0c;对于保护工人生命安全降低安全隐患有着非常重要的作用&#xff0c;但是往往在实际的作业生产中&#xff0c;因为一个安全观念的淡薄或者是粗心大意&#xff0c;对于纪律约束等意思薄弱&#xff0c;导致在…

宝塔安装redis并且远程连接redis教程

第一步&#xff1a;搜索redis并安装 第二步&#xff1a;在防火墙添加端口6379 第三步&#xff1a;查看宝塔防火墙是否开启了6379端口 firewall-cmd --zonepublic --list-ports 很显然并没有开启 第四步&#xff1a;开启防火墙的6379端口 firewall-cmd --zonepublic --add-po…

Linux学习记录——사십이 高级IO(3)--- Poll型服务器

文章目录 1、认识poll接口2、实现3、特点 1、认识poll接口 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);// pollfd结构 struct pollfd {int fd; /* file descriptor */short events; /* requested events */short revents; /* returned…

Linux系统SSH远程管理服务

目录 一、SSH协议是什么&#xff1f; 1、SSH协议的定义&#xff1a; 2、SSH协议的优点 3、SSH的客户端与服务端 4、SSH的原理 4.1公钥首次连接原理 4.2ssh远程登录 4.3使用简单的SSH远程登录 二、OpenSSH服务器 1、OpenSSH简介 2、配置Openssh服务端 3、SSH服务的最…

Unity中URP中的光照简介

文章目录 前言URP下的光照在Unity中的设置1、主灯设置2、额外灯设置3、反射光设置 前言 我们在这篇文章开始了解URP下的光照。 URP下的光照在Unity中的设置 1、主灯设置 主灯可以选择 禁用 或 逐像素 光照 当选择逐像素光照的主灯后 Cast Shadows&#xff1a;可以选择开启 或…

CSS 流光发光按钮

<template><view class="content"><view class="a"><text></text><text></text><text></text><text></text>发光按钮</view></view></template><script></…

HTML标签(一)

目录 HTML语法规范 基本语法概述 标签关系 HTML基本结构标签 第一个HTML网页 开发工具 VSCode的使用&#xff1a; VScode工具生成骨架标签新增代码 文档类型声明标签 lang语言种类 字符集 总结 HTML常用标签 标签语义 标题标签 段落标签 换行标签 文本格式化…

如何公网远程访问Linux AMH服务器管理面板【内网穿透】

⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录 ⛳️ 推荐1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6…

【UEFI基础】EDK网络框架(ARP)

ARP ARP协议说明 从这里开始涉及到的网络协议都是比较通用的了&#xff0c;在一般的TCP/IP四层模型中都能够看到这些内容&#xff0c;不过这里主要介绍的还是其在BIOS下的实现&#xff0c;但是在此之前还是需要先说明ARP的作用。 ARP的全称是Address Resolution Protocol&am…

AI-数学-高中-4.函数表达式特性-要变一起变

求f(x):换元法&#xff1a;左边代换时&#xff0c;右边也要同时替换&#xff0c;原作者视频&#xff1a;函数】1引导课&#xff1a;高中为什么用f(x)_哔哩哔哩_bilibili 1.什么是函数&#xff1a;给定任意一个x&#xff0c;都有唯一确定的y与之对应&#xff0c;这种x与y的关系就…

如何提高匹配的精确度(多次学习)

我们工业自动化中&#xff0c;视觉软件匹配&#xff0c;都是学习一次&#xff0c;比如找到轮廓&#xff0c;旋转360度&#xff0c;也就是有360个轮廓&#xff0c;然后到图像中去找任意角度的目标。 这样的学习并不能一而概括全。 所以&#xff0c;我借鉴ai的方法&#xff0c;…

【计算机组成原理】指令流水线的三种冒险情况(Hazards)

冒险 在计算机架构中&#xff0c;流水线冒险是指在指令流水线的执行过程中由于数据相关性或控制相关性而导致的一种性能问题。指令流水线是将指令执行过程划分为多个阶段&#xff0c;这样可以同时处理多条指令&#xff0c;从而提高指令执行的效率。然而&#xff0c;流水线执行…

阳光保险选择OceanBase稳定运行超700天

阳光保险集团成立于 2005 年 7 月&#xff0c;旗下拥有财产保险、人寿保险、信用保证保险、资产管理等多家专业子公司&#xff0c;是全球市场化企业中成长最快的集团公司之一&#xff0c;目前位列中国保险行业前八。随着数字化升级趋势的不断加速&#xff0c;很多企业产生将软硬…

Kali Linux——aircrack-ng无线教程

目录 一、准备 二、案例 1、连接usb无线网卡 2、查看网卡信息 3、开启网卡监听 4、扫描wifi信号 5、抓取握手包 6、强制断开连接 7、破解握手包 三、预防 一、准备 1、usb无线网卡&#xff08;笔记本也是需要用到&#xff09; 2、密码字典&#xff08;Kali 系统自带…

微信小程序 全局配置||微信小程序 页面配置||微信小程序 sitemap配置

全局配置 小程序根目录下的 app.json 文件用来对微信小程序进行全局配置&#xff0c;决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。 以下是一个包含了部分常用配置选项的 app.json &#xff1a; {"pages": ["pages/index/index",&q…
最新文章