OpenCV Java開(kāi)發(fā)教程

2018-08-26 10:41 更新

從OpenCV 2.4.4開(kāi)始,OpenCV支持桌面Java開(kāi)發(fā),使用與Android開(kāi)發(fā)幾乎相同的界面。本指南將幫助您使用OpenCV創(chuàng)建您的第一個(gè)Java(或Scala)應(yīng)用程序。我們將使用Apache AntSimple Build Tool(SBT)來(lái)構(gòu)建應(yīng)用程序。

如果要使用Eclipse請(qǐng)參考:使用OpenCV Java與Eclipse。有關(guān)本指南的進(jìn)一步閱讀,請(qǐng)參閱Android開(kāi)發(fā)教程簡(jiǎn)介。

我們將在本指南中做什么

在本指南中,我們將:

  • 獲取OpenCV與桌面Java支持
  • 創(chuàng)建一個(gè)Ant或SBT項(xiàng)目
  • 在Java或Scala中編寫(xiě)一個(gè)簡(jiǎn)單的OpenCV應(yīng)用程序

使用相同的過(guò)程samples/java在OpenCV存儲(chǔ)庫(kù)的文件夾中創(chuàng)建樣本,因此如果丟失,請(qǐng)查閱這些文件。

獲得正確的OpenCV

從版本2.4.4開(kāi)始OpenCV包括桌面Java綁定。

下載

最簡(jiǎn)單的方法是從OpenCV SourceForge存儲(chǔ)庫(kù)中下載相應(yīng)的2.4.4或更高版本的軟件包。

注意
Windows用戶可以opencv/build/java/在包中的文件夾中找到Java開(kāi)發(fā)所需的預(yù)構(gòu)建文件對(duì)于其他操作系統(tǒng),需要從源代碼構(gòu)建OpenCV。

獲取OpenCV源的另一個(gè)選擇是克隆OpenCV git存儲(chǔ)庫(kù)。為了使用Java綁定構(gòu)建OpenCV,您需要安裝JDK(Java Development Kit)(我們推薦使用Oracle / Sun JDK 6或7),Apache Ant和Python v2.6或更高版本。

建立

我們來(lái)構(gòu)建OpenCV:

git clone git://github.com/opencv/opencv.git
cd opencv
git checkout 2.4
mkdir build
cd build

生成Makefile或MS Visual Studio *解決方案,或用于在系統(tǒng)中構(gòu)建可執(zhí)行文件的任何內(nèi)容:

cmake -DBUILD_SHARED_LIBS = OFF ..

或者

cmake -DBUILD_SHARED_LIBS = OFF -G“Visual Studio 10”..
注意
當(dāng)OpenCV構(gòu)建為一組靜態(tài)庫(kù)(-DBUILD_SHARED_LIBS = OFF選項(xiàng))時(shí),Java綁定動(dòng)態(tài)庫(kù)是足夠的,即不依賴(lài)于其他OpenCV庫(kù),而是包含所有OpenCV代碼。

檢查CMake的輸出,并確保java是“待構(gòu)建”模塊之一。如果沒(méi)有,可能你缺少依賴(lài)。您應(yīng)該通過(guò)查看CMake輸出來(lái)查找未找到并安裝的任何與Java相關(guān)的工具進(jìn)行故障排除。

OpenCV Java開(kāi)發(fā)教程

注意
如果CMake在您的系統(tǒng)中找不到Java,則在運(yùn)行JAVA_HOME環(huán)境變量之前,使用安裝JDK的路徑設(shè)置JAVA_HOME環(huán)境變量。例如:
export JAVA_HOME=/usr/lib/jvm/java-6-oracle
cmake -DBUILD_SHARED_LIBS=OFF ..

現(xiàn)在開(kāi)始構(gòu)建:

make -j8

要么

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

除此之外,還將創(chuàng)建一個(gè)包含Java接口(bin/opencv-244.jar)和包含Java綁定和所有OpenCV內(nèi)容(lib/libopencv_java244.sobin/Release/opencv_java244.dll分別))的本地動(dòng)態(tài)庫(kù)的jar 。稍后我們會(huì)使用這些文件。

Ant的Java示例

注意
opencv/samples/java/ant文件夾中提供了描述的示例OpenCV庫(kù)。
  • 創(chuàng)建一個(gè)文件夾,您將開(kāi)發(fā)此示例應(yīng)用程序。
  • 在此文件夾中build.xml,使用任何文本編輯器創(chuàng)建具有以下內(nèi)容的文件:
< project  name = “SimpleSample”  basedir = “?!? default = “rebuild-run” >
    < property  name = “src.dir”      value = “src” />
    < property  name = “l(fā)ib.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 >
注意
該XML文件可以重用于構(gòu)建其他Java應(yīng)用程序。它描述了第3 - 12行中的通用文件夾結(jié)構(gòu)和用于編譯和運(yùn)行應(yīng)用程序的常用目標(biāo)。當(dāng)重用該XML時(shí),不要忘記修改第1行中的項(xiàng)目名稱(chēng),也是主類(lèi)的名稱(chēng)(第14行)。OpenCV jar和jni lib的路徑預(yù)期為第5行中的參數(shù)(“$ {ocvJarDir}”和第37行中的“$ {ocvLibDir}”),但為方便起見(jiàn),您可以對(duì)這些路徑進(jìn)行硬編碼。有關(guān)其構(gòu)建文件格式的詳細(xì)說(shuō)明,請(qǐng)參閱Ant文檔。
  • 在src文件旁邊創(chuàng)建一個(gè)文件夾build.xml和一個(gè)SimpleSample.java文件。
  • 將以下Java代碼放入SimpleSample.java文件中:
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());
  }
}

在控制臺(tái)中的文件夾中運(yùn)行以下命令build.xml

ant -DocvJarDir = path / to / dir / contained / opencv-244.jar -DocvLibDir = path / to / dir / contained / opencv_java244 / native / library

例如:

ant -DocvJarDir = X:\ opencv-2.4.4 \ bin -DocvLibDir = X:\ opencv-2.4.4 \ bin \ Release

該命令應(yīng)啟動(dòng)[重新建立和運(yùn)行樣品。你應(yīng)該在屏幕上看到這樣的東西:

OpenCV Java開(kāi)發(fā)教程

Java和Scala的SBT項(xiàng)目

現(xiàn)在我們將使用SBT創(chuàng)建一個(gè)簡(jiǎn)單的Java應(yīng)用程序。這是對(duì)不熟悉此構(gòu)建工具的人的簡(jiǎn)要介紹。我們正在使用SBT,因?yàn)樗貏e容易和強(qiáng)大。

首先,使用其網(wǎng)站上的說(shuō)明下載并安裝SBT。

接下來(lái),導(dǎo)航到您想要應(yīng)用程序來(lái)源的新目錄(外部opencv目錄)。讓我們稱(chēng)之為“JavaSample”并創(chuàng)建一個(gè)目錄:

cd <somewhere outside opencv>
mkdir JavaSample

現(xiàn)在我們將創(chuàng)建必要的文件夾和一個(gè)SBT項(xiàng)目:

cd JavaSample
mkdir -p src/main/java # This is where SBT expects to find Java sources
mkdir project # This is where the build definitions live

現(xiàn)在project/build.scala在您最喜歡的編輯器中打開(kāi)并粘貼以下內(nèi)容。它定義了您的項(xiàng)目:

import sbt._
import Keys._
object JavaSampleBuild extends Build {
  def scalaSettings = Seq(
    scalaVersion := "2.10.0",
    scalacOptions ++= Seq(
      "-optimize",
      "-unchecked",
      "-deprecation"
    )
  )
  def buildSettings =
    Project.defaultSettings ++
    scalaSettings
  lazy val root = {
    val settings = buildSettings ++ Seq(name := "JavaSample")
    Project(id = "JavaSample", base = file("."), settings = settings)
  }
}

現(xiàn)在編輯project/plugins.sbt并粘貼以下內(nèi)容。這將啟用Eclipse項(xiàng)目的自動(dòng)生成:

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

現(xiàn)在運(yùn)行sbt從JavaSample根和從SBT運(yùn)行eclipse生成一個(gè)eclipse項(xiàng)目:

sbt # Starts the sbt console
eclipse # Running "eclipse" from within the sbt console

你應(yīng)該看到這樣的東西:

OpenCV Java開(kāi)發(fā)教程

您現(xiàn)在可以使用導(dǎo)入... - >現(xiàn)有項(xiàng)目將SBT項(xiàng)目導(dǎo)入到Eclipse中。無(wú)論您是否實(shí)際執(zhí)行此操作都是可選的指南; 我們將使用SBT來(lái)構(gòu)建項(xiàng)目,所以如果你選擇使用Eclipse,它將作為一個(gè)文本編輯器。

為了測(cè)試一切正常,創(chuàng)建一個(gè)簡(jiǎn)單的“Hello OpenCV”應(yīng)用程序。通過(guò)創(chuàng)建src/main/java/HelloOpenCV.java具有以下內(nèi)容的文件來(lái)執(zhí)行此操作:

public class HelloOpenCV {
  public static void main(String[] args) {
    System.out.println("Hello, OpenCV");
 }
}

現(xiàn)在從sbt控制臺(tái)執(zhí)行運(yùn)行,或者更簡(jiǎn)潔地,從命令行運(yùn)行sbt run:

sbt run

你應(yīng)該看到這樣的東西:

OpenCV Java開(kāi)發(fā)教程

運(yùn)行SBT樣品

現(xiàn)在我們將使用OpenCV創(chuàng)建一個(gè)簡(jiǎn)單的面部檢測(cè)應(yīng)用程序。

首先,創(chuàng)建一個(gè)lib/文件夾并將OpenCV jar復(fù)制到其中。默認(rèn)情況下,SBT將lib文件夾中的jar添加到Java庫(kù)搜索路徑。您可以選擇重新運(yùn)行sbt eclipse來(lái)更新Eclipse項(xiàng)目。

mkdir lib
cp <opencv_dir> / build / bin / opencv_ <version> .jar lib /
sbt eclipse

接下來(lái),創(chuàng)建目錄src/main/resources并將此Lena圖像下載到其中:

OpenCV Java開(kāi)發(fā)教程

確保它被調(diào)用"lena.png"。資源目錄中的項(xiàng)目在運(yùn)行時(shí)可用于Java應(yīng)用程序。

接下來(lái),lbpcascade_frontalface.xml從目錄復(fù)制opencv/data/lbpcascades/到resources

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

現(xiàn)在修改src / main / java / HelloOpenCV.java,因此它包含以下Java代碼:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.objdetect.CascadeClassifier;
//
// Detects faces in an image, draws boxes around them, and writes the results
// to "faceDetection.png".
//
class DetectFaceDemo {
  public void run() {
    System.out.println("\nRunning DetectFaceDemo");
    // Create a face detector from the cascade file in the resources
    // directory.
    CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("/lbpcascade_frontalface.xml").getPath());
    Mat image = Imgcodecs.imread(getClass().getResource("/lena.png").getPath());
    // Detect faces in the image.
    // MatOfRect is a special container class for Rect.
    MatOfRect faceDetections = new MatOfRect();
    faceDetector.detectMultiScale(image, faceDetections);
    System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
    // Draw a bounding box around each face.
    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));
    }
    // Save the visualized detection.
    String filename = "faceDetection.png";
    System.out.println(String.format("Writing %s", filename));
    Imgcodecs.imwrite(filename, image);
  }
}
public class HelloOpenCV {
  public static void main(String[] args) {
    System.out.println("Hello, OpenCV");
    // Load the native library.
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    new DetectFaceDemo().run();
  }
}

請(qǐng)注意對(duì)System.loadLibrary(Core.NATIVE_LIBRARY_NAME)的調(diào)用。必須在使用任何本機(jī)OpenCV方法之前,每個(gè)Java進(jìn)程必須執(zhí)行一次此命令。如果您不打電話,您將收到UnsatisfiedLink錯(cuò)誤。如果您嘗試在已經(jīng)加載OpenCV時(shí)加載OpenCV,您還會(huì)收到錯(cuò)誤。

現(xiàn)在使用`sbt run`運(yùn)行面部檢測(cè)應(yīng)用程序:

sbt run

你應(yīng)該看到這樣的東西:

OpenCV Java開(kāi)發(fā)教程

它也應(yīng)該寫(xiě)下面的圖像到faceDetection.png

OpenCV Java開(kāi)發(fā)教程

你完成了!現(xiàn)在,您有一個(gè)使用OpenCV的示例Java應(yīng)用程序,因此您可以自己開(kāi)始工作。祝你好運(yùn)!


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)