写这篇随笔的原因是因为我用了JavaCV一段时间后项目情况糟透了,可能大家很熟悉OpenCV,也有一部分人熟悉JavaCV,但是我相信真正把JavaCV用到生产上的不是太多。

我参与图片处理项目快一个月了,最初抱着很大兴趣参与这个项目,渐渐的发现这个领域并不太好走。

  • 官网地址

JavaCV:http://bytedeco.org/,https://github.com/bytedeco/javacv

OpenCV:https://docs.opencv.org

  JavaCV据说比OpenCV多封装了很多库,但是目前我都没用到,当时应用JavaCV的理由是不用单独安装OpenCV,不用根据环境进行库的切换,

引入pom文件后则可以直接干活。

  1. <dependency>
  2. <groupId>org.bytedeco</groupId>
  3. <artifactId>javacv-platform</artifactId>
  4. <version>1.5.4</version>
  5. </dependency>
  • JavaCV的不稳定问题

多次仿射结果不一致,我想用JavaCV做仿射变换,缩小图片,发现多次结果不一致,但是用OpenCV就没有这个问题

  1. @Test
  2. public void warpAffine() {
  3. Mat src=imread("D:\\img\\0_7p-1.jpg");
  4. Mat dst = new Mat();
  5. Point2f point2fSrc = new Point2f(3);
  6.  
  7. point2fSrc.position(0).y(0).x(0);//TopLeft
  8. point2fSrc.position(1).y(0).x(src.cols()-1);//TopRight
  9. point2fSrc.position(2).y(src.rows()-1).x(0);//Bottom Left
  10.  
  11. Point2f point2fDst = new Point2f(3);
  12. point2fDst.position(0).y(0).x(0);//TopLeft
  13. point2fDst.position(1).y(0).x(src.cols()/2);//TopRight
  14. point2fDst.position(2).y(src.rows()/2).x(0);//Bottom Left
  15.  
  16. Date date=new Date();
  17. Mat affineTrans2 = opencv_imgproc.getAffineTransform(point2fSrc,point2fDst);
  18. opencv_imgproc.warpAffine(src, dst, affineTrans2, src.size());
  19. System.out.println(new Date().getTime()-date.getTime());
  20. imwrite("D:\\img\\7p-2.jpg", dst);
  21.  
  22. }

结果应为等比缩小一倍,但是右边的图有变形,而且多次结果会不一致。

再看直接用OpenCV javaAPI的结果

  1. @Test
  2. public void test(){
  3.  
  4. System.load("C:\\Program Files\\opencv\\opencv\\build\\java\\x64\\opencv_java410.dll");
  5.  
  6. System.out.println("Welcome to OpenCV " + Core.VERSION);
  7.  
  8. Mat src = Imgcodecs.imread("D:/img/0_7p-1.jpg");
  9. Mat dst = new Mat((src.rows()/2),src.cols()/2,src.type());
  10.  
  11. Point p1 = new Point( 0,0 );
  12. Point p2 = new Point( src.cols() - 1, 0 );
  13. Point p3 = new Point( 0, src.rows() - 1 );
  14.  
  15. Point p4 = new Point( 0, 0);
  16. Point p5 = new Point( src.cols() /2, 0 );
  17. Point p6 = new Point( 0, src.rows() /2);
  18.  
  19. // Point p4 = new Point( src.cols() /2, 0);
  20. // Point p5 = new Point( src.cols() /2, src.rows() /2 );
  21. // Point p6 = new Point( 0, 0);
  22.  
  23. MatOfPoint2f ma1 = new MatOfPoint2f(p1,p2,p3);
  24. MatOfPoint2f ma2 = new MatOfPoint2f(p4,p5,p6);
  25. Date date=new Date();
  26. // Creating the transformation matrix
  27. Mat tranformMatrix = Imgproc.getAffineTransform(ma1,ma2);
  28.  
  29. // Applying Wrap Affine
  30. Imgproc.warpAffine(src, dst, tranformMatrix, src.size());
  31. System.out.println(new Date().getTime()-date.getTime());
  32.  
  33. // Writing the image
  34. Imgcodecs.imwrite("D:/img/bbb.jpg", dst);
  35. }

bbb.jpg图像处理正确,多次执行代码结果一致。

  • 性能对比:

同样的图片放射缩小,基于JavaCV处理时间为174毫秒,OpenCV javaAPI的处理时间为11毫秒,差别接近17倍;

这里我要说明一下,例子不具备普遍性,其它API我没有一个一个的测试,希望对大家有帮助。

  • JavaCV的另外一个多线程并发问题:

我尝试用20个线程压测系统报了一个JVM错误:

  1. #
  2. # A fatal error has been detected by the Java Runtime Environment:
  3. #
  4. # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffec4062738, pid=21668, tid=8404
  5. #
  6. # JRE version: Java(TM) SE Runtime Environment 18.9 (11.0.8+10) (build 11.0.8+10-LTS)
  7. # Java VM: Java HotSpot(TM) 64-Bit Server VM 18.9 (11.0.8+10-LTS, mixed mode, tiered, compressed oops, g1 gc, windows-amd64)
  8. # Problematic frame:
  9. # C [opencv_imgproc430.dll+0x1e2738]
  10. #
  11. # Core dump will be written. Default location: E:\img\hs_err_pid21668.mdmp
  12. #
  13. # If you would like to submit a bug report, please visit:
  14. # https://bugreport.java.com/bugreport/crash.jsp
  15. # The crash happened outside the Java Virtual Machine in native code.
  16. # See problematic frame for where to report the bug.
  17. #

查看mdmp文件:

  1. 转储文件: hs_err_pid21668.mdmp : E:\img\hs_err_pid21668.mdmp
  2. 上次写入时间: 2020/9/16 10:04:42
  3. 进程名称: java.exe : C:\Program Files\Java\jdk-11.0.8\bin\java.exe
  4. 进程架构: x64
  5. 异常代码: 0xC0000005
  6. 异常信息: 该线程尝试读写某个虚拟地址,而它对该地址不具有相应的访问权限。
  7. 堆信息: 存在

查询一番资料并没有找到解决办法,我并不清楚直接用OpenCV JavaAPI是否有同样的问题,如果知道如何解决欢迎留言,感激不尽。

虽然找到了一个缓解问题的方法,是设置JVM参数的-Xmx8g -Xms8g -Xmn4g,20个线程测试一般不出问题,50个并发有一半的概率死掉。

现在我决定用OpenCV重写项目,但愿不会再出现这个问题。

JavaCV与OpenCV的区别和使用中遇到的问题的更多相关文章

  1. EmguCV学习 与opencv的区别和联系

    openCV是因特尔的一个开源的视觉库,里面几乎包含了所有的图像处理的经典算法,并且采用C和少量的C++编写,运行效率很高,对于做图像处理这方面工作的,认识opencv是必须的工作.不过opencv有 ...

  2. 有不少朋友问我Halcon和Opencv的区别?

    Halcon:机器视觉行业里知名的商业视觉库,非开源的,在国内市场份额处于第一,其提供了1500个多个API算子供开发人员使用,有些编程基础的都可以轻松的入门,其调试也是很方便的,断点单步运行,图像变 ...

  3. [转]Android通过NDK调用JNI,使用opencv做本地c++代码开发配置方法

    原文地址:http://blog.csdn.net/watkinsong/article/details/9849973 有一种方式不需要自己配置所有的Sun JDK, Android SDK以及ND ...

  4. javacv

    (看到有很多同学都来看这篇文章,说明可能是有必要的,然后这个写的比较水,所以 如果求干货的话,请移步: http://www.cnblogs.com/letben/p/5885799.html 但是 ...

  5. Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码

    以前写过两个Android开发配置文档,使用NDK进行JNI开发,这样能够利用以前已经写好的C++代码. 前两篇博客地址: http://blog.csdn.net/watkinsong/articl ...

  6. OpenCV读一张图片并显示

    Java 版本: JavaCV 用OpenCV读一张图片并显示.只需将程序运行时的截图回复.如何安装配置创建项目编写OpenCV代码,可参考何东健课件和源代码或其他资源. package com.gi ...

  7. javacv教程文档手册开发指南汇总篇

    本章作为javacv技术栈系列文章汇总 前言 写了不少关于javacv的文章,不敢说精通 ,只能说对javacv很熟悉.虽然偶尔也提交pull request做做贡献,但是javacv包含的库实在太多 ...

  8. 超详细的编码实战,让你的springboot应用识别图片中的行人、汽车、狗子、喵星人(JavaCV+YOLO4)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. Python各类图像库的图片读写方式总结

    最近在研究深度学习视觉相关的东西,经常需要写python代码搭建深度学习模型.比如写CNN模型相关代码时,我们需要借助python图像库来读取图像并进行一系列的图像处理工作.我最常用的图像库当然是op ...

随机推荐

  1. 重回OI的第一篇博客

    太久没学OI了, 代码都不会写了, 先写一篇BFS练练手, 是我太菜了qwq #include<cstdio> #include<queue> #include<iost ...

  2. CAP 3.1 版本发布通告

    前言 今天,我们很高兴宣布 CAP 发布 3.1 版本正式版.同时我们也很高兴的告诉你 CAP 在 GitHub 已经突破了 4000 Star. CAP 3000 Star 还是去年8月份的时候,最 ...

  3. Elasticsearch聚合语句

    聚合的范围是search query过滤出的数据 四种聚合类型: 一.Bucketing 桶聚合,常规的分类然后计算每个分类的文档数量 二.Metric 分类并对一组文档进行sum.avg等数学运算 ...

  4. springboot-遇到的错误

    1.Field userMapper in com.yanan.outjob.controller.SysUserController required a bean of type 'com.yan ...

  5. openvswitch 流表测试 ovs-appctl

    [root@ostack170 ~]# ovs-appctl ofproto/trace br-mirror in_port=,dl_vlan=,dl_src=:ea:cb:5d:e4:ee,dl_d ...

  6. 浅谈Docker(二)

    Docker使用cgroup实现CPU,内存和磁盘IO等系统资源的限制. CPU Docker现在有2个与CPU资源相关的参数,-c可以指定CPU的占比,--cpuset可以绑定CPU.例如,指定容器 ...

  7. Ubuntu 下查看CPU 信息命令

    from: http://hi.baidu.com/hermitinhistory/blog/item/ce64d5fb6b23b71b6d22eb95.html 查看当前操作系统内核信息 uname ...

  8. Flink启动脚本改造--制作适用于CDH的Flink parcel包

    #!/usr/bin/env bash ################################################################################ ...

  9. Git-commit-中添加表情

    git commit 中使用表情 我们经常可以在github上看到国外大佬的commit信息中有很多可爱的表情,这是怎么做到的呢? ok,可以这样使用哦:git commit -m '提交信息 :em ...

  10. IDEA下Maven项目搭建踩坑记----2.项目编译之后 在service层运行时找不到 com.dao.CarDao

    项目写的差不多 想运行一下,然后发现运行到Service层的时候报错说找不到Dao层文件 ,纠结半天之后看了下编译好的项目文件,发现mapper文件下边是空的, 于是就百度找一下原因,结果说是IDEA ...