http://blog.csdn.net/kerr1992/article/details/8782778

介绍

JavaCV首先提供了计算机视觉领域研究人员常用的函数库的封装: OpenCV, FFmpeg, libdc1394, PGRFlyCapture, OpenKinect, videoInput, 和 ARToolKitPlus。

可以在com.googlecode.javacv.cpp包命名空间中找到的类,暴露了它们完整的API。此外,utility类使得它们的功能更易于在包括android在内的Java平台上使用。

JavaCV还带有硬件加速的全屏幕图像显示(CanvasFrame和 GLCanvasFrame),易于在多个内核中执行并行代码(并行),用户友好的几何和色彩的相机和投影仪校准(GeometricCalibrator, ProCamGeometricCalibrator, ProCamColorCalibrator),特征点的检测和匹配(ObjectFinder),一组实现相机投影仪系统直接图像校准的类(主要有GNImageAligner, ProjectiveTransformer, ProjectiveColorTransformer, ProCamTransformer,和 ReflectanceInitializer),一个blob分析软件包(Blobs),以及JavaCV类中的其它功能。这些类也有一个OpenCL和OpenGL的对应副本,它们的名字以CL结尾或者以GL开头,例如JavaCVCL、GLCanvasFrame等等。

由于目前缺少学习如何使用这些API的文档,请参阅下面的#OpenCV和FFmpeg快速入门(Quick Start for OpenCV and FFmpeg)部分以及示例程序,包括两个Android程序(FacePreview.java和RecordActivity.java),也可以在示例目录里找到。你可能会发现,参考ProCamCalib和ProCamTracker的源代码以及从OpenCV2Cookbook书上移植的例子、相关维基页面是很有用的。

所需软件

要使用JavaCV,你将需要下载并安装以下软件:

  • 执行的Java SE 6或7

    • OpenJDK http://openjdk.java.net/install/或
    • Sun JDK http://www.oracle.com/technetwork/java/javase/downloads/或
    • IBM JDK http://www.ibm.com/developerworks/java/jdk/或
    • Java SE for Mac OS X http://developer.apple.com/java/ 等
  • OpenCV 2.4.5 http://sourceforge.net/projects/opencvlibrary/files/
    • 针对Linux, Mac OS X, Windows, and Android预编译和打包好的CPPJAR:

      • http://code.google.com/p/javacv/downloads/list

同时请确保你的Java和OpenCV具有相同的位数: 32位和64位的组件在任何情况下不要混用。另外,尽管并非总是必要的,一些JavaCV的功能还依赖于::

  • FFmpeg 1.2.x http://ffmpeg.org/download.html
  • libdc1394 2.1.x 或 2.2.x http://sourceforge.net/projects/libdc1394/files/
  • PGR FlyCapture 1.7~2.3 (仅Windows平台) http://www.ptgrey.com/products/pgrflycapture/
  • OpenKinect http://openkinect.org/
  • CL Eye Platform SDK (仅Windows平台) http://codelaboratories.com/downloads/
  • Android SDK API 8 或更高版本 http://developer.android.com/sdk/
  • 来自JogAmp的组件JOCL和JOGL http://jogamp.org/
  • ARToolKitPlus 2.1.1t http://code.google.com/p/javacv/downloads/list

要修改源代码,请注意这些已被创建的项目文件:

  • Maven 2 或 3 http://maven.apache.org/download.html
  • JavaCPP 0.5 http://code.google.com/p/javacpp/

要重建的话,只需调用为JavaCPP和JavaCV准备的常用mvn install命令。 默认情况下,所有上面列出的所依赖的东西并不需要,除为了OpenCV和构建JavaCPP的C++编译器(命令行选项可以通过javacpp.options传递,Maven的特性,如那些Android平台需要的)。进一步详情,请参阅pom.xml文件中的注释。

请告诉我你对代码做的更新或修正,让我可以将它们集成到下一版本中。 谢谢!如果您使用软件时遇到任何问题,欢迎在邮件列表页随时提问!我相信它还远远不够完善......

OpenCV和FFmpeg的快速入门

首先,把JavaCVjavacpp.jarjavacv.jarjavacv-*.jar ),OpenCVOpenCV- 2.4.5*.jar ),FFmpeg( ffmpeg-1.2*.jar所有JAR文件路径加到CLASSPATH中。 或把你的pom.xml文件指向Maven仓库http://maven2.javacv.googlecode.com/git/ ,并确保FFmpeg和OpenCV的库文件*.so*.dylib ,或*.dll )可以在无论是他们的默认安装目录还是系统库的路径PATH中找到,在Windows中也包括当前的工作目录。 (获取在Windows平台上经常遇到的与OpenCV相关的问题答案,请参阅在Windows 7中OpenCV的常见问题)。这里是在通常情况下一些更具体的说明:

NetBeans(Java SE的6或7):

  1. 在“项目”窗口中,右键单击您的项目的“库”,然后选择“添加JAR /文件夹...”。
  2. 找到JAR文件,选择它们,然后单击“确定”。

Eclipse(JavaSE 6或7):

  1. 导航项目>属性> Java创建路径>库,然后单击“添加外部JAR...”。
  2. 找到JAR文件,选择它们,然后单击“确定”。

Eclipse(Android2.2或更高版本):

  1. 按照此页面上的指示: http://developer.android.com/training/basics/firstapp/
  2. 转到文件>新建>文件夹,选择你项目的父文件​​夹,输入“libs/armeabi”作为文件夹名,然后单击“完成”。
  3. 复制javacpp.jarjavacv.jar到新创建的“libs”文件夹。
  4. javacv-android-arm.jar,opencv-2.4.5-android-arm.jar和 ffmpeg-1.2-android-arm.jar中的所有*.so文件直接解压到新创建的“libs/armeabi”文件夹,在JAR文件中没有任何创建的子目录。
  5. 导航项目>属性> Java创建路径>“库”,然后单击“添加JAR文件...”。
  6. 从新创建的“libs”文件夹中选择javacpp.jarjavacv.jar

在那之后,OpenCV和FFmpeg的封装类可以自动访问它们的C/C++ API:

  • OpenCV的文档
  • FFmpeg的文档

类的定义基本是在C原始头文件中的Java端口,加上缺少的功能,只能通过暴露的OpenCV的C++ API,我特意决定保持尽可能多的原始语法。例如,这是一个试图加载图像文件,平滑处理后保存到磁盘的方法:

[java]  view plain copy
  1. import static com.googlecode.javacv.cpp.opencv_core.*;
  2. import static com.googlecode.javacv.cpp.opencv_imgproc.*;
  3. import static com.googlecode.javacv.cpp.opencv_highgui.*;
  4. public class Smoother {
  5. public static void smooth(String filename) {
  6. IplImage image = cvLoadImage(filename);
  7. if (image != null) {
  8. cvSmooth(image, image, CV_GAUSSIAN, 3);
  9. cvSaveImage(filename, image);
  10. cvReleaseImage(image);
  11. }
  12. }
  13. }

JavaCV还带有建立在OpenCV和FFmpeg之上的辅助类和方法,以方便把他们集成到Java平台。 这里是一个小演示程序来演示最常见的有用部分:

[java]  view plain copy
  1. import java.io.File;
  2. import java.net.URL;
  3. import com.googlecode.javacpp.Loader;
  4. import com.googlecode.javacv.*;
  5. import com.googlecode.javacv.cpp.*;
  6. import static com.googlecode.javacv.cpp.opencv_core.*;
  7. import static com.googlecode.javacv.cpp.opencv_imgproc.*;
  8. import static com.googlecode.javacv.cpp.opencv_calib3d.*;
  9. import static com.googlecode.javacv.cpp.opencv_objdetect.*;
  10. public class Demo {
  11. public static void main(String[] args) throws Exception {
  12. String classifierName = null;
  13. if (args.length > 0) {
  14. classifierName = args[0];
  15. } else {
  16. URL url = new URL("https://raw.github.com/Itseez/opencv/master/data/haarcascades/haarcascade_frontalface_alt.xml");
  17. File file = Loader.extractResource(url, null, "classifier", ".xml");
  18. file.deleteOnExit();
  19. classifierName = file.getAbsolutePath();
  20. }
  21. // Preload the opencv_objdetect module to work around a known bug.
  22. Loader.load(opencv_objdetect.class);
  23. // We can "cast" Pointer objects by instantiating a new object of the desired class.
  24. CvHaarClassifierCascade classifier = new CvHaarClassifierCascade(cvLoad(classifierName));
  25. if (classifier.isNull()) {
  26. System.err.println("Error loading classifier file \"" + classifierName + "\".");
  27. System.exit(1);
  28. }
  29. // The available FrameGrabber classes include OpenCVFrameGrabber (opencv_highgui),
  30. // DC1394FrameGrabber, FlyCaptureFrameGrabber, OpenKinectFrameGrabber,
  31. // PS3EyeFrameGrabber, VideoInputFrameGrabber, and FFmpegFrameGrabber.
  32. FrameGrabber grabber = FrameGrabber.createDefault(0);
  33. grabber.start();
  34. // FAQ about IplImage:
  35. // - For custom raw processing of data, getByteBuffer() returns an NIO direct
  36. //   buffer wrapped around the memory pointed by imageData, and under Android we can
  37. //   also use that Buffer with Bitmap.copyPixelsFromBuffer() and copyPixelsToBuffer().
  38. // - To get a BufferedImage from an IplImage, we may call getBufferedImage().
  39. // - The createFrom() factory method can construct an IplImage from a BufferedImage.
  40. // - There are also a few copy*() methods for BufferedImage<->IplImage data transfers.
  41. IplImage grabbedImage = grabber.grab();
  42. int width  = grabbedImage.width();
  43. int height = grabbedImage.height();
  44. IplImage grayImage    = IplImage.create(width, height, IPL_DEPTH_8U, 1);
  45. IplImage rotatedImage = grabbedImage.clone();
  46. // Objects allocated with a create*() or clone() factory method are automatically released
  47. // by the garbage collector, but may still be explicitly released by calling release().
  48. // You shall NOT call cvReleaseImage(), cvReleaseMemStorage(), etc. on objects allocated this way.
  49. CvMemStorage storage = CvMemStorage.create();
  50. // The OpenCVFrameRecorder class simply uses the CvVideoWriter of opencv_highgui,
  51. // but FFmpegFrameRecorder also exists as a more versatile alternative.
  52. FrameRecorder recorder = FrameRecorder.createDefault("output.avi", width, height);
  53. recorder.start();
  54. // CanvasFrame is a JFrame containing a Canvas component, which is hardware accelerated.
  55. // It can also switch into full-screen mode when called with a screenNumber.
  56. // We should also specify the relative monitor/camera response for proper gamma correction.
  57. CanvasFrame frame = new CanvasFrame("Some Title", CanvasFrame.getDefaultGamma()/grabber.getGamma());
  58. // Let's create some random 3D rotation...
  59. CvMat randomR = CvMat.create(3, 3), randomAxis = CvMat.create(3, 1);
  60. // We can easily and efficiently access the elements of CvMat objects
  61. // with the set of get() and put() methods.
  62. randomAxis.put((Math.random()-0.5)/4, (Math.random()-0.5)/4, (Math.random()-0.5)/4);
  63. cvRodrigues2(randomAxis, randomR, null);
  64. double f = (width + height)/2.0;        randomR.put(0, 2, randomR.get(0, 2)*f);
  65. randomR.put(1, 2, randomR.get(1, 2)*f);
  66. randomR.put(2, 0, randomR.get(2, 0)/f); randomR.put(2, 1, randomR.get(2, 1)/f);
  67. System.out.println(randomR);
  68. // We can allocate native arrays using constructors taking an integer as argument.
  69. CvPoint hatPoints = new CvPoint(3);
  70. while (frame.isVisible() && (grabbedImage = grabber.grab()) != null) {
  71. cvClearMemStorage(storage);
  72. // Let's try to detect some faces! but we need a grayscale image...
  73. cvCvtColor(grabbedImage, grayImage, CV_BGR2GRAY);
  74. CvSeq faces = cvHaarDetectObjects(grayImage, classifier, storage,
  75. 1.1, 3, CV_HAAR_DO_CANNY_PRUNING);
  76. int total = faces.total();
  77. for (int i = 0; i < total; i++) {
  78. CvRect r = new CvRect(cvGetSeqElem(faces, i));
  79. int x = r.x(), y = r.y(), w = r.width(), h = r.height();
  80. cvRectangle(grabbedImage, cvPoint(x, y), cvPoint(x+w, y+h), CvScalar.RED, 1, CV_AA, 0);
  81. // To access or pass as argument the elements of a native array, call position() before.
  82. hatPoints.position(0).x(x-w/10)   .y(y-h/10);
  83. hatPoints.position(1).x(x+w*11/10).y(y-h/10);
  84. hatPoints.position(2).x(x+w/2)    .y(y-h/2);
  85. cvFillConvexPoly(grabbedImage, hatPoints.position(0), 3, CvScalar.GREEN, CV_AA, 0);
  86. }
  87. // Let's find some contours! but first some thresholding...
  88. cvThreshold(grayImage, grayImage, 64, 255, CV_THRESH_BINARY);
  89. // To check if an output argument is null we may call either isNull() or equals(null).
  90. CvSeq contour = new CvSeq(null);
  91. cvFindContours(grayImage, storage, contour, Loader.sizeof(CvContour.class),
  92. CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
  93. while (contour != null && !contour.isNull()) {
  94. if (contour.elem_size() > 0) {
  95. CvSeq points = cvApproxPoly(contour, Loader.sizeof(CvContour.class),
  96. storage, CV_POLY_APPROX_DP, cvContourPerimeter(contour)*0.02, 0);
  97. cvDrawContours(grabbedImage, points, CvScalar.BLUE, CvScalar.BLUE, -1, 1, CV_AA);
  98. }
  99. contour = contour.h_next();
  100. }
  101. cvWarpPerspective(grabbedImage, rotatedImage, randomR);
  102. frame.showImage(rotatedImage);
  103. recorder.record(rotatedImage);
  104. }
  105. frame.dispose();
  106. recorder.stop();
  107. grabber.stop();
  108. }
  109. }

  • 上一篇全球的开源镜像站点
  • 下一篇Java Applet中文乱码(显示为方块)的解决方法

JavaCV-学习笔记一相关推荐

  1. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  2. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  3. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  5. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  6. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  7. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  8. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

  9. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

  10. NuGet学习笔记(3) 搭建属于自己的NuGet服务器

    文章导读 创建NuGetServer Web站点 发布站点到IIS 添加本地站点到包包数据源 在上一篇NuGet学习笔记(2) 使用图形化界面打包自己的类库 中讲解了如何打包自己的类库,接下来进行最重 ...

最新文章

  1. 算法------验证回文串
  2. Matlab计时函数的使用
  3. Linux dmidecode备忘
  4. vue-cli-service不是内部或外部命令,也不是可运行的程序
  5. Android底部导航栏的实现(RadioGroup和Fragment结合使用)
  6. 前端js获取本项目的项目根地址
  7. RFID资产管理系统解决方案之电动自行车防盗管理-新导智能
  8. 获取公众号关注页面链接
  9. Cannot subclass final class class com.sun.proxy.$Proxy94
  10. cc联盟网-中国最佳电子商务托管平台
  11. 机器学习 (三) k-近邻算法应用-约会网站匹配系统
  12. 我认为还是得学会自己焊接贴片元件,有专门的贴片元件焊接练习板,虽然有SMT,就像无人机要练习飞自稳一样。我们不能什么都靠SMT
  13. 栅栏加密解密的分析和实现
  14. (三)SpringCloud实战之openfeign服务调用
  15. 解决ios设备自带邮箱只能接收邮件不能发送邮件问题的方法
  16. 2020年12月国产数据库排行榜:榜首TiDB 2.7亿融资再破纪录;openGauss晋级十强!
  17. 【process.popen】
  18. php 色色源码,PHP源代码集锦
  19. 小马识途:如何优化小红书笔记排名
  20. “国家反诈中心APP”——手机里的防火墙

热门文章

  1. IOC和DI浅显易懂的理解
  2. 专攻国内实体瘤CAR-T细胞疗法,南京卡提医学获数千万元A轮融资
  3. 英雄联盟英雄信息【python爬虫】
  4. QQ圈子:实名社交的潘多拉魔盒
  5. 定积分求旋转体的体积
  6. 开源协同OA办公平台教程:O2OA服务管理中,接口的调用权限
  7. linux基础01-ip与网卡
  8. 一个葫芦娃的小程序,爷青回!
  9. Forbidden (#403)You are not allowed to access this page.
  10. 手机中的传感器:重力感应器、加速度传感器、陀螺仪、电子罗盘和光线距离感应器