Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Java interface to OpenCV, FFmpeg, and more

License

NotificationsYou must be signed in to change notification settings

bytedeco/javacv

Repository files navigation

GitterMaven CentralSonatype Nexus (Snapshots)Build StatusCommercial support:xscode

Introduction

JavaCV uses wrappers from theJavaCPP Presets of commonly used libraries by researchers in the field of computer vision (OpenCV,FFmpeg,libdc1394,FlyCapture,Spinnaker,OpenKinect,librealsense,CL PS3 Eye Driver,videoInput,ARToolKitPlus,flandmark,Leptonica, andTesseract) and provides utility classes to make their functionality easier to use on the Java platform, including Android.

JavaCV also comes with hardware accelerated full-screen image display (CanvasFrame andGLCanvasFrame), easy-to-use methods to execute code in parallel on multiple cores (Parallel), user-friendly geometric and color calibration of cameras and projectors (GeometricCalibrator,ProCamGeometricCalibrator,ProCamColorCalibrator), detection and matching of feature points (ObjectFinder), a set of classes that implement direct image alignment of projector-camera systems (mainlyGNImageAligner,ProjectiveTransformer,ProjectiveColorTransformer,ProCamTransformer, andReflectanceInitializer), a blob analysis package (Blobs), as well as miscellaneous functionality in theJavaCV class. Some of these classes also have an OpenCL and OpenGL counterpart, their names ending withCL or starting withGL, i.e.:JavaCVCL,GLCanvasFrame, etc.

To learn how to use the API, since documentation currently lacks, please refer to theSample Usage section below as well as thesample programs, including two for Android (FacePreview.java andRecordActivity.java), also found in thesamples directory. You may also find it useful to refer to the source code ofProCamCalib andProCamTracker as well asexamples ported from OpenCV2 Cookbook and the associatedwiki pages.

Please keep me informed of any updates or fixes you make to the code so that I may integrate them into the next release. Thank you! And feel free to ask questions onthe mailing list orthe discussion forum if you encounter any problems with the software! I am sure it is far from perfect...

Downloads

Archives containing JAR files are available asreleases. The binary archive contains builds for Android, iOS, Linux, Mac OS X, and Windows. The JAR files for specific child modules or platforms can also be obtained individually from theMaven Central Repository.

To install manually the JAR files, follow the instructions in theManual Installation section below.

We can also have everything downloaded and installed automatically with:

  • Maven (inside thepom.xml file)
  <dependency>    <groupId>org.bytedeco</groupId>    <artifactId>javacv-platform</artifactId>    <version>1.5.11</version>  </dependency>
  • Gradle (inside thebuild.gradle.kts orbuild.gradle file)
  dependencies {    implementation("org.bytedeco:javacv-platform:1.5.11")  }
  • Leiningen (inside theproject.clj file)
:dependencies [    [org.bytedeco/javacv-platform"1.5.11"]  ]
  • sbt (inside thebuild.sbt file)
  libraryDependencies+="org.bytedeco"%"javacv-platform"%"1.5.11"

This downloads binaries for all platforms, but to get binaries for only one platform we can set thejavacpp.platform system property (via the-D command line option) to something likeandroid-arm,linux-x86_64,macosx-x86_64,windows-x86_64, etc. Please refer to theREADME.md file of the JavaCPP Presets for details. Another option available to Gradle users isGradle JavaCPP, and similarly for Scala users there isSBT-JavaCV.

Required Software

To use JavaCV, you will first need to download and install the following software:

Further, although not always required, some functionality of JavaCV also relies on:

Finally, please make sure everything has the same bitness:32-bit and 64-bit modules do not mix under any circumstances.

Manual Installation

Simply put all the desired JAR files (opencv*.jar,ffmpeg*.jar, etc.), in addition tojavacpp.jar andjavacv.jar, somewhere in your class path. Here are some more specific instructions for common cases:

NetBeans (Java SE 7 or newer):

  1. In the Projects window, right-click the Libraries node of your project, and select "Add JAR/Folder...".
  2. Locate the JAR files, select them, and click OK.

Eclipse (Java SE 7 or newer):

  1. Navigate to Project > Properties > Java Build Path > Libraries and click "Add External JARs...".
  2. Locate the JAR files, select them, and click OK.

Visual Studio Code (Java SE 7 or newer):

  1. Navigate to Java Projects > Referenced Libraries, and click+.
  2. Locate the JAR files, select them, and click OK.

IntelliJ IDEA (Android 7.0 or newer):

  1. Follow the instructions on this page:http://developer.android.com/training/basics/firstapp/
  2. Copy all the JAR files into theapp/libs subdirectory.
  3. Navigate to File > Project Structure > app > Dependencies, click+, and select "2 File dependency".
  4. Select all the JAR files from thelibs subdirectory.
  5. In the AndroidManifest.xml addandroid:extractNativeLibs="true"

After that, the wrapper classes for OpenCV and FFmpeg, for example, can automatically access all of their C/C++ APIs:

Sample Usage

The class definitions are basically ports to Java of the original header files in C/C++, and I deliberately decided to keep as much of the original syntax as possible. For example, here is a method that tries to load an image file, smooth it, and save it back to disk:

importorg.bytedeco.opencv.opencv_core.*;importorg.bytedeco.opencv.opencv_imgproc.*;importstaticorg.bytedeco.opencv.global.opencv_core.*;importstaticorg.bytedeco.opencv.global.opencv_imgproc.*;importstaticorg.bytedeco.opencv.global.opencv_imgcodecs.*;publicclassSmoother {publicstaticvoidsmooth(Stringfilename) {Matimage =imread(filename);if (image !=null) {GaussianBlur(image,image,newSize(3,3),0);imwrite(filename,image);        }    }}

JavaCV also comes with helper classes and methods on top of OpenCV and FFmpeg to facilitate their integration to the Java platform. Here is a small demo program demonstrating the most frequently useful parts:

importjava.io.File;importjava.net.URL;importorg.bytedeco.javacv.*;importorg.bytedeco.javacpp.*;importorg.bytedeco.javacpp.indexer.*;importorg.bytedeco.opencv.opencv_core.*;importorg.bytedeco.opencv.opencv_imgproc.*;importorg.bytedeco.opencv.opencv_calib3d.*;importorg.bytedeco.opencv.opencv_objdetect.*;importstaticorg.bytedeco.opencv.global.opencv_core.*;importstaticorg.bytedeco.opencv.global.opencv_imgproc.*;importstaticorg.bytedeco.opencv.global.opencv_calib3d.*;importstaticorg.bytedeco.opencv.global.opencv_objdetect.*;publicclassDemo {publicstaticvoidmain(String[]args)throwsException {StringclassifierName =null;if (args.length >0) {classifierName =args[0];        }else {URLurl =newURL("https://raw.github.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_alt.xml");Filefile =Loader.cacheResource(url);classifierName =file.getAbsolutePath();        }// We can "cast" Pointer objects by instantiating a new object of the desired class.CascadeClassifierclassifier =newCascadeClassifier(classifierName);if (classifier ==null) {System.err.println("Error loading classifier file\"" +classifierName +"\".");System.exit(1);        }// The available FrameGrabber classes include OpenCVFrameGrabber (opencv_videoio),// DC1394FrameGrabber, FlyCapture2FrameGrabber, OpenKinectFrameGrabber, OpenKinect2FrameGrabber,// RealSenseFrameGrabber, RealSense2FrameGrabber, PS3EyeFrameGrabber, VideoInputFrameGrabber, and FFmpegFrameGrabber.FrameGrabbergrabber =FrameGrabber.createDefault(0);grabber.start();// CanvasFrame, FrameGrabber, and FrameRecorder use Frame objects to communicate image data.// We need a FrameConverter to interface with other APIs (Android, Java 2D, JavaFX, Tesseract, OpenCV, etc).OpenCVFrameConverter.ToMatconverter =newOpenCVFrameConverter.ToMat();// FAQ about IplImage and Mat objects from OpenCV:// - For custom raw processing of data, createBuffer() returns an NIO direct//   buffer wrapped around the memory pointed by imageData, and under Android we can//   also use that Buffer with Bitmap.copyPixelsFromBuffer() and copyPixelsToBuffer().// - To get a BufferedImage from an IplImage, or vice versa, we can chain calls to//   Java2DFrameConverter and OpenCVFrameConverter, one after the other.// - Java2DFrameConverter also has static copy() methods that we can use to transfer//   data more directly between BufferedImage and IplImage or Mat via Frame objects.MatgrabbedImage =converter.convert(grabber.grab());intheight =grabbedImage.rows();intwidth =grabbedImage.cols();// Objects allocated with `new`, clone(), or a create*() factory method are automatically released// by the garbage collector, but may still be explicitly released by calling deallocate().// You shall NOT call cvReleaseImage(), cvReleaseMemStorage(), etc. on objects allocated this way.MatgrayImage =newMat(height,width,CV_8UC1);MatrotatedImage =grabbedImage.clone();// The OpenCVFrameRecorder class simply uses the VideoWriter of opencv_videoio,// but FFmpegFrameRecorder also exists as a more versatile alternative.FrameRecorderrecorder =FrameRecorder.createDefault("output.avi",width,height);recorder.start();// CanvasFrame is a JFrame containing a Canvas component, which is hardware accelerated.// It can also switch into full-screen mode when called with a screenNumber.// We should also specify the relative monitor/camera response for proper gamma correction.CanvasFrameframe =newCanvasFrame("Some Title",CanvasFrame.getDefaultGamma()/grabber.getGamma());// Let's create some random 3D rotation...MatrandomR    =newMat(3,3,CV_64FC1),randomAxis =newMat(3,1,CV_64FC1);// We can easily and efficiently access the elements of matrices and images// through an Indexer object with the set of get() and put() methods.DoubleIndexerRidx =randomR.createIndexer(),axisIdx =randomAxis.createIndexer();axisIdx.put(0, (Math.random() -0.5) /4,                       (Math.random() -0.5) /4,                       (Math.random() -0.5) /4);Rodrigues(randomAxis,randomR);doublef = (width +height) /2.0;Ridx.put(0,2,Ridx.get(0,2) *f);Ridx.put(1,2,Ridx.get(1,2) *f);Ridx.put(2,0,Ridx.get(2,0) /f);Ridx.put(2,1,Ridx.get(2,1) /f);System.out.println(Ridx);// We can allocate native arrays using constructors taking an integer as argument.PointhatPoints =newPoint(3);while (frame.isVisible() && (grabbedImage =converter.convert(grabber.grab())) !=null) {// Let's try to detect some faces! but we need a grayscale image...cvtColor(grabbedImage,grayImage,CV_BGR2GRAY);RectVectorfaces =newRectVector();classifier.detectMultiScale(grayImage,faces);longtotal =faces.size();for (longi =0;i <total;i++) {Rectr =faces.get(i);intx =r.x(),y =r.y(),w =r.width(),h =r.height();rectangle(grabbedImage,newPoint(x,y),newPoint(x +w,y +h),Scalar.RED,1,CV_AA,0);// To access or pass as argument the elements of a native array, call position() before.hatPoints.position(0).x(x -w /10     ).y(y -h /10);hatPoints.position(1).x(x +w *11 /10).y(y -h /10);hatPoints.position(2).x(x +w /2      ).y(y -h /2 );fillConvexPoly(grabbedImage,hatPoints.position(0),3,Scalar.GREEN,CV_AA,0);            }// Let's find some contours! but first some thresholding...threshold(grayImage,grayImage,64,255,CV_THRESH_BINARY);// To check if an output argument is null we may call either isNull() or equals(null).MatVectorcontours =newMatVector();findContours(grayImage,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);longn =contours.size();for (longi =0;i <n;i++) {Matcontour =contours.get(i);Matpoints =newMat();approxPolyDP(contour,points,arcLength(contour,true) *0.02,true);drawContours(grabbedImage,newMatVector(points), -1,Scalar.BLUE);            }warpPerspective(grabbedImage,rotatedImage,randomR,rotatedImage.size());FramerotatedFrame =converter.convert(rotatedImage);frame.showImage(rotatedFrame);recorder.record(rotatedFrame);        }frame.dispose();recorder.stop();grabber.stop();    }}

Furthermore, after creating apom.xml file with the following content:

<project>    <modelVersion>4.0.0</modelVersion>    <groupId>org.bytedeco.javacv</groupId>    <artifactId>demo</artifactId>    <version>1.5.11</version>    <properties>        <maven.compiler.source>1.7</maven.compiler.source>        <maven.compiler.target>1.7</maven.compiler.target>    </properties>    <dependencies>        <dependency>            <groupId>org.bytedeco</groupId>            <artifactId>javacv-platform</artifactId>            <version>1.5.11</version>        </dependency><!-- Additional dependencies required to use CUDA and cuDNN-->        <dependency>            <groupId>org.bytedeco</groupId>            <artifactId>opencv-platform-gpu</artifactId>            <version>4.10.0-1.5.11</version>        </dependency><!-- Optional GPL builds with (almost) everything enabled-->        <dependency>            <groupId>org.bytedeco</groupId>            <artifactId>ffmpeg-platform-gpl</artifactId>            <version>7.1-1.5.11</version>        </dependency>    </dependencies>    <build>        <sourceDirectory>.</sourceDirectory>    </build></project>

And by placing the source code above inDemo.java, or similarly for other classes found in thesamples, we can use the following command to have everything first installed automatically and then executed by Maven:

 $ mvn compile exec:java -Dexec.mainClass=Demo

Note: In case of errors, please make sure that theartifactId in thepom.xml file readsjavacv-platform, notjavacv only, for example. The artifactjavacv-platform adds all the necessary binary dependencies.

Build Instructions

If the binary files available above are not enough for your needs, you might need to rebuild them from the source code. To this end, the project files were created for:

Once installed, simply call the usualmvn install command for JavaCPP, its Presets, and JavaCV. By default, no other dependencies than a C++ compiler for JavaCPP are required. Please refer to the comments inside thepom.xml files for further details.

Instead of building the native libraries manually, we can runmvn install for JavaCV only and rely on the snapshot artifacts from the CI builds:


Project lead: Samuel Audetsamuel.audetat gmail.com
Developer site:https://github.com/bytedeco/javacv
Discussion group:http://groups.google.com/group/javacv


[8]ページ先頭

©2009-2025 Movatter.jp