從OpenCV 2.4.4開(kāi)始,OpenCV支持桌面Java開(kāi)發(fā),使用與Android開(kāi)發(fā)幾乎相同的界面。本指南將幫助您使用OpenCV創(chuàng)建您的第一個(gè)Java(或Scala)應(yīng)用程序。我們將使用Apache Ant或Simple 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)介。
在本指南中,我們將:
使用相同的過(guò)程samples/java
在OpenCV存儲(chǔ)庫(kù)的文件夾中創(chuàng)建樣本,因此如果丟失,請(qǐng)查閱這些文件。
從版本2.4.4開(kāi)始OpenCV包括桌面Java綁定。
最簡(jiǎn)單的方法是從OpenCV SourceForge存儲(chǔ)庫(kù)中下載相應(yīng)的2.4.4或更高版本的軟件包。
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”..
檢查CMake的輸出,并確保java是“待構(gòu)建”模塊之一。如果沒(méi)有,可能你缺少依賴(lài)。您應(yīng)該通過(guò)查看CMake輸出來(lái)查找未找到并安裝的任何與Java相關(guān)的工具進(jì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.so
或bin/Release/opencv_java244.dll
分別))的本地動(dòng)態(tài)庫(kù)的jar 。稍后我們會(huì)使用這些文件。
opencv/samples/java/ant
文件夾中提供了描述的示例OpenCV庫(kù)。< 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 >
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)該在屏幕上看到這樣的東西:
現(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)該看到這樣的東西:
您現(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)該看到這樣的東西:
現(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圖像下載到其中:
確保它被調(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)該看到這樣的東西:
它也應(yīng)該寫(xiě)下面的圖像到faceDetection.png
:
你完成了!現(xiàn)在,您有一個(gè)使用OpenCV的示例Java應(yīng)用程序,因此您可以自己開(kāi)始工作。祝你好運(yùn)!
更多建議: